![]() |
$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 |
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. |
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:
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):
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.
Delphi-Quellcode:
Dies Liste muss man nur von Zeit zu Zeit erweitern.
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; |
AW: $IFDEF für Firemonkey
Es gibt eine Reihe von DEFINEs für den Compiler.
![]() * 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. |
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 |
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 10:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz