RETEX Delphi pour Android: Assez négatif
Bjr à tous,
Je vous fais part de mon retour d'expérience en matière de dev Android avec Delphi 10 Sydney
Le projet a été codé avec FreePascal et Lazarus
1. Code en général:
De nombreuses constructions admises en FreePascal ont dû être réécrites:
- Surcharge des opérateurs: a += 1; x ** 2 n'est pas supporté par Delphi
- Les déclarations de couleurs sont différentes. Pour retrouver les habitudes:
Code:
1 2 3 4 5 6 7 8
|
const clSilver = TColor($808080);
const clDefault = clSilver;
const clBlack = System.UITypes.TColorRec.Black;
const clWhite = System.UITypes.TColorRec.White;
const clRed = System.UITypes.TColorRec.Red;
const clBlue = System.UITypes.TColorRec.Blue;
// ***** |
De plus, j'ai dû redefinir des structures comme TPoint:
Code:
1 2 3 4 5 6 7
|
{$IFDEF FMX_ANDROID}
type TPoint = record
x: integer;
y: integer;
end;
{$ENDIF FMX_ANDROID} |
Pour le XML, TXMLDocument de Lazarus et TXMLDocument de Delphi sont sensiblement différents
La gestion des fichiers est ch*** : ici, obtenir le dossier de travail utilisé par GHTopo
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
function GetGHTopoDirectory(): TStringDirectoryFilename;
const GHTOPODROID_DIRECTORY = 'GHTopoDroid';
var
EWE: string;
begin
{$IFDEF FMX_ANDROID}
EWE := System.IOUtils.TPath.GetSharedDocumentsPath() + PathDelim +
GHTOPODROID_DIRECTORY;
PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE),
JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE )
],
procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
begin
ForceDirectories(EWE);
end);
Result := EWE + PathDelim;// + PathDelim;
{$ELSE FMX_ANDROID}
Result := ExtractFilePath(Application.ExeName);
{$ENDIF FMX_ANDROID}
end; |
Conversion en nombre réel sécurisée et insensible au point décimal. Source d'agacement +++ . J'ai écrit une fonction dédiée
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
// convertir en nombre des valeurs de type 123 456 789.10 ou 1245-45785
{$IFDEF FMX_ANDROID}
function ConvertirEnNombreReel(const S: string; const Default: double; const DoDebug: boolean = false): double;
var
ST: String;
i , Nb: integer;
PosDecimalPoint: integer;
NbDecimales: integer;
R: Extended;
F: double;
begin
Result := default;
ST := Trim(s); // on nettoie la chaîne : ST devient: "1 234,456 789"
if (ST = '') then exit(default); // Chaîne vide ? Sortie avec Default
ST := StringReplace(ST, ' ', '', [rfIgnoreCase, rfReplaceAll]); // suppression des espaces. : ST devient: "1234,456789"
if (ST = '') then exit(default); // On reteste: Chaîne vide ? Sortie avec Default
ST := StringReplace(ST, ',', '.', [rfIgnoreCase, rfReplaceAll]); // et remplacement par un point décimal : ST devient: "1234.456789"
PosDecimalPoint := Pos('.', ST); // recherche du point décimal : PosDecimalPoint vaut 5;
if (PosDecimalPoint = 0) then // Pas de point ? on convertit en réel et on sort : Condition non remplie
begin
try
exit(StrToFloat(ST));
except
exit(Default);
end;
end;
NbDecimales := Length(ST) - PosDecimalPoint; // Recherche du nb de décimales. Peut être nul : Length vaut 11, NbDecimales vaut 6
ST := StringReplace(ST, '.', '', [rfIgnoreCase, rfReplaceAll]); // On supprime le point décimal : ST devient: "1234456789"
try
R := StrToFloat(ST); // et on convertit en REEL : R vaut 1234456789.0
F := IntPower(10, NbDecimales); // On calcule le diviseur : F vaut 10**6 = 1 000 000
Result := R / F; // qui va diviser R pour aboutir au résultat demandé: Result vaut 1234.456789
except
exit(Default);
end;
end; |
2. Composants FMX:
Aucune possibilité de changer les couleurs d'un composant sans passer par la lourdeur des styles. Agaçant ++++ . Si je veux un Editbox avec un fond jaune et son voisin avec un fond bleu, c'est que j'ai une raison. J'ai horreur des oeillères et de la complexité abusive.
Pour le composant TBluetoothLE en une phrase, en me mettant dans la peau d'un recetteur: Ne fonctionne pas.
Pour les boites de dialogue: Seul ShowMessage() fonctionne bien. Tous les autres, c'est la galère ++++ . Inadmissible vu le caractère basique et récurrent de ces dialogues.
Pour le dessin sur un canevas: Je n'arrive à rien, y compris en dessinant sur le canevas d'un TPanel appelé pnlPlan:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
procedure TTabbedForm.pnlPlanPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
var
RC: double;
BG: TColor;
begin
//if (FDocTopoOpenedAndReady) then BG := FVueBackground else
BG := clRed;
try
AfficherMessage(format('redessin %d %d', [pnlPlan.Canvas.Width, pnlPlan.Canvas.Height]));
with pnlPlan.Canvas do
begin
BeginScene;
AfficherMessage('beginscene');
Stroke.Kind := TBrushKind.Solid;
Stroke.Color := BG;
Stroke.Thickness := 1;
Fill.Kind := TBrushKind.bkSolid;
Fill.Color := BG;
DrawLine(PointF(0, 0), PointF(pnlPlan.Width, pnlPlan.Height), 100.0);
AfficherMessage(format('redessin %f %f', [pnlPlan.Width, pnlPlan.Height]));
EndScene;
AfficherMessage('endscene');
end;
finally
end;
end; |
3. EDI et éditeur:
Par rapport à Lazarus, D10 est très en retrait:
- Dans un .inc, la complétion de code ne fonctionne pas
- Le Ctrl+J après sélection dans Lazarus, qui permet de renommer d'un coup des mots, n'existe pas
- Le Ctrl+Maj+C de Lazarus dans le corps d'une fonction au droit d'une variable, qui la déclare dans la section var, n'existe pas non plus
Form designer:
- Pas d'indicateur d'alignement. Avec Lazarus, lors qu'on approche un contrôle à la verticale d'un autre, une ligne d'alignement apparaît
A suivre vu l'heure ...