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

Langage Delphi Discussion :

Creation de composants FMX


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 422
    Points : 323
    Points
    323
    Par défaut Creation de composants FMX
    Bonjour,

    Environnement : Windows 10, Delphi 11.3 Community FMX

    Je me relance dans la création de composants ne trouvant pas quelque chose correspondant à mon besoin.
    La finalité étant une application Android, mais je me heurte à un pb qui est n'est pas lié à FMX je pense mais à moi !!

    Mon composant TListeDefilante est dérivé de TGridPanelLayout. J'en ai fait tourner un sur une form mais en ayant besoin de plusieurs je veux créer un composant à intégrer avec les autres.

    J'ai créé une unité FMX.ListeDefilanteR.pas sur les conseils de Sergio dans un de ses tutos.
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    unit FMX.ListeDefilanteR;
     
    interface
     
    uses
      System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Layouts,
      FMX.StdCtrls, FMX.Objects;
     
    type
      TListeDefilante = class(TGridPanelLayout)
      private
        { Déclarations privées }
      protected
        { Déclarations protégées }
      public
        { Déclarations publiques }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        { Déclarations publiées }
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('MesObjFMX', [TListeDefilante]);
    end;
     
    { TListeDefilante }
     
    constructor TListeDefilante.Create(AOwner: TComponent);
    var aLabel : Tlabel; aRectangle : TRectangle;
        aControlItem : TGridPanelLayout.TControlItem;
    begin
         inherited;
         Parent:=TFmxObject(AOwner);
         BeginUpdate;
         ExpandStyle:=TGridPanelLayout.TExpandStyle.AddColumns;
         ColumnCollection.Clear;
         with ColumnCollection.Add do
          begin
            SizeStyle:=TGridPanelLayout.TSizeStyle.Percent;
            Value:=30.000000000000000000;
          end;
         with ColumnCollection.Add do
          begin
            SizeStyle:=TGridPanelLayout.TSizeStyle.Percent;
            Value:=40.000000000000000000;
          end;
         with ColumnCollection.Add do
          begin
            SizeStyle:=TGridPanelLayout.TSizeStyle.Percent;
            Value:=30.000000000000000000;
          end;
         with RowCollection.Add do
           begin
            SizeStyle:=TGridPanelLayout.TSizeStyle.Percent;
            Value:=100.000000000000000000;
           end;
         ControlCollection.ClearAndResetID;
         aRectangle := TRectangle.Create(Self);
         aRectangle.Name:='Rect_Gauche';
         aRectangle.Parent:=Self;
         aControlItem:=ControlCollection.Add;
         aControlItem.Control:=aRectangle;
         aControlItem.Setlocation(0,0);
         aRectangle.Align:=TAlignLayout.Client;
         aRectangle.Opacity:=0.500000000000000000;
         aLabel:=TLabel.Create(aRectangle);
         aLabel.Name:='Lb_Gauche';
         aLabel.Text:='G';
         aLabel.TextSettings.VertAlign := TTextAlign.Center;
         aLabel.TextSettings.HorzAlign := TTextAlign.Center;
         aLabel.HitTest:=False;
         aLabel.Parent:=aRectangle;
         aLabel.Align:=TAlignLayout.Horizontal;
    //     aControlItem:=ControlCollection.Add;
    //     aControlItem.Control:=aLabel;
    //     aControlItem.Setlocation(0,2);
         EndUpdate;
    end;
     
    destructor TListeDefilante.Destroy;
    begin
     
         inherited;
    end;
     
    end.
    Pour tester mon composant, j'ai créé un projet avec un TLabel et un TRectangle juste pour ne pas avoir une form vide et je crée mon objet "aListeDefilante" de type TListeDefilante au runtime.

    Voici le code le la form principale du projet :

    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
    38
    39
    unit F_TestListeDefilante;
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.ListeDefilanteR, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects;
     
    type
      TForm1 = class(TForm)
        Label1: TLabel;
        Rectangle1: TRectangle;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm1.FormCreate(Sender: TObject);
    var aListeDefilante : TListeDefilante ;
    begin
         aListeDefilante := TListeDefilante(Self) ;
         aListeDefilante.Parent:=Self;
         aListeDefilante.Width:=300;
         aListeDefilante.Height:=100;
    //     aListeDefilante.Position.X:=50;
    //     aListeDefilante.Position.Y:=200;
    end;
     
    end.
    J'ai mis un point d'arrêt sur la 1er ligne du constructor de mon objet et je ne passe jamais dans ce constructor !! ???

    Où est l'erreur ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 400
    Points : 652
    Points
    652
    Par défaut
    tu ne l'appelles pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aListeDefilante := TListeDefilante.Create(Self) ;

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 422
    Points : 323
    Points
    323
    Par défaut
    Elle était tellement grosse que je ne la voyait pas.
    Les neurones commencent à rouiller !!

    Merci

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    Loin de moi de critiquer la création de composant toutefois, cela ressemble beaucoup à un TListBox qui utiliserait un style personnalisé quant à l'affichage.
    Comme actuellement, je suis sur ce genre de délire (les Tlistboxs), c'est tout à fait l'impression que je tire de ta description de ta demande.
    En exemple
    Nom : Capture.PNG
Affichages : 111
Taille : 91,4 Ko

    Sans style (pour les allergiques), tu pourrais aussi utiliser un vertscrollbox et un cadre (frame)

    un Gridlayout, je le vois plus dans le cadre d'un autre de mes délires de retraité, tel ce futur clavier pour écran tactile windows (et linux ?)
    ici un pavé numérique
    Nom : Capture.PNG
Affichages : 112
Taille : 61,5 Ko
    pour info la structure du clavier
    Nom : Capture.PNG
Affichages : 109
Taille : 5,6 Ko

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 422
    Points : 323
    Points
    323
    Par défaut
    Merci Sergio pour ta réponse,
    J'ai essayé la TListBox, mais je ne l'ai pas trouvée adéquat.
    J'avais évoqué cette question dans un précédent post et ce que je veux obtenir c'est cet aspect :
    Nom : AspectComposant.png
Affichages : 111
Taille : 8,7 Ko
    Les données affichées basées sur une TStringlist.
    J'ai fait cette fonction avec le GridPanelLayout et cela correspond bien à mon besoin, ce qui ne veut pas dire qu'il n'y a pas d'autre solution !!
    Comme je l'ai fait fonctionner, je veux le mettre sous forme de composant car j'en voudrais au moins 3 sur ma form.

    En plus il me semble que mon besoin ressemble plus à tes essais de clavier qu'à la TListBox, bein que je sois toujours surpris et étonné de ce que tu arrives à faire avec les styles.
    Pour les styles j'ai une question qui va bientôt arriver sur le forum....
    Merci

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    Ah, oui, toujours garder les mêmes proportions, j'avais oublié.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    J'ai voulu me lancer dans l'aventure création de TGridPanelLayout mais je n'arrive pas à avoir les tailles que j'ai pu définir.
    Nom : Capture.PNG
Affichages : 106
Taille : 32,5 Ko

    Je savais que le comportement au design était d'où la nécessité de passer par la modification du dfm, mais je ne pensais pas qu'il en allait de même au runtime !

    [Edit] et ce en changeant le mode de calcul : SizeStyle:=TGridPanelLayout.TSizeStyle.Weight; Merci à Paul qui en avait fait la demande effectif avec la version 12 Athenes

    Maintenant, je peux m'attaquer au style

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 422
    Points : 323
    Points
    323
    Par défaut
    Je vais bien voir ce qui se passera en attendant la V 12 de Community...

    Par contre je suis vraiment rouillé, le dernier composant que j'ai créé en VCL cela doit bien faire 8 ans alors je galère.
    J'ai pris modèle sur ton composant TDiode pour faire mon package.
    Voilà le package :
    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
    38
    package FMX.ListeDefilante;
     
    {$R *.res}
    {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
    {$ALIGN 8}
    {$ASSERTIONS ON}
    {$BOOLEVAL OFF}
    {$DEBUGINFO OFF}
    {$EXTENDEDSYNTAX ON}
    {$IMPORTEDDATA ON}
    {$IOCHECKS ON}
    {$LOCALSYMBOLS ON}
    {$LONGSTRINGS ON}
    {$OPENSTRINGS ON}
    {$OPTIMIZATION OFF}
    {$OVERFLOWCHECKS ON}
    {$RANGECHECKS ON}
    {$REFERENCEINFO ON}
    {$SAFEDIVIDE OFF}
    {$STACKFRAMES ON}
    {$TYPEDADDRESS OFF}
    {$VARSTRINGCHECKS ON}
    {$WRITEABLECONST OFF}
    {$MINENUMSIZE 1}
    {$IMAGEBASE $400000}
    {$DEFINE DEBUG}
    {$ENDIF IMPLICITBUILDING}
    {$IMPLICITBUILD ON}
     
    requires
      rtl,
      fmx;
     
    contains
      FMX.ListeDefilanteD in 'FMX.ListeDefilanteD.pas',
      FMX.ListeDefilanteR in 'FMX.ListeDefilanteR.pas';
     
    end.
    le 'FMX.ListeDefilanteR.pas' c'est celui de mon post de départ et le fichier 'FMX.ListeDefilanteD.pas' pour le Design c'est celui là :

    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
    unit FMX.ListeDefilanteD;
     
    interface
    uses  System.Classes, FMX.ListeDefilanteR;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('MesObjFMX', [TListeDefilante]);
    end;
     
    end.
    Je n'ai pas encore mis les png en ressource graphique, mais si je peux compiler mon package sans problème, je n'ai jamais la possibilité de l'installer ?

    Où est l'erreur ?
    Merci

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    Si tu as gardé les mêmes codes, tu as une procedure register en trop dans l'unité Runtime.

    Pour des raisons que je ne comprends pas (du moins là tout de suite) je n'ai pas pu compiler avec D11.3, mais, transposée en D12
    Nom : Capture.PNG
Affichages : 101
Taille : 31,1 Ko
    pas de souci

    l'utilisation par contre ...
    Nom : Capture.PNG
Affichages : 98
Taille : 9,0 Ko
    déjà, tu remarqueras que, hélas, mon constat sur le percent n'est que trop présent (qu'à cela ne tienne, comme je l'ai fait ne V 12, j'ai juste à changer percent en weight)

    Par contre, c'est ensuite que ça coince, si je suis ton code de test
    Nom : Capture.PNG
Affichages : 100
Taille : 21,8 Ko

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 422
    Points : 323
    Points
    323
    Par défaut
    Oui effectivement j'avais supprimé la procédure Register de l'unité RunTime.

    En 11.3 je compile sans souci mais pas d'installation ? Quel élément génère le possibilité d'installer le nouveau composant dans une palette ?

    Pour la largeur des colonnes j'irais dans le dfm faire les modifs en attendant community V12.

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    Pour installer j'ai simplement utilisé le menu contextuel
    Nom : Capture.PNG
Affichages : 101
Taille : 292,8 Ko

    Mon avis, pour ce qu'il vaut, il vaut mieux passer par un Cadre (Tframe).
    Nom : Capture.PNG
Affichages : 94
Taille : 13,5 Ko

    cqfd
    Nom : Capture.PNG
Affichages : 95
Taille : 26,9 Ko

    Sachant que Patrick dans une vidéo montrait comment transformer un TFrame en composant, même si, niveau LiveBindings, je n'adhérais pas vraiment.

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 829
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 829
    Points : 13 573
    Points
    13 573
    Par défaut
    Citation Envoyé par Bernard B Voir le message
    Quel élément génère le possibilité d'installer le nouveau composant dans une palette ?
    Dans les options du projet → Description → Options d'utilisation

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 422
    Points : 323
    Points
    323
    Par défaut
    Non Andnotor, j'ai bien l'option "Conception et exécution" de sélectionnée dans "Description" et ça ne le fait pas.

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 829
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 829
    Points : 13 573
    Points
    13 573
    Par défaut
    Je ne sais pas comment ils gèrent le truc en l'absence de définition mais essaye d'ajouter les plateformes cibles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      [ComponentPlatformsAttribute(pidWin32 or pidWin64 or ...)]
      TListeDefilante = class(TGridPanelLayout)
      ...
    A toi de voir ce qui t'intéresse (ou mets-les tous pour test).

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 422
    Points : 323
    Points
    323
    Par défaut
    J'ai mis les 4 plates-formes au niveau des cibles :
    Nom : FMX-LD.png
Affichages : 94
Taille : 25,2 Ko

    Rien n'y fait !

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 264
    Points : 41 665
    Points
    41 665
    Billets dans le blog
    64
    Par défaut
    oui, mais le composant sensu-stricto ne s'installe qu'en 32 bits

  17. #17
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 422
    Points : 323
    Points
    323
    Par défaut
    J'ai été voir la vidéo de pprem, très intéressante pour l'utilisation des Tframe.
    Je suis reparti sur cette idée : créer une frame, lui ajouter les boutons, enregistrer le fichier puis clic droit et "Ajouter à la palette".

    C'était avec une version Delphi 10.x.x.

    Avec la V11.3 "Ajouter à la palette" a disparu ou c'est la même histoire que pour pouvoir ajouter un composant !!

    Nom : Pb_ajoutPalette.png
Affichages : 87
Taille : 14,0 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de création de composant FMX
    Par Gouyon dans le forum C++Builder
    Réponses: 2
    Dernier message: 22/05/2020, 10h11
  2. Réponses: 9
    Dernier message: 05/01/2018, 12h25
  3. Création composant FMX
    Par Artza dans le forum Composants FMX
    Réponses: 1
    Dernier message: 20/06/2014, 11h26

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