Sol-black4003
Tipps

Tipps für App-Entwickler

Tipps
Installation

Nach Meinung des Delphi-Supports sollte der Username für Android-Anwendungen keine deutschen Umlaute (z.B. nicht wie bei Jörg Müller) enthalten. Daher sollte Delphi installiert werden unter einem Benutzer, dessen Name keine deutschen Umlaute enthält.
Demos sind nach der Installation zu finden in
C:\Users\Public\Documents\RAD Studio\10.0\Samples
C:\Users\Public\Documents\RAD Studio\12.0\Samples
C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples

Emulatoren

Programme können auf Emulatoren getestet werden - falls sie auf dem Computer laufen. Dazu ist ein leistungsstarker Rechner notwendig, insbesondere mit einem leistungsstarken Grafik-Interface.
XE5:
Den Android-Emulator findet man unter "C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-20130522\sdk\tools\emulator.exe" Wenn eine ungewöhliche Reaktion des Android-Emulators erscheint, lösche alle Prozesse „adb.exe“ im Taskmanager. Manchmal ist es notwendig, d ie Entwicklungsumgebung neu zu starten. Empfehle zum Aufruf des Emulators folgende Batchdatei "C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs \adt-bundle-windows-x86-20130522\sdk\tools\emu.bat" mit dem Text @echo off emulator.exe @rsxe5_android -gpu on Dadurch wird die „Host GPU“ eingebunden. Dies erhöht die Leistungsfähigkeit des Emulators.
XE6/XE7:
Den Android-Emulator findet man unter "C:\Users\Public\Documents\ Embarcadero\Studio\14.0\PlatformSDKs\adt-bundle-windows-x86-20131030\ sdk\tools\emulator.exe" Falls Emulator nicht betriebsbereit (rsxe5_android dauerhaft mit roten Kreuz), dann alten Emulator aus XE5 starten oder neuen Emulator erstellen: Mit Start->Alle Programme->Embarcadero Rad Studio XE6-> Android SDKs ->Android AVD Manager Karteikarte Android Virtual Devices, dann rechts „New“ und z.B. eingeben: AVD Name: nexus_one, Device: Nexus One, Target: Android 4.4 – API-Leverl 19. Möglichst auch untern „Use Host GPU“ ankreuzen. Dadurch wird die „Host GPU“ eingebunden. Dies erhöht die Leistungsfähigkeit des Emulators. Dann starten. Falls der Emulator erfolgreich gestartet wird und die App erfolgreich auf diesem Ziel angekommen ist, kann noch die Fehlermeldung kommen: „Unfortunately (Appname) has stopped.“ Für diesen Fall kann momentan noch kein Tipp gegeben werden.

Ablaufschwierigkeiten

Delphi XE5, XE6, XE7 Apps laufen nicht auf Samsung Galaxy Ace GT-S5830 mit Android 2.2. Das Smartphone hat keinen ARM v6 processor und keinen NEON support.
Delphi XE5 Firemonkey Apps laufen mit Zielplattform Android zunächst nicht bei HP Computern, HP (z. B. Hewlett Packard Pavilion) Computer eine Umgebungsvariable „PLATFORM“ setzen, welche das Problem mit dem Build System, das Delphi benutzt, hat. Man kann sie außer Kraft setzen – und zwar innerhalb der Delphi XE5 Entwicklungsumgebung: 1. Gehe zu Tools / Optionen / Umgebungsoptionen 2. Wähle Umgebungsvariablen 3. Klicke auf „Neu“ 4. Setze den Namen PLATFORM und lasse den Wert leer. Bei Delphi XE6 und XE7 gibt es kein entsprechendes Problem.

Anschluss eines Smartphones über USB-Stick

Es muss am Smartphone „USB-Debugging“ eingeschaltet sein. Dies ist bei Android JellyBean und Kitkat ausgeschaltet. Dann müssen die Developer Optionen eingeschaltet sein:
http://docwiki.embarcadero.com/RADStudio/XE5/en/Enabling_USB_Debugging_on_an_Android_Device
Das heißt: Einstellungen->Optionen->Geräteinformationen->Build-Nummer sechsmal antippen, damit die Entwickleroptionen zugreifbar werden, dann unter Einstellungen->Optionen->Entwickleroptionen->USB-Debugging Option einschalten und auch auch „Wach bleiben“ einschalten. Wird das Smartphone nicht erkannt, muss vorher der Treiber installiert werden, siehe z.B.
1. Erkennung von Motorola „Moto G" XT1032 mit Android 4.4.2. USB Treiber
https://motorola-global-portal.custhelp.com/app/answers/detail/a_id/88481/action/auth
2. Erkennung von Samsung „S4“ GT-I9505 mit Android 4.4.2. USB Treiber: Treiber installiert sich auf Bedarf selbst, sonst "Samsung Kies" installieren. Erkennt dann auch Samsung Galaxy Tab 2 als Tablet GT-P3110
3. Erkennung von LG L90 mit Android 4.4.2. USB Treiber
http://www.lg.com/de/service-mobil-telefon/lg-L90

Zeichenketten (strings) in Windows- und Android- und iOS-Anwendungen

Der Compiler behandelt Zeichenketten unter Win32 und Win64 anders als unter Android und iOS. In Win32/64 erhält man einzelne Zeichen der Variable Text mit dem Wert „Hallo“ wie folgt: Text[1] ist „H“, Text[2] ist „a“, Text[5] ist „o“, Text[0] ist 5 (die Länge des Textes). Ebenso liefert length(Text) das Ergebnis 5. In Android erhält man einzelne Zeichen der Variable Text mit dem Wert „Hallo“ wie folgt: Text[0] ist „H“, Text[1] ist „a“, Text[4] ist“o“,. Es liefert length(Text) das Ergebnis 5.
Also Text 'Hallo':
Windows #5 H a l l o
Android H a l l o #0
array of char H a l l o  
Mit folgenden Funktionen und Deklarationen kann in beiden Fällen gearbeitet werden:

type tCharArr = array of char; // dynamisches Array von 0 bis length( )-1
var CharArr : tCharArr;

function StrToArr(Text:string):tCharArr;
var i:integer;
begin
  Text:= #31+Text+#31;
  Setlength(Result,0);
  for i:=1 to length(Text)-1 do
   if not (Text[i] in [#0,#31]) then begin
    Setlength(Result,length(Result)+1);
    Result[High(Result)]:= Text[i];
  end;
end;

function ArrToStr(CharArr:tCharArr):string;
var i:integer;
begin Result:='';for i:=0 to length(CharArr)-1 do Result:= Result+CharArr[i] end;

procedure aLeeren(var CharArr:tCharArr );
begin setLength(CharArr,0); end;

function aPos(Z:char;CharArr:tCharArr):integer;
var i:integer;
begin
  Result:= -1;
  if length(CharArr)>0 then begin
   i:=0;
   while (i<length(CharArr)-1) and (upcase(CharArr[i])<>upcase(Z)) do inc(i);
   if upcase(CharArr[i]) = upcase(Z) then Result:=i;
 end;
end;

function acopy(CharArr:tCharArr;Pos,Anzahl:integer):tCharArr;
var i,l:integer;
begin
  l:= length(CharArr);
  setLength(Result,0);
  for i:= Pos to min(Pos+Anzahl-1, l-1) do begin
    setLength(Result,length(Result)+1);
    Result[High(Result)]:= CharArr[i];
  end;
end;

procedure aInsert(TeilCharArr:tCharArr;var CharArr:tCharArr;Pos:integer);
var i,l,lTeil:integer;
begin
  l:= length(CharArr); lTeil:= length(TeilCharArr);
  if (Pos>=0) and (Pos<=l) then begin
   setLength(CharArrl,l+lTeil);
   for i:=l-1 downto Pos do
    CharArr[i+lTeil]:= CharArr[i];
    for i:= Pos to Pos+lTeil-1 do CharArr[i]:=TeilCharArr[i-Pos];
   end;
end;

procedure aDelete(var CharArr:tCharArr;Pos,Anzahl:integer);
var i,l:integer;
begin
  l:= length(CharArr);
  if (Pos>=0) and (Pos<=l-1) and (Anzahl>0)and (Pos+Anzahl<=l) then begin
   for i:=Pos to l do
    if i+Anzahl <= l then begin
     CharArrl[i]:= CharArr[i+Anzahl];
    end;
   setlength(CharArr,max(Pos,l-Anzahl));
  end;
end;

Webbrowser

Ein Webbrowser existiert für Firemonkey unter Android und iOS – nicht jedoch unter Win32 und Win64. Folgende bedingte Compilierung ist möglich:
uses
{$IFDEF ANDROID}
  FMX.WebBrowser.Android,
{$ENDIF ANDROID}
{$IFDEF IOS}
  FMX.WebBrowser.iOS,
{$ENDIF IOS}
  FMX.Platform;
Text bekommt man lokal auf dem Smartphone über eine Datei wie folgt in den Webbrowswer:
   uses System.IOUtils
   Memo1.Lines.SaveToFile(TPath.GetDocumentsPath + '/test.html');
   WebBrowser1.URL := 'file://' + TPath.GetDocumentsPath + '/test.html';
Wenn der Cache nicht benutzt werden soll, setzt man
   WebBrowser1.EnableCaching:= false;

Debug und Release

Um eine App im Google-Store anzubieten oder mit Zertifikat zu versehen, muss die Build-Konfiguration „Release“ gewählt werden. Außerdem ist unter Zielplattform eine Android-Zielplattform zu wählen und die Konfiguration auf „Anwendungs-Store“ einzustellen. Dann kann mit einem rechten Mausklick auf „Build-Konfigurationen“ oder auf den Unterpunkt „Release“ der Menüpunkt „Bearbeiten“ gewählt werden. In dem sich öffnenden Fenster „Projektoptionen“ wird im linken Fenster auf „Bereitstellung“ geklickt und ein neuer Keystore angelegt. Die Datei (z.B. „key6.keystore“) sollte die Endung keystore haben und im Verzeichnis
"C:\Users\Benutzername\AppData\Roaming\Embarcadero\BDS\12.0" bei Delphi XE5 oder
"C:\Users\Benutzername\AppData\Roaming\Embarcadero\BDS\14.0" bei Delphi XE6 oder
"C:\Users\Benutzername\AppData\Roaming\Embarcadero\BDS\15.0" bei Delphi XE7
gespeichert. (Manchmal ist die Datei versehentlich unter "C:\users" zu finden und besitzt keine Endung. Bringt man sie ins Verzeichnis "C:\Users\Benutzersname\AppData\Roaming\Embarcadero\BDS\12.0" und hängt die Extension ".keystore" an, läuft die Compilation. Neben dem Debug-Ordner wird nun ein Release-Ordner im Verzeichnis der Anwendung erstellt. So findet man dort den Ordner „android“ mit den Unterordnern „Debug“ und „Release“. Dort wiederum findet man unter dem Namen der Anwendung im Ordner „bin“ die erstellte App. Sie hat die Endung „.apk“ . Eine (sehr späte) Fehlermeldung von Android erscheint z.B., wenn man für die Anwendung unter Projektoptionen -> (links) Anwendung -> (rechts oben) 32-Bit-Windows-Plattform kein Icon eingegeben hat.

Bereitstellen einer App (apk-Datei ) zum Download auf einer eigenen Homepage

Damit der Download gelingt, muss auf dem Server der MIME-Typ durch die Anweisung "AddType application/octet-Stream apk" für den Download freigegeben werden.

Bilder und Symbole

Bilder sollten als png-Datei abgespeichert werden. Sie können im IDA-Bildeditor erstellt werden. Es kann kostenlos von
http://www.birgin.de/de/produkte/preise-kaufen
heruntergeladen werden. Auch Startprogrammsymbole als png-Datei erstellen in den Größen 36x36, 48x48, 72x72, 96x96, und 144x144. Alle Größen müssen vorhanden sein. Aus einer Bildgröße lassen sich die anderen (unscharf) unter http://makeappicon.com erstellen.

Apps Lauftest

Apps kann man unter https://www.apkudo.com/developers.html testen lassen, auf welchen Smartphones sie laufen. Dazu "get startet" wählen.

Styles

Zunächst einmal kann man nur bei wenigen Steurelemanten im Objektinspektor Schriftfarbe, Hintergrundfarbe und ähnliches ändern. Dafür ist folgendes möglich: Einbau eines Stylebook-Elements aus der Toolpalette unter Standard ins Formular. Im Objektinspektor des Formulars muss nun unter Stylebook das Objekt „Stylebook1“ gewählt und somit eingetragen werden. Doppeltes Anklicken des Stylebook-Steuerelements liefert nun einen Designeditor. Nun kann man z.B. Bereits vorinstallierte Styles laden und dabei auch die einzelnen Elemente ändern. Vorhandene Styles sind je nach Installation in einem der Ordner
C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\Redist\styles\Fmx
C:\Program Files (x86)\Embarcadero\Studio\14.0\Redist\styles\Fmx
C:\Program Files (x86)\Embarcadero\Studio\15.0\Redist\styles\Fmx
zu finden. Man kann sie ins Anwendungsverzeichnis kopieren. Dann im Styleeditor auf Laden klicken und einen Style auswählen. Vorhandene Styles sind Air, Amakrits, AquaGraphite, Blend, Dark, GoldenGraphite, Light, MetropolisUIBlack, MetropolisUIBlue, MetropolisUIDark, MetropolisUIGreen, RubyGraphite und Transparent. Nun kann das Aussehen einzelner Steuerelemente verändert und somit ein abgeänderter Style erzeugt werden. Dieser kann unter einem eigenen Namen abgespeichert werden. Wenn das Aussehen nun im Formular erscheinen soll, auf „Übernehmen“ klicken. Zurück zum Formular kommt man durch Anklicken der unten liegenden Karteikarten „Code“ und „Design“.

Fehler bei der Installation bei Debug und Release

Falls erscheint:
"Prozess kann nicht erzeugt werden" oder
" ... apk kan nicht erzeugt werden" oder
"Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]",
kann es sein, dass die App schon installiert wurde (möglicherweise von einer Vorgänger-Version der aktuellen Version von Delphi oder von einem anderen Computer mit einem anderen keystore).
Dann
- für den Debug-Modus einstellen: Start -> Parameter, dann unter Parameter „-cleaninstall“ (ohne Anführungszeichen) eingeben,
- für den Release-Modus die App vorher auf dem Smartphone deinstallieren.

Eigene Smartphone-Ansicht in Delphi XE7

Wer bei der Programmierung in Delphi XE7 ein eigenes Smartphone-Layout haben möchte, kann eine eigene Smartphone-Ansicht erstellen. Siehe dazu:
http://docwiki.embarcadero.com/RADStudio/XE7/de/Hinzufügen_einer_angepassten_Ansicht_zur_Ansichtsauswahl

Verschiedenes

Aufschlagen der ersten Karteikarte (TabItem1) durch
   TabControl1.First(TTabTransition.Slide);

In einem TabControl mit der HardwareBack-Taste zurückblättern, dann erst beim ersten TabItem schließen
   procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
     Shift: TShiftState);
     begin
       case Key of
       vkHardwareBack:
         if TabControl1.ActiveTab = TabItem2 then
         begin TabControl1.Previous; Key:=0 end;
     end;
   end;

Bei einem Editfeld mit der Returntaste zum nächsten Editfeld
   procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
     Shift: TShiftState);
   begin
     if Key = vkReturn then begin
       Key := vkTab;
       KeyDown(Key, KeyChar, Shift);
     end;
   end;

Bei einem Edit-Objekt nur Kommazahlen zulassen:
   Edit1.FilterChar := '0123456789,.';

Ein StringGrid erst beim Ablauf auf "align=Client" stellen:
   StringGrid1.Align:= FMX.Types.TAlignLayout.Client;

Keyboard aus(Einblendung der Tastatur ausschalten)
   VKAutoShowMode := TVKAutoShowMode.never; (in FMX.Types)
Keyboard ein (Einblendung der Tastatur ausschalten)
   VKAutoShowMode := TVKAutoShowMode.always; (in FMX.Types)

Bedingtes Compilieren erfolgt wie in diesem Beispiel
   const Version = 2; // 1=Stringversion 2=Arrayversion
  {$IF Version = 1 }
     uses FunkCls;
  {$IFEND}
  {$IF Version = 2 }
     uses aFunkCls, AppStringTools;
  {$IFEND}