|
|
|
|
|
|
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.
|
|
|
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.
|
|
|
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}
|
|
|
|
|