AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

$IFDEF für Firemonkey

Ein Thema von JensM · begonnen am 25. Jun 2020 · letzter Beitrag vom 26. Jun 2020
Antwort Antwort
JensM

Registriert seit: 26. Jan 2020
13 Beiträge
 
#1

$IFDEF für Firemonkey

  Alt 25. Jun 2020, 11:04
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 D
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.366 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: $IFDEF für Firemonkey

  Alt 25. Jun 2020, 11:09
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.
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
271 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: $IFDEF für Firemonkey

  Alt 25. Jun 2020, 12:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.127 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: $IFDEF für Firemonkey

  Alt 25. Jun 2020, 14:44
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
757 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: $IFDEF für Firemonkey

  Alt 25. Jun 2020, 20:31
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
  Mit Zitat antworten Zitat
JensM

Registriert seit: 26. Jan 2020
13 Beiträge
 
#6

AW: $IFDEF für Firemonkey

  Alt 26. Jun 2020, 09:27
Vielen Dank für die schnellen Antworten. Denke werde das dann per Laufzeit überprüfen und die ganze Sache so umsetzen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf