IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

RETEX Delphi pour Android: Assez négatif


Sujet :

Composants FMX Delphi

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 296
    Points : 473
    Points
    473
    Billets dans le blog
    2
    Par défaut 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 : 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 ...

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    14 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 14 235
    Points : 38 470
    Points
    38 470
    Billets dans le blog
    59
    Par défaut
    Bonjour,
    Comparer Lazarus à Delphi FMX est assez osé la philosohie n'étant pas identique.
    Comparer FreePascal au Pascal Delphi (je ne sais trop quel nom donner) idem.

    Pour retrouver les habitudes
    Voilà le hic pour la plupart des critiques : les habitudes

    Les déclarations de couleurs sont différentes.
    c'est vrai qu'il est beaucoup plus long d'écrire TAlphaColors. puis que la complétion de code propose une palette plus complète

    2. Composants FMX: Aucune possibilité de changer les couleurs d'un composant sans passer par la lourdeur des styles
    Oui et non, il ne faut pas oublier qu'un composant FMX peut en contenir un autre et même des effets
    pour Android un TRectangle contenant un TEdit, ça s'envisage , pas sous windows . Le hic, je le concède, c'est que l'on n'a aucune notion de couleurs système

    3. EDI et éditeur-
    - 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
    le refactoring existe Maj+Ctrl+E à la place de Ctrl+J, Maj+Ctrl+D pour déclaration, pour une mémoire défaillante (comme la mienne) click droit sur la variable pour menu contextuel puis refactoring et ses options
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 970
    Points : 23 602
    Points
    23 602
    Par défaut
    TPoint c'est dans System.Types.TPoint

    Les lignes bleus pour l'alignement des controles existent en Alexandria : Marges et directives de conception FireMonkey
    Il manque encore la ligne rose pour texte

    Nom : Sans titre.jpg
Affichages : 84
Taille : 70,2 Ko


    a += 1; c'est Inc(a); d'ailleurs, cela ne devrait être a +:= 1; pour respecter la convention pascal historique ?
    x ** 2 je découvre, je suppose que c'est Power(x, 2); ou IntPower(x, 2);, cela fait 25 ans que c'est comme ça, un développeur Delphi ne trouve pas que ça manque, surtout que Power a part bricoler sur le forum et faire de la géométrie, je suis pas sûr d'en trouver un seul dans 25 ans de projet professionel ...
    EDIT: j'en ai trouvé un seul Power, dans le code d'un ancien collègue aux compétences douteuses, un Power(2, 6) et c'est en réalité un 2 shl 5 pour un masque de code d'erreur indiquant par la position de certains bit le niveau de l'erreur


    Cette conversion de Flottant est assez infâme, je suis contre ce genre de pratique fourre-tout ouvrant n'importe quelle donnée.
    Un masque de saisie pour l'utilisateur avec un composant l'aider à écrire un nombre, OK
    Mais pour une donnée venant par exemple d'un service REST, hors de question de gérer des formats farfelues.
    Un manque de connaissance de FormatSettings



    Citation Envoyé par SergioMaster Voir le message
    Citation Envoyé par JP CASSOU Voir le message
    Pour retrouver les habitudes:


    Voilà le hic pour la plupart des critiques : les habitudes
    C'est pour ma part le plus gros reproches que j'ai contre FMX, ça ressemble à du Delphi mais pas vraiment.
    Du coup, tout le monde pense qu'il n'aura aucun effort à faire, non c'est faux !
    FMX doit être considéré comme vraiment différent, c'est un FrameWork différent et presque un langage différent, il faut réfléchir avec plus d'abstraction, se documenter sur Java et Android, sur XCode/Swift et iOS pour comprendre la philosophie des cibles que l'on choisi, je ne fais pas de FMX mais combien de question sont résolus en lisant l'aide (Embarcadero ou Android, personne ne lit la doc Android alors qu'il cible l'OS, c'est dingue) ou en oubliant les mauvaises habitudes de la VCL lié au comportement de Windows avant tout.

    Je pense que se taper du Dev Java, quelques tutoriels sur les couches profondes de Android me semblent être un prérequis d'apprentissage pour connaître l'OS cible comme on le fait depuis 25ans avec Windows.
    Après on fait un choix, soit le projet est fait en Java pour l'unique cible soit on fait le projet en Delphi sans oublier que c'est un langage compilé multi-cible et qu'il faut donc être prudent.

    Possible que fasse du Java pour Windows dans les prochains mois, je vais me faire plaisir avec du JNI pour lier les projets Delphi et Java.
    Et aussi du Delphi Linux pour améliorer les performances (et réduire le cout de Licence Win) surtout dans l'optique de transformer un Service Mégalithique\Monolithique et une myriade de micro-service... avec mon collègue, on commence par le début, Thread et CPU, Gestionnaire de Mémoire (NexusMM vs FastMM), couche TCP et UDP puis ensuite on attaquera les Drivers DB (actuellement en ADO, on pourrait oublier)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2006
    Messages : 624
    Points : 3 450
    Points
    3 450
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Quelques petits compléments aux réponses déjà données.

    Sous Delphi, il me semble que le raccourci clavier pour déclarer une variable est SHIFT+CTL+V.

    Sous Firemonkey, les coordonnées des positions des objets sont définies en flottants (TPointf). Les interfaces graphiques sont en vectoriel ce qui rend aisé le rendu sur différents écrans (résolutions et définitions différentes), de modifier les échelles avec la propriété scale etc.

    Pour ce qui concerne les couleurs de fond des TEdit par exemple, il est possible de préciser pour chaque composant graphique ce qu'il hérite du style. Par défaut, un composant va hériter du style mais via sa propriété StyledSettings on peut choisir ce qu'il va prendre du style.

    Je n'ai pas tenté de dessiner dans un TPanel mais cela devrait être possible. Après il faut savoir qu'il y a des différences entre la VCL et Firemonkey. Par exemple, n'importe quel composant Firemonkey peut en contenir d'autres. On n'est plus obligé de passer par des composants "conteneurs" (TPanel, TGroupBox...) comme en VCL. C'est très pratique. Depuis que j'utilise Firemonkey, je n'utilise plus le TPanel par contre, j'utilise souvent les TLayout afin de rendre mes interfaces "responsives".

    Pour le composant TBluetoothLE, il faudrait un peu plus de détails pour comprendre ce qui ne fonctionne pas.

    Certaines "habitudes" VCL changent avec Firemonkey. Pour moi, maintenant, c'est lorsque je reviens sur un projet VCL que ça me fait bizarre
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2021
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : décembre 2021
    Messages : 115
    Points : 181
    Points
    181
    Par défaut
    Bonjour,

    je comprends les difficultés de JP (Jean-Pierre, Jean-Paul, ... ?) pour les avoir rencontrées... et ne pas avoir réussi d'ailleurs à les surpasser, ma frustration ayant eu raison de mon affection pour Delphi - "Affection" est un euphémisme- et de mes très anciennes 'turbo pascaliennes" habitudes comme dirait Serge.

    Citation Envoyé par ShaiLeTroll Voir le message
    Je pense que se taper du Dev Java, quelques tutoriels sur les couches profondes de Android me semblent être un prérequis d'apprentissage pour connaître l'OS cible comme on le fait depuis 25ans avec Windows.
    Après on fait un choix, soit le projet est fait en Java pour l'unique cible soit on fait le projet en Delphi sans oublier que c'est un langage compilé multi-cible et qu'il faut donc être prudent.
    Je souscris. Même si j'ai abandonné -pas définitivement*- le développement mobile, ma prochaine approche sera d'utiliser directement -donc d'apprendre (surtout du côté d'Android **)- les outils proposés par les concepteurs de ces OS mobiles. J'en suis arrivé à la conclusion que les machines de développement "à tout cibler" ne représentent pas un gain de temps significatif et même d'une manière générale, qu'elles sont très chronophages... alors qu'elles sont de moins en moins simples à utiliser au fur et à mesure qu'évoluent les OS mobiles.

    Par contre -même s'il "date" vraiment- le développement desktop en Lazarus reste performant... mais beaucoup moins complet que ce que procure et permet nativement Qt. Il faut dire que Lazarus a dû rester dogmatiquement longtemps compatible avec Delphi 7 qui n'existait plus. C'est incompatible avec l’évolution nécessaire de modernisation d'un IDE pour répondre aux besoins des clients, voire carrément antinomique. Je ne remets pas en cause l'IDE lui-même mais les composants qu'il contient : ils ont oubliés d'évoluer. Ils sont conceptuellement restés figés dans le temps.

    Cordialement. Gilles

    * en attente notamment de pouvoir utiliser des magasins d’applications alternatifs sur iOS
    ** pour Apple, une solution simple, adaptée, performante... est par exemple "swift"

  6. #6
    Membre expert Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    juin 2013
    Messages
    1 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 677
    Points : 3 153
    Points
    3 153
    Par défaut
    Juste une remarque : ton code de récupération d'un chemin est potentiellement générateur d'erreurs.

    PermissionsService.RequestPermissions est asynchrone, la création du chemin si l'utilisateur est d'accord ne sera pas faite avant que ta fonction retourne le chemin d'accès. Le code pour faire ça proprement sans risque de planter l'application est à modifier si tu ne veux aucune anomalie dans ton projet.

    De plus tu fais le ForceDirectories() même si tu n'as pas eu l'autorisation, c'est bien entendu une source de plantage.

  7. #7
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    1 003
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2003
    Messages : 1 003
    Points : 1 394
    Points
    1 394
    Billets dans le blog
    4
    Par défaut
    La critique est rude. Mais ceci dit je ne suis pas étonné car passer de Lazarus sous windows à Delphi sous Android est un beau challenge. Après l'alternative c'est de refaire le projet avec Android Studio (ou autre) et traduire tout ton code en Java. Bon courage

    Il faut aussi prendre en considération que les contraintes du système android ne sont pas les mêmes que celle de windows.

    Pour ma part j'ai développé déjà plusieurs application android/Mac/Windows et même si j'ai eu pas mal de déboires au début une fois passé l'étape pénible de l'apprentissage le résultat est assez bluffant. Et surtout ça fonctionne bien

    Le système des styles pour FMX peut sembler lourd mais il permet d'avoir une grande souplesse au niveau affichage en fonction de la machine où le code va être exécuté. Ainsi pour ce qui est des alignements des composants graphique il faut oublier la VCL et utiliser les layout et les alignements.

    FMX est multi système donc il doit s'adapter à tout (taille, d'écran résolution, rotation...) c'est un autre monde.

    Par contre je suis d'accord avec le bluetooth pour l'avoir expérimenté ça marche quand ça veut
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  8. #8
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 296
    Points : 473
    Points
    473
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    La critique est rude. Mais ceci dit je ne suis pas étonné car passer de Lazarus sous windows à Delphi sous Android est un beau challenge. Après l'alternative c'est de refaire le projet avec Android Studio (ou autre) et traduire tout ton code en Java. Bon courage

    Il faut aussi prendre en considération que les contraintes du système android ne sont pas les mêmes que celle de windows.

    Pour ma part j'ai développé déjà plusieurs application android/Mac/Windows et même si j'ai eu pas mal de déboires au début une fois passé l'étape pénible de l'apprentissage le résultat est assez bluffant. Et surtout ça fonctionne bien

    Le système des styles pour FMX peut sembler lourd mais il permet d'avoir une grande souplesse au niveau affichage en fonction de la machine où le code va être exécuté. Ainsi pour ce qui est des alignements des composants graphique il faut oublier la VCL et utiliser les layout et les alignements.

    FMX est multi système donc il doit s'adapter à tout (taille, d'écran résolution, rotation...) c'est un autre monde.

    Par contre je suis d'accord avec le bluetooth pour l'avoir expérimenté ça marche quand ça veut
    Cà avance bien, mais il m'a fallu ruser pas mal +++ Tout ce qui est de la mécanique métier interne fonctionne

    Ci-dessous le résultat attendu mais j'ai une difficulté: cette interface doit me permettre de dessiner un croquis et par conséquent afficher la trace éphémère du pointeur (doigt ou souris) lorsque j'active un mode de tracé à main levée. Dois-je créer un TBitmap temporaire ?

    Nom : ghtopodroid_2.png
Affichages : 36
Taille : 1,30 Mo

  9. #9
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    1 003
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2003
    Messages : 1 003
    Points : 1 394
    Points
    1 394
    Billets dans le blog
    4
    Par défaut
    Pas sur d’avoir bien compris le besoin.

    Si l'image du fond évolue peu il peut être intéressant de la dessiner dans une bitmap. Puis lors du dessin final dessiner la bitmap et ensuite le tracé à main levée.

    Pour ce type de tracé il faut regarder du coté des TPath (https://docwiki.embarcadero.com/Libr....Objects.TPath)

    Sinon pour tout ce qui est affichage de dessin dynamique ce que je fais en général (ce n'est peut être pas le mieux) c'est que j'utilise un TImage sur ma fiche.

    Dans le code je créé une bitmap sur laquelle je fais tous mes dessins et ensuite j'assigne cette bitmap au TImage de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     bmp_Fin := FMX.Graphics.TBitmap.Create;
      // Dessin de la carte
      bmp_Fin.Width := XX;
      bmp_Fin.Height := YY;
      bmp_Fin.Canvas.BeginScene();
    /////////////////////////////////////////
    //instruction de dessin.....
    ////////////////////////////////////////
      bmp_Fin.Canvas.EndScene;
      vue.Bitmap.Assign(bmp_Fin);
      bmp_Fin.Free;
    Chaque fois qu'il y a une action qui modifie le dessin, j’appelle cette routine. Ou alors ce que j'ai fait aussi pour une application dans laquelle je recevais des information par le réseau c'est d'appeler cette routine dans un timer réglé à une certaine cadence ce qu rafraichi l'écran régulièrement.

    Dans ton cas l'interception du message onMouveMove te permet de construire le TPath et ensuite il suffit d'appeler la routine de dessin

    Une autre possibilité est de faire un composant graphique (voir mon blog https://delphi.developpez.com/actu/3...log-de-Gouyon/). Ca offre pas mal de possibilités car on maitrise un peu tout mais c'est un peu casse gueule au débbugage
    Il y a des jours où j'éprouve une haine profonde envers microsoft et Apple c'est pas mieux
    Mon modeste site et mes modestes oeuvres sont
    Rémi

Discussions similaires

  1. [Android] [D10.4] StrToFloat retourne toujours zéro
    Par JP CASSOU dans le forum Composants FMX
    Réponses: 5
    Dernier message: 13/01/2023, 11h24
  2. Création App pour Android avec Delphi 10.3
    Par adipie dans le forum Composants FMX
    Réponses: 0
    Dernier message: 29/09/2019, 10h40
  3. Réponses: 2
    Dernier message: 09/06/2015, 19h58
  4. aide pour une application Android (assez facile)
    Par grogz dans le forum Android
    Réponses: 3
    Dernier message: 21/09/2011, 02h58
  5. cherche algos Delphi pour : Huffman, R.S.A, D.E.S.
    Par X-Delphi dans le forum Débuter
    Réponses: 3
    Dernier message: 24/08/2002, 19h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo