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:
De plus, j'ai dû redefinir des structures comme TPoint:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; // *****
Pour le XML, TXMLDocument de Lazarus et TXMLDocument de Delphi sont sensiblement différents
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 {$IFDEF FMX_ANDROID} type TPoint = record x: integer; y: integer; end; {$ENDIF FMX_ANDROID}
La gestion des fichiers est ch*** : ici, obtenir le dossier de travail utilisé par GHTopo
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
2. Composants FMX:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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:
3. EDI et éditeur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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 ...
Partager