Перейти к содержанию
Fire Monkey от А до Я

Ingalime

Пользователи
  • Постов

    354
  • Зарегистрирован

  • Посещение

  • Победитель дней

    5

Активность репутации

  1. Like
    Ingalime отреагировална haword в RAD 11 и Android   
    embarcadero говорят что не надо так делать, только то sdk что идет с дистрибутивом будет 100% работать. 
  2. Like
    Ingalime отреагировална krapotkin в RAD 11 и Android   
    По мне, лучший вариант - скачать Android Studio и там в настройках уже найти SDK manager и установить SDK/NDK в папки, которые лежат на вменяемой глубине.
    Delphi натравить на эти папки в настройках.
    Я делаю так со времен  Seattle и пока не подводила стратегия.
  3. Like
    Ingalime отреагировална alikoder в RAD 11 и Android   
    Студия ставилась без интернета судя по всему, просто укажите sdk вручную, скачав ее с оф сайта.
  4. Like
    Ingalime отреагировална OnePeople в Не добавляется иконка приложения для Android   
    Галочки уберите

  5. Like
    Ingalime отреагировална Александр Алексеев в Как правильно задать разрешения приложению на доступ к файлам?   
    Вроде разобрался:
    В момент показа формы FormShow вызываю метод проверки прав доступа CheckPermissions. А в нём передаётся имя метода, который будет сообщать о результате действий пользователя LocationPermissionRequestResult
    //---------------------------------------------------------------------------
    void __fastcall TForm2::CheckPermissions(TObject *Sender)
    { // Проверка прав доступа
    String READ_EXTERNAL_STORAGE;
    READ_EXTERNAL_STORAGE=JStringToString(TJManifest_permission::JavaClass->READ_EXTERNAL_STORAGE);
    //PermissionsService->DefaultService->RequestPermissions(READ_EXTERNAL_STORAGE);
    DynamicArray<String> permissions;
    permissions.Length = 1;
    permissions[0] = READ_EXTERNAL_STORAGE;
    PermissionsService()->RequestPermissions(permissions,LocationPermissionRequestResult);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::LocationPermissionRequestResult(TObject *Sender, const DynamicArray<String> APermissions, const DynamicArray<TPermissionStatus> AGrantResults)
    { // 2 permissions involved: ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION
    bool LocationPermissionGranted = (AGrantResults.Length == 1) && (AGrantResults[0] == TPermissionStatus::Granted);
    if (LocationPermissionGranted) ;//ShowMessage("User granted permission");
    else {
        if (Lang=="en") ShowMessage("User denied permission!");
        else ShowMessage("Пользователь запретил доступ!");
        Form2->Close();
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm2::FormShow(TObject *Sender)
    {
    // Проверка прав доступа
    CheckPermissions(this);
    }
    //---------------------------------------------------------------------------
     
  6. Like
    Ingalime отреагировална haword в Целевой уровень API   
    новый андроид, новая sdk, новая делфи или с++ билдер )
  7. Like
    Ingalime отреагировална OnePeople в Как правильно задать разрешения приложению на доступ к файлам?   
    Для доступа к памяти вам нужно запросить необходимые разрешения в реальном времени, на форуме куча примеров
  8. Like
    Ingalime отреагировална OnePeople в Целевой уровень API   
    Я не знаю но думаю так по памяти, в AndroidManifest.template: targetSdk=30.
  9. Like
    Ingalime отреагировална Maka в Delphi и Android 12   
    Да, все работает
  10. Like
    Ingalime отреагировална haword в Смещение CANVSa или почему? при печати на принтер   
    то же самое просто ставить развилки в зависимости от ос )
    по винде можно попробовать этот вариант из интернета 
    type TMargins = record Left, Top, Right, Bottom: Double end; procedure GetPrinterMargins(var Margins: TMargins); var PixelsPerInch: TPoint; PhysPageSize: TPoint; OffsetStart: TPoint; PageRes: TPoint; begin PixelsPerInch.y := GetDeviceCaps(Printer.Handle, LOGPIXELSY); PixelsPerInch.x := GetDeviceCaps(Printer.Handle, LOGPIXELSX); Escape(Printer.Handle, GETPHYSPAGESIZE, 0, nil, @PhysPageSize); Escape(Printer.Handle, GETPRINTINGOFFSET, 0, nil, @OffsetStart); PageRes.y := GetDeviceCaps(Printer.Handle, VERTRES); PageRes.x := GetDeviceCaps(Printer.Handle, HORZRES); // Top Margin Margins.Top := OffsetStart.y / PixelsPerInch.y; // Left Margin Margins.Left := OffsetStart.x / PixelsPerInch.x; // Bottom Margin Margins.Bottom := ((PhysPageSize.y - PageRes.y) / PixelsPerInch.y) - (OffsetStart.y / PixelsPerInch.y); // Right Margin Margins.Right := ((PhysPageSize.x - PageRes.x) / PixelsPerInch.x) - (OffsetStart.x / PixelsPerInch.x); end; function InchToCm(Pixel: Single): Single; // Convert inch to Centimeter begin Result := Pixel * 2.54 end; procedure TForm1.Button2Click(Sender: TObject); var Margins: TMargins; begin GetPrinterMargins(Margins); ShowMessage(Format('Margins: (Left: %1.3f, Top: %1.3f, Right: %1.3f, Bottom: %1.3f)', [InchToCm(Margins.Left), InchToCm(Margins.Top), InchToCm(Margins.Right), InchToCm(Margins.Bottom)])); end; а вообще может просто лист не правильно в принтер вставляешь?)
  11. Like
    Ingalime отреагировална OnePeople в Смещение CANVSa или почему? при печати на принтер   
    DialogService: IFMXDialogService;
     FMargin, FMinMargin: TRect;
     FPaperSize: TPointf;
     FUnits: TPageMeasureUnits;
     FOptions : TPageSetupDialogOptions;
    begin

      if TPlatformServices.Current.SupportsPlatformService(IFMXDialogService, DialogService) then
        DialogService.PageSetupGetDefaults(FMargin, FMinMargin, FPaperSize, FUnits, FOptions);
    Text8.Text := FMinMargin.Left.ToString + ' ' + FMinMargin.Top.ToString;
    А так сколько показывает?
  12. Like
    Ingalime отреагировална haword в Смещение CANVSa или почему? при печати на принтер   
    картинка ровная в image1 а на принтере косо? а так тоже криво? 
    Printer.Canvas.DrawBitmap(Image1.Bitmap, RectF(0,0, Image1.Bitmap.Width, Image1.Bitmap.Height) , RectF(0,0, Printer.PageWidth, Printer.PageHeight), 1);  
     
  13. Like
    Ingalime отреагировална snake в THorzScrollBox внутри TVerticalScrollBox, блокирует вертикальную прокрутку   
    так никто не отвечает. приходится искать и выдумывать самому.
    хотя наверняка на эти грабли уже наступали 100500 раз.
    мало того, но я написал как решил проблему сам и попросил "подскажите как сделать правильнее ", т.е. может Вы просто не внимательно читаете
  14. Like
    Ingalime отреагировална slav_z в THTTPClient эмуляция синхронности   
    вообще замораживать пользовательский интерфейс на время запроса плохая идея для любой ОС... но вы же это и хотите? у андроида есть ограничения на запросы в основном потоке приложения, поэтому запрос запустится в отдельном потоке (так сделано в реализации http клиента для андроида "внутри")... поэтому андроид не будет против вызова данной синхронной операции... (см. реализацию THTTPClient.ExecuteHTTP() в модуле System.Net.HttpClient)

    если хотите сделать нормально, то конечно не запускайте http запросы в основном потоке приложения ни под какой OC...
     
     
  15. Like
    Ingalime отреагировална snake в THorzScrollBox внутри TVerticalScrollBox, блокирует вертикальную прокрутку   
    Сделал так - это швах, но работает
    так что сильно не ругайте, лучше таки подскажите как сделать правильнее
    TMyFrame = class(TFrame) .... public Function GetControl(Control:TCustomScrollBox; SrcPoint:TPointF):TControl; .... end; implementation function TMyFrame.GetControl(Control: TCustomScrollBox; SrcPoint:TPointF): TControl; var i:Integer; fm:TFMXObject; vp,tp:TPointF; function GetChildControl(Control:TControl):TControl; var i:Integer; c:TControl; Begin result:=nil; if Control.ChildrenCount > 0 then begin for i:=0 to Control.ChildrenCount-1 do Begin if (Control.Children[i].Name<>'') then Begin c:=TControl(Control.Children[i]); if (c.position.X<tp.X) and ((c.Position.X+c.Width)>tp.X) and (c.position.Y<tp.Y) and ((c.Position.Y+c.Height)>tp.Y) then result:=c; End; if (TControl(Control.Children[i]).ChildrenCount>0) and (result=nil) then result:=GetChildControl(TControl(Control.Children[i])); End; end; End; begin vp:=Control.ViewportPosition; tp.X:=SrcPoint.X+vp.X; tp.Y:=SrcPoint.Y+vp.Y; result:=GetChildControl(Control); end; //узнаем какой контрол под кликом мышки procedure TMyFrame.HorzScrollBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var Point:TPointF; c:TControl; begin Point.X:=X; Point.Y:=Y; c:=GetControl(HorzScrollBox1,point); // if c<>nil Then form1.Debug.Add(c.Name); end; //узнаем какой контрол под тапком procedure TMyFrame.HorzScrollBox1Tap(Sender: TObject; const Point: TPointF); var c:TControl; begin c:=GetControl(HorzScrollBox1,point); // if c<>nil Then form1.Debug.Add(c.Name); end;  
  16. Like
    Ingalime отреагировална OnePeople в Как вместе с программой установить файл базы данных?   
    procedure TForm1.UpdateAsset(AssetName, FilePath: String); var inputStream: JInputStream; FileOutputStream: JFileOutputStream; WData: TJavaArray<Byte>; LData: Integer; begin try InputStream := TAndroidHelper.Context.getAssets.open(StringToJString(AssetName)); except exit; end; try FileOutputStream := TJFileOutputStream.JavaClass.init(StringToJString(FilePath)); except exit; end; WData := TJavaArray<Byte>.Create(4096); repeat try LData := InputStream.read(WData); except LData := -1; end; if LData <> -1 then begin FileOutputStream.write(WData, 0, LData); end; until (LData = -1) or (LData = 0); FileOutputStream.flush; FileOutputStream.close; inputStream.close; end; Обновление файла из assets в папку с программой
    Пользоваться так проверяете при Form.Create что версия новая и вызываете UpdateAsset('internal/base.db', ApplicationPath + 'base.db');
     
     
  17. Like
    Ingalime отреагировална alxsev в [Статья][AdMob] Добавляем рекламный блок в приложение   
    тоже интересует этот вопрос
  18. Like
    Ingalime отреагировална Maka в [Статья][AdMob] Добавляем рекламный блок в приложение   
    Кто-то уже адаптировал код Interstitial рекламы для RadStudio 11? Поделитесь, если не жалко
  19. Like
    Ingalime отреагировална Alex7wrt в [Статья][AdMob] Добавляем рекламный блок в приложение   
    http://www.tahribat.com/forum/android---delphi-xe7-firemonkey-admob-interstitial-204528
  20. Like
    Ingalime отреагировална Andrey Efimov в [Статья][AdMob] Добавляем рекламный блок в приложение   
    Ну, про настройку, вывод и уплату налогов, полно статей в интернете. У меня была цель, описать интеграцию рекламы в приложение, а не общую инструкцию по использованию сайта AdMob.
     
    p.s. Про сервисы Firebase (Analytics, Cloud Messaging и т.д.), ещё не успел рассмотреть эту тему, но в планах есть.
  21. Like
    Ingalime отреагировална OnePeople в Как вместе с программой установить файл базы данных?   
    Можно не писать в startupcopy.pas есть методы обновления ассетов. Самому лень писать))))
    I feel that files that need to be deployed are files that should not and need not be changed by the application. They are resources like images. If an application changes a file, it does so with intent. The user via the developer wanted it that way. Changing it back through an update causes data loss. As a consequence all files that could be subject to change should not be deployed but generated when used.
  22. Like
    Ingalime отреагировална OnePeople в Как вместе с программой установить файл базы данных?   
    Если будете загружать файл в deployment тогда ваша база будет здесь 
    Для remote path: assets\internal
    TPath.Combine(TPath.GetDocumentsPath, 'filename') { Internal } Для remote path: assets
    TPath.Combine(TPath.GetPublicPath, 'filename') { External } Есть же в конце то концов https://docwiki.embarcadero.com/RADStudio/Sydney/en/Creating_an_Android_App#Loading_and_Deploying_Files
  23. Like
    Ingalime отреагировална OnePeople в Removed execute permission for app home directory   
    Это можно
  24. Thanks
    Ingalime отреагировална OnePeople в [Android]Входящий звонок   
    if TJBuild_VERSION.JavaClass.SDK_INT >= 26 then begin playbackAttributes := TJAudioAttributes_Builder.Create .setUsage(TJAudioAttributes.JavaClass.USAGE_MEDIA) .setContentType(TJAudioAttributes.JavaClass.CONTENT_TYPE_MUSIC) .build(); AudioFocusRequest:=TJAudioFocusRequest_Builder(TJAudioManager.JavaClass.AUDIOFOCUS_GAIN).Create .setAudioAttributes(playbackAttributes) .setAcceptsDelayedFocusGain(true) .setOnAudioFocusChangeListener(afChangeListener, afHandler) .build(); res := FAudioManager.requestAudioFocus(AudioFocusRequest); end else begin res := FAudioManager.requestAudioFocus(afChangeListener, TJAudioManager.JavaClass.STREAM_MUSIC, TJAudioManager.JavaClass.AUDIOFOCUS_GAIN); end;  
  25. Like
    Ingalime отреагировална haword в Выполнен захват SQL.   
    Добрый день.
    Чем не понравилось мое решение? Надо просто пробежаться по всем параметрам TFDQuery и в зависимости от типа поля получить значение и сохранить его или поместить в сам запрос. Но помещая его в сам запрос нужно будет конвертировать вручную по типу, особенно даты. 
    Why didn't you like my answer? You just need to loop through all TFDQuery parameters in a loop and, depending on the type of the field, get the value, save it, or put it into the query itself. But placing it in the query itself will need to be converted manually by type, especially the date.
×
×
  • Создать...