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 :

Créer un composant FMX composite


Sujet :

Composants FMX Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    403
    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 : 403
    Points : 300
    Points
    300
    Par défaut Créer un composant FMX composite
    Je débute en création de composant FMX.

    Je vise un composant composite donc un agglomérat de composants existants. Voici celui que j"ai bâti sur une forme et que je voudrais transformer en composant pour pouvoir le réutiliser :
    Nom : AspectComposant.png
Affichages : 97
Taille : 8,7 Ko

    J'ai donc créé un composant FMX vide avec l'utilitaire et j'ai essayé d'y mettre mes autres composants, un Tscalelayout comme base qui contient un rectangle calé à gauche, un rectangle calé à droite et un rectangle au centre qui occupe le reste de la place. Chaque rectangle a un TLabel comme enfant dans lesquels j'écrirais par la suite.

    Voilà ce que j'obtiens à l’exécution :
    Nom : obtenu1.png
Affichages : 92
Taille : 2,6 Ko

    Je ne vois pas mes 3 rectangles ni mes Labels.

    Voilà le code :
    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
     
    unit FMX.Obj_ListeHorizontale;
     
    interface
     
    uses
      System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Layouts, FMX.Objects,FMX.StdCtrls,
      FMX.Gestures;
     
    type
      TListeHorizontale = class(TScaledLayout)
      FRect_Gauche, FRect_Centre, FRect_Droite : TRectangle;
      FLb_Gauche, FLb_Centre, FLb_Droite : TLabel;
      FGesture : TGestureManager;
      FTextes : TStrings;
      private
        procedure Resize; override;
        { 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('Plus', [TListeHorizontale]);
    end;
     
    { TListeHorizontale }
     
    constructor TListeHorizontale.Create(AOwner: Tcomponent);
    begin
         inherited;
         Self.Width:=200;
         Self.Height:=60;
         FRect_Gauche:=TRectangle.Create(Self);
         FRect_Centre:=TRectangle.Create(Self);
         FRect_Droite:=TRectangle.Create(Self);
         FRect_Gauche.Parent:=Self;
         FRect_Centre.Parent:=Self;
         FRect_Droite.Parent:=Self;
         FRect_Gauche.Align:=TAlignLayout.FitLeft;
         FRect_Gauche.Width:=Self.Width*0.28;
         FRect_Droite.Align:=TAlignLayout.FitRight;
         FRect_Droite.Width:=Self.Width*0.28;
         FRect_Centre.Align:=TAlignLayout.Center;
         FLb_Gauche:=  TLabel.Create(Self);
         FLb_Centre:=  TLabel.Create(Self);
         FLb_Droite := TLabel.Create(Self);
         FLb_Gauche.Parent:=Self;
         FLb_Centre.Parent:=Self;
         FLb_Droite.Parent:=Self;
         FLb_Gauche.Align:=TAlignLayout.Center;
         FLb_Centre.Align:=TAlignLayout.Center;
         FLb_Droite.Align:=TAlignLayout.Center;
         FTextes := TStrings.Create;
         FLb_Gauche.Text:='*';
         FLb_Centre.Text:='*';
         FLb_Droite.Text:='*';
     
    end;
     
    destructor TListeHorizontale.Destroy;
    begin
    //     FTextes.Free;
         inherited;
    end;
     
     
    procedure TListeHorizontale.Resize;
    begin
         if Assigned(FRect_Gauche) then
            FRect_Gauche.Width:=Self.Width*0.28;
         if Assigned(FRect_Droite) then FRect_Droite.Width:=Self.Width*0.28;
    end;
     
     
    end.
    Le resize ne fait rien...

    J'ai un doute sur le composant "conteneur" TscaleLayout est il un bon choix, un Trectangle serait plus adapté ?

    J'aurais ensuite plein d'autres questions.....

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 075
    Points : 41 038
    Points
    41 038
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    Pourquoi un ScaledLayout ? À mon avis il s'agirait plutôt d'un GridPanelLayout avec une ligne et trois colonnes de 26%|48%|26%

    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
      object GridPanelLayout1: TGridPanelLayout
        Position.X = 56.000000000000000000
        Position.Y = 104.000000000000000000
        Size.Width = 193.000000000000000000
        Size.Height = 50.000000000000000000
        Size.PlatformDefault = False
        TabOrder = 2
        ColumnCollection = <
          item
            Value = 26.000000000000000000
          end
          item
            Value = 48.000000000000000000
          end
          item
            Value = 26.000000000000000000
          end>
        ControlCollection = <
          item
            Column = 0
            Control = Rectangle1
            Row = 0
          end
          item
            Column = 1
            Control = Rectangle2
            Row = 0
          end
          item
            Column = 2
            Control = Rectangle3
            Row = 0
          end>
        RowCollection = <
          item
            Value = 100.000000000000000000
          end>
        object Rectangle1: TRectangle
          Align = Client
          Size.Width = 50.180000305175780000
          Size.Height = 50.000000000000000000
          Size.PlatformDefault = False
        end
        object Rectangle2: TRectangle
          Align = Client
          Size.Width = 92.640007019042970000
          Size.Height = 50.000000000000000000
          Size.PlatformDefault = False
        end
        object Rectangle3: TRectangle
          Align = Client
          Size.Width = 50.180007934570310000
          Size.Height = 50.000000000000000000
          Size.PlatformDefault = False
        end
      end
    Pour le faire avec les bons pourcentages, il faudra certainement passer comme moi en mode texte pour bien ajuster les valeurs. Ensuite plus besoin de onResize

    Testé rapidement au runtime (en ancrant le container) c'est nickel
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    403
    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 : 403
    Points : 300
    Points
    300
    Par défaut
    Merci pour ton temps Sergio

    J'avais regardé le TGridPanelLayout, mais j'avais un pb pour comprendre ce composant.
    Premier point il m'a profondément agacé sur le fait de ne pas pouvoir mettre les bons pourcentages simplement. Je n'avais pas pensé à intervenir directement dans le dfm mais bonne idée ça fonctionne, je retiens.

    Autre point : gérer le bon nombre de colonnes et de lignes ok j'ai trouvé (c'est inventé par un pervers ?) .
    Mettre les composants dans les cases : j'ai ajouté des TGridPanelLayout.TControlItem, compris où mettre le contenu dans la bonne cellule, mais je ne peux ajouter que des composants existants ? et si j'en ajoute un déjà existant rien ne se passe le composant reste à sa place et la cellule est reste vide ???
    Déjà dans l'IDE je n'y arrive pas et semble-t-il ne comprend pas, alors faire tout ça dans le code c'est le brouillard complet pour moi.

    Par contre ça me parait plein d'espoir !!

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    403
    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 : 403
    Points : 300
    Points
    300
    Par défaut
    Je progresse !
    Je viens de trouver une video de pprem qui parle du TGridpanelLayout, j'ai compris comment, dans l'IDE, le remplir et mettre ce que je veux et comme je veux dans les cases.
    On verra le suite demain !

Discussions similaires

  1. [Lazarus] Comment crée-t-on simplement un composant visuel composite ?
    Par Didjeko dans le forum Lazarus
    Réponses: 8
    Dernier message: 16/06/2019, 10h28
  2. Composant FMX : comment ancrer les objets ?
    Par Invité dans le forum Composants FMX
    Réponses: 17
    Dernier message: 10/05/2013, 20h48
  3. Réponses: 0
    Dernier message: 08/12/2008, 17h29
  4. Objets composés et composites
    Par yanis97 dans le forum Langage
    Réponses: 8
    Dernier message: 24/10/2006, 11h20

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