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 : 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;
// *****
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
 
{$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 : 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;
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
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 : 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;
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 ...