Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   $IFDEF für Firemonkey (https://www.delphipraxis.net/204750-%24ifdef-fuer-firemonkey.html)

JensM 25. Jun 2020 11:04

$IFDEF für Firemonkey
 
Hallo zusammen,

gibts es eine möglichkeit bei einer Android kompilierung zwischen Geräte zu unterscheiden? Also ich mache ja schon bei einem geräteübergreifendem Formular immer ein {$ifdef android32} rein, wenn es für android kompiliert werden soll. Nun die frage kann man hier nohmal unterscheiden ob es ein Android tablet oder ein android handy ist?

vielen dank im voraus :DD

TiGü 25. Jun 2020 11:09

AW: $IFDEF für Firemonkey
 
Das würde ich dynamisch zur Laufzeit anhand der Geräteparameter lösen.
Man kann doch sicherlich auf irgendeine Art und Weise die Geräteklasse auslesen bzw. selber festlegen anhand Bildschirmgröße, Auflösung und DPI.

philipp.hofmann 25. Jun 2020 12:26

AW: $IFDEF für Firemonkey
 
Hier mal meine Hilfsklasse um zu prüfen, ob ich auf einem Phone oder einem Tablet unterwegs bin.
Als $IFDEF kann dies aber eigentlich nicht funktionieren, du musst deine App ja zur Laufzeit dynamisch auf die Gegebenheiten anpassen.


Delphi-Quellcode:
unit MyDeviceInfo;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Devices,
  FMX.BehaviorManager, System.Math, FMX.Platform, FMX.MultiView;

type
  TMyDeviceInfo = class(TCustomMultiView)
  private
    FDeviceService: IFMXDeviceService;
    function DefineContext: TFmxObject;
    function GetDevice: TDeviceInfo;
  public
    class function isPhoneMode(form:TForm; myFormatSettings:TFormatSettings):boolean;
  end;

implementation

uses MyLog;

function TMyDeviceInfo.DefineContext: TFmxObject;
begin
  if Owner is TFmxObject then
    Result := TFmxObject(Owner)
  else
    Result := Parent;
end;

function TMyDeviceInfo.GetDevice: TDeviceInfo;
var
  DeviceService: IDeviceBehavior;
  Context: TFmxObject;
begin
  if csDesigning in ComponentState then
  begin
    Context := DefineContext;
    if TBehaviorServices.Current.SupportsBehaviorService(IDeviceBehavior,DeviceService, Context)
    then
      Exit(DeviceService.GetDevice(Context));
  end;
  Result := TDeviceInfo.ThisDevice;
end;

class function TMyDeviceInfo.isPhoneMode(form:TForm; myFormatSettings:TFormatSettings):boolean;
var FMyCustomMV : TMyDeviceInfo;
    ThisDevice: TDeviceInfo;
    logStr:String;
begin
  try
    FMyCustomMV := TMyDeviceInfo.Create(form);
    TPlatformServices.Current.SupportsPlatformService(IFMXDeviceService,FMyCustomMV.FDeviceService);
    ThisDevice := FMyCustomMV.GetDevice;
    case ThisDevice.DeviceClass of
      TDeviceInfo.TDeviceClass.Phone:
        begin
          logStr:='Phone ';
          Result:=true;
        end;
      TDeviceInfo.TDeviceClass.Tablet:
        begin
          logStr:='Tablet ';
          Result:=false;
        end;
      TDeviceInfo.TDeviceClass.Desktop:
        begin
          logStr:='Desktop ';
          Result:=false;
        end
      else begin
        logStr:='Unknown ';
        Result:=true;
      end;
    end;
    if (FMyCustomMV.GetOrientation in [TScreenOrientation.Landscape, TScreenOrientation.InvertedLandscape]) then
      logStr:=logStr+'(landscape) '
    else
      logStr:=logStr+'(portrait) ';
    {logStr:=logStr+CurrToStrF(ThisDevice.MinPhysicalScreenSize.Width,ffNumber,1,myFormatSettings)+' ';
    logStr:=logStr+CurrToStrF(ThisDevice.MinPhysicalScreenSize.Height,ffNumber,1,myFormatSettings)+' ';
    logStr:=logStr+CurrToStrF(ThisDevice.MaxPhysicalScreenSize.Width,ffNumber,1,myFormatSettings)+' ';
    logStr:=logStr+CurrToStrF(ThisDevice.MaxPhysicalScreenSize.Height,ffNumber,1,myFormatSettings)+' ';
    logStr:=logStr+IntToStr(ThisDevice.PixelsPerInch)+' ';
    logStr:=logStr+CurrToStrF(ThisDevice.MaxDiagonal*2.54,ffNumber,1,myFormatSettings)+'cm';}
    //mlog.info('Display: '+logStr);
  except on E: Exception do
    begin
      Result:=false;
      //mlog.error('Can´t determine phone mode: '+e.message);
    end;
  end;
end;

end.
Speziell für Android nutze ich noch eine weitere Funktion, weil es gerade bei Tablets relativ viele Amazon-Fire-Tablets gibt und diese ja ein wenig anders ticken (z.B. kein Google-Playstore):

Delphi-Quellcode:
class function TStringUtils.isFireOS():boolean;
begin
  {$IFDEF ANDROID}
    if (pos(JStringToString(TJBuild.JavaClass.MODEL),'KFMAWI,KFMUWI,KFOT,KFTT,KFJWI,KFJWA,KFSOWI,KFTHWA,KFTHWI,KFAPWA,KFAPWI,KFARWI,KFASWI,KFSAWA,KFSAWI,KFTBWI,KFMEWI,KFFOWI,KFGIWI,KFAUWI,KFSUWI,KFKAWI,KFDOWI,SD4930UR')>0) then
      Result:=true
    else
      Result:=false;
  {$ELSE}
    Result:=false;
  {$ENDIF}
end;
Dies Liste muss man nur von Zeit zu Zeit erweitern.

himitsu 25. Jun 2020 14:44

AW: $IFDEF für Firemonkey
 
Es gibt eine Reihe von DEFINEs für den Compiler.
http://docwiki.embarcadero.com/RADSt...erung_(Delphi)
* für Android JA oder NEIN (Anderes Betriebssystem)
* für 32 oder 64 Bit

Aber es gibt natürlich keine DEFINEs für ein bestimmtes Gerät, da im AppStore die selbe APP für meherere Geräte genutzt wird, sich das somit erst zu Laufzeit unterscheidet und der Compiler da noch garnichts wissen kann.

iPhone oder iPad, Hoch oder Querformat, langes Display oder Kurzes, Ultrahochauflösend oder nicht,
das kannst du erst zur Laufzeit prüfen und mit normalen IFs auswerten.

TurboMagic 25. Jun 2020 20:31

AW: $IFDEF für Firemonkey
 
1. Der Tip mit dem TDeviceInfo ist denke ich der richtige. Es gibt dort aber noch mehr Gerätetypen definiert.
Zum Beispiel auch Elf und Dwarf... ;-)

2. Ich würde eher kein Android32 define abfragen, da wir ja inzwischen auch einen 64 Bit Android Compiler haben...
Lieber generischer bleiben. Aber: wie jemand anderes schon schrieb löst ein Define zur Compilezeit nicht
dein Problem.

3. Noch eine mögliche Lösung wäre unterschiedliche GUI Layouts für die jeweiligen Bildschirme zu benutzen
(ich kam bisher immer noch ohne aus) Die kann man über die Liste oberhalb des Formdesigners auswählen.

Grüße
TurboMagic

JensM 26. Jun 2020 09:27

AW: $IFDEF für Firemonkey
 
Vielen Dank für die schnellen Antworten. Denke werde das dann per Laufzeit überprüfen und die ganze Sache so umsetzen. :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz