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 VCL Delphi Discussion :

Créer ma listbox personnalisé avec un Tpanel ? TScrollBox ?


Sujet :

Composants VCL Delphi

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut Créer ma listbox personnalisé avec un Tpanel ? TScrollBox ?
    salut

    j'ai besoin d'une listbox qui permet d'avoir dans un même item, des Tbutton, Timage (en background d'item), Tlabel, et autres ...

    ce que n'autorise pas les Tlistbox et Tlistview ...

    et donc un ami m'a conseillé d'utiliser un Tpanel pour l'utiliser comme listbox

    cependant je suis un peu bloqué ... je n'ai jamais fais ce genre de chose; je ne sais même pas comment les placer en colonne, comment les décaler lors d'une suppression d'item, ect ...

    pour le moment je me suis juste renseigné sur la construction de boutton dynamiquement, car j'ai supposé que j'en aurait besoin ...

    j'attends vos interventions ^^

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut et bonne année,

    j'ai besoin d'une listbox qui permet d'avoir dans un même item, des Tbutton, Timage (en background d'item), Tlabel, et autres ...
    Pour créer ceci dynamiquement ça risque de nécessiter une sacrée usine à gaz car si tu as par exemple un miller d'items et un TPanel dont la taille permet de ne visualiser qu'une trentaine d'items cela suppose déjà que ton TPanel soit porteur d'une ScorllBox servant de Parent aux autres composants (Je placerais volontiers les Tbutton, Timage, Tlabel associés à chaque Item sur un petit TPanel matérialisant l'Item).

    je ne sais même pas comment les placer en colonne
    ... ben lors de la création dynamique tu donnes à la propriété Left des TPanel's matérialisant chaque Item la même valeur et à leur propriété Top la valeur incrémentée d'un Delta-Y correspondant à la hauteur d'un Item.

    comment les décaler lors d'une suppression d'item?
    ... ben dans une boucle de ré-affichage lors de laquelle tu réactualises la valeur de la propriété Top de chaque TPanel matérialisant un Item.

    ... Par contre si, pour chaque Itemp, tu peux te contenter d'un seul TButton, d'un seul Tlabel et d'un seul TImage par Item cela équivaudrait à l'utilisation d'une TListBox standard dont la procédure TForm1.ListBox1DrawIt() se charge du dessin du TImage associé à l'Item.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour et bonne année,

    Tu pourrais peut être utiliser un TStringGrid et dessiner ce que tu veux dans les cellules de chaque colonne.

    Les items seraient alignés automatiquement en colonne, et tu pourrais gérer la suppression ou l'insertion de lignes (regarde dans la FAQ et fait une recherche sur StringGrid dans le forum).

    Cordialement

    Charly

  4. #4
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    merci Gilbert Geyer et Charly910 pour votre aide !


    Charly910 j'hésite à utiliser un TstringGrid, bien que je m'en suis jamais servi, je me demande si c'est l'idéal

    je vais vous montrer en image ce que je veux faire

    Gilbert Geyer ne t'inquiète pas !!! je ne l'ai pas précisé, mais il n'y aura pas plus de 15 items

    autre chose ... je n'utilise pas de Tpanel et TScrollBox très souvent dans mes projets, donc je ne connaais pas bien leur propriétés; c'est un ami qui m'avait conseillé le Tpanel, mais c'est parce que je sais que j'aurai besoin de scrollbare que j'avais pensé au TScrollBox (les items étant un peu gros, pour 15 il faudra bien un scrollbare)

    si je peux utliser qu'un seul de ces composants, ça me suffit bien éviedment, c'est à vous de me dire l'idéal (peut être aussi les 2 ? comme vous avez dis, chaque Tpanel représenterai 1 item, et sur ce Tpanel je mettrais les bouttons et images) et ces panel seront posé sur le TScrollBox

    pour la partie ordonnés en colonne, j'ai entendu parlé de "dock" ça vous dis quelque chose peut être ?


    en tout cas, SOUS les composants (bouton, label, image, ect ...) il y aura sans doute un Timage de fond qui représenterait le background de l'item

    voilà un dessin pour illustrer :



    attention !!! "image oval texte dedan" ce sera un Tbouton, donc il y en a 4

    si vous avez d'autres questions pou les détails je suis dispo !

    au faite, bonne année à vous

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    1)
    si je peux utliser qu'un seul de ces composants, ça me suffit bien éviedment
    ... un ScrollBox suffit avec ses ScorllBar's, il servira de 'parent' aux Panel-Item's lors de la création dynamique du contenu de la ScrollBox.
    (inutile de poser la ScrollBox sur un TPanel sauf si tu recherche un effet esthétique avec les propriétés BevelInner et BevelOuter d'un TPanel).

    2)
    et sur ce Tpanel je mettrais les bouttons et images
    ... non : sur chaque TPanel-Item il faut d'abord placer le Timage de fond qui représente le background de l'item et qui servira de 'parent' aux 4 Tlabel, 4 Tbutton et à la petite image de droite.

    Question : Est-ce que l'image de fond de l'Item est la même pour tous les items ??? (sinon faudra utiliser un TImageList supplémentaire pour alimenter chaque TImageDeFond lors de la création dynamique, vu qu'il en faut déjà un pour les petites images de droite).

    3) Lors de la crétion dynamique des des 4 Tbutton et des 4 Tlabel il faudra attribuer une valeur à leur propriété 'caption' qu'il faudra récupérer quelque part, exemple : var CaptBtn : Array[0..14] of Array[1..4] of string; et idem pour les TLabel.

    4) Toujours lors de la création dynamique des 4 TButton il faudra déclarer la procédure à activer lors du 'OnClik' sur l'un des 4 TButton (exemple : OnClik :=maProcedureBtn1Click)

    Question : Est-ce-que les Button-numéro1 à Button-numéro4 de chaque Item doivent activer la même procédure ou est-ce-qu'il n'y a qu'une seule procédure à activer lors d'un click sur l'un des 4 ???

    5)
    pour la partie ordonnés en colonne, j'ai entendu parlé de "dock" ça vous dis quelque chose peut être ?
    ... l'aide Delphi (Faire F1 sur dock) dit seulement :
    N'appelez pas la méthode Dock. Elle est appelée automatiquement pour implémenter de nombreux détails d'empilement sur un site d'empilement.
    ... et de toutes façons on peut se passer de 'dock' puisque l'on peut placer les trucs en colonne avec leurs propriétés Left et Top.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-Salut,

    En attendant ta réponse au message précédent voiçi ce que ça donne avec une ScrollBox dont le contenu est créé dynamiquement lors d'un click sur un bouton de lancement, ici je me suis limité à initilaliser la ScrollBox avec deux Items (par flemme et pour raccourcir le code) mais ça illustre le mécanisme :
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    implementation
     
    {$R *.DFM}
     
    var       Count : integer; // Nombre d'items existants
              CaptBtn : Array[0..14] of Array[1..4] of string; // pour les Captions des boutons
              CaptLab : Array[0..14] of Array[1..4] of string; // pour les Captions des labels
    const     HItem = 55;      //<- Hauteur d'un Item (on en aura besoin encas de suppression d'un Item
     
    procedure PrepaCaptions;
    begin     // Pour l'Item0 :
              CaptLab[0,1]:='Item0_Texte1';
              CaptLab[0,2]:='Item0_Texte2';
              CaptLab[0,3]:='Item0_Texte3';
              CaptLab[0,4]:='Item0_Texte4';
     
              CaptBtn[0,1]:='Item0_Nom1';
              CaptBtn[0,2]:='Item0_Nom2';
              CaptBtn[0,3]:='Item0_Nom3';
              CaptBtn[0,4]:='Item0_Nom4';
     
              // Pour l'Item1 :
              CaptLab[1,1]:='Item1_Texte1';
              CaptLab[1,2]:='Item1_Texte2';
              CaptLab[1,3]:='Item1_Texte3';
              CaptLab[1,4]:='Item1_Texte4';
     
              CaptBtn[1,1]:='Item1_Nom1';
              CaptBtn[1,2]:='Item1_Nom2';
              CaptBtn[1,3]:='Item1_Nom3';
              CaptBtn[1,4]:='Item1_Nom4';
    end;
     
    procedure InitialiserListBoxPerso(NbItems : integer);
    const     BtnWidth = 70; BtnHeight = 18;
    var       PanelItem : TPanel; ImageFond : TImage;
              lab1,lab2,lab3,lab4 : TLabel;
              Btn1,Btn2,Btn3,Btn4 : TButton;
              ImageDeDroite : TImage;
              i : integer;
    begin     Count :=NbItems; //<- on récupère au passage la valeur de count
              with Form1 do
              begin for i:=0 to NbItems-1 do
                    begin PanelItem := TPanel.create(Form1);
                          with PanelItem do
                          begin parent:=ScrollBox1;
                                left:=0; width:=ScrollBox1.width-4; height:=HItem;
                                top:=i*HItem;
                                visible:=true;
                                tag:=-22; //<- Prendre une valeur qcq différente de tous les Tag des autres Panels présents sur Form1
                                          // (sera utile pour les supressions d'Items)
                                caption:=CaptBtn[i,1];
                          end;
                          ImageFond := TImage.create(Form1);
                          with ImageFond do
                          begin parent:=PanelItem;
                                width:=PanelItem.width; height:=HItem;
                                Stretch:=True;
                                tag:=-22;
                                Picture.Bitmap:=image2.Picture.Bitmap; //<- Même image de fond pour tous les Items pour l'instant
                          end;
                          // les 2 labels de gauche :
                          Lab1:=TLabel.create(Form1);
                          with Lab1 do
                          begin parent:=PanelItem;
                                left:=5; Top:=10;
                                Autosize:=True;
                                tag:=-22;
                                caption:=CaptLab[i,1];
                          end;
                          Lab2:=TLabel.create(Form1);
                          with Lab2 do
                          begin parent:=PanelItem;
                                left:=5; Top:=32;
                                Autosize:=True;
                                tag:=-22;
                                caption:=CaptLab[i,2];
                          end;
                          // Les 4 boutons du milieu :
                          Btn1 :=TButton.create(Form1);
                          with Btn1 do
                          begin parent:=PanelItem;
                                left:=100; Top:=5;
                                width:=BtnWidth; Height:=BtnHeight;
                                caption:=CaptBtn[i,1];
                                tag:=-22;
                                //onClick:=procedure-A-clarifier
                          end;
                          Btn2 :=TButton.create(Form1);
                          with Btn2 do
                          begin parent:=PanelItem;
                                left:=100; Top:=30;
                                width:=BtnWidth; Height:=BtnHeight;
                                caption:=CaptBtn[i,2];
                                tag:=-22;
                                //onClick:=procedure-A-clarifier
                          end;
                          Btn3 :=TButton.create(Form1);
                          with Btn3 do
                          begin parent:=PanelItem;
                                left:=Btn2.left+Btn2.Width + 5;
                                Top:= Btn1.top;
                                width:=BtnWidth; Height:=BtnHeight;
                                caption:=CaptBtn[i,3];
                                tag:=-22;
                                //onClick:=procedure-A-clarifier
                          end;
                          Btn4 :=TButton.create(Form1);
                          with Btn4 do
                          begin parent:=PanelItem;
                                left:=Btn3.left;
                                Top:= Btn2.top;
                                width:=BtnWidth; Height:=BtnHeight;
                                caption:=CaptBtn[i,4];
                                tag:=-22;
                                //onClick:=procedure-A-clarifier
                          end;
                          // les 2 Labels de Droite :
                          Lab3:=TLabel.create(Form1);
                          with Lab3 do
                          begin parent:=PanelItem;
                                left:=Btn4.left+Btn4.Width + 5;
                                Top:=Lab1.Top;
                                Autosize:=True;
                                caption:=CaptLab[i,3];
                                tag:=-22;
                          end;
                          Lab4:=TLabel.create(Form1);
                          with Lab4 do
                          begin parent:=PanelItem;
                                left:=Lab3.left;
                                Top:=Lab2.Top;
                                Autosize:=True;
                                caption:=CaptLab[i,4];
                                tag:=-22;
                          end;
                          // l'Image de droite :
                          ImageDeDroite := TImage.create(Form1);
                          with ImageDeDroite do
                          begin parent:=PanelItem;
                                height:=HItem-9; width:=height; //<- ici Image de 46x46
                                Left:=330; Top:=5;
                                ImageList1.Draw(ImageDeDroite.Canvas,0,0, i, True);
                                tag:=-22;
                          end;
                    end;
              end;
    end;
     
    // Utilisation :
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin     // Au click sur ce Button :
              PrepaCaptions; //<- on déclare les string des captions
              InitialiserListBoxPerso(2); //<- création dynamique d'initialisation avec 2 Items
    end;
     
    end.
    Ensuite il faudra coder les ajouts et les suppressions d'Items.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    tout d'abord Gilbert Geyer un IMMENSE merci pour toute ton intervention !

    tu as en gros, réussis ce que je voulais faire

    il me reste qu'à continuer et à rajouter ce qu'il manque

    par contre !!! ce sera pas si facile !

    il y a pas mal de pti truc à rajouter ...

    j'imagine déjà la suppression d'item, qui engendra décalage des autres item ainsi que tout le reste

    aussi ... il faut un moyen de savoir combien d'item est déjà présent ! mettre à jour lorsqu'on en supprime un, ect ...

    j'ai une proposition à te faire ... au lieu d'utiliser des tableaux à multidimensionnelle, qui peuvent nous embrouiller; que dirais tu d'un type record ? avec dedans tout les éléments de l'item (dans une tableau, ou string list ?) ...

    sinon pour répondre à tes interrogations :

    2/ oui l'image de fond est la même poru chaque item : faut il spécifier en fond du panel ? ou mettre sur le panel et de créer les boutton, label, et autres sur l'image (en spécifiant l'image comme parent) ?

    4/ oui et non ... en gros la procédure sera la même à quelques détails près ... dont les captions ... il faut que je puisse savoir ce qu'il y a sur le caption de chaque boutton, une procédure avec paramètres sera envisageable


    tu proposes quoi pour la suite ?

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,


    1)
    il y a pas mal de pti truc à rajouter ...
    ... je m'en doute bien.

    2)
    j'imagine déjà la suppression d'item, qui engendra décalage des autres item ainsi que tout le reste
    aussi ... il faut un moyen de savoir combien d'item est déjà présent ! mettre à jour lorsqu'on en supprime un, ect ...
    ... pour le nombre d'Items c'est pas un problème puisque en initialisant la ScrollBox avec les N premiers Items on sait qu'au départ il y en a N donc lors d'un ajout/suppression on sait faire N=N+1 ou N=N-1.
    ... pour la "suppression" comme il n'y a au max que 15 Items on peut aussi se contenter de créer ces 15 lors de l'initialisation puis de cliquer ou double-cliquer sur ceux que l'on veut faire disparaître sans les supprimer mais en les rendant invisibles. A chaque "suppression" on peut régler le problème des décalages par un simple ré-affichage des PanelItem dans une boucle dans laquelle on ré-ajuste la valeur de leur Top.


    3)
    j'ai une proposition à te faire ... au lieu d'utiliser des tableaux à multidimensionnelle, qui peuvent nous embrouiller; que dirais tu d'un type record ? avec dedans tout les éléments de l'item (dans un tableau, ou string list ?) ...
    ... ben oui, pourquoi pas un tableau de record.
    Reste à savoir s'il est utile de mettre tout dans ces record, en clair, faudrait faire l'inventaire de ce qui a la nature de constantes (comme l'image de fond, la hauteur d'un PanelItem, etc) et ne mettre dans le record que ce qui varie d'un Item à l'autre.
    Il semble également superflu de mettre dans le record les petites images situées à droite de ton dessin vu qu'on les stocke dans un TImageList (ce serait redondant)


    4)
    oui l'image de fond est la même pour chaque item : faut il spécifier en fond du panel ? ou mettre sur le panel et de créer les boutton, label, et autres sur l'image (en spécifiant l'image comme parent) ?
    ... comme l'image de fond est constante, le code d'hier en tient déjà compte : l'original de l'image est stocké dès la conception dans image2 qui est un TImage présent sur la Form avec la propriété 'visible' à False, donc visible uniquemment en mode conception.
    ... à propos de 'parent' je rectifie une bêtise que j'ai avancée hier avant de tester le code : le compilo n'a pas voulu que ImageFond soit déclaré comme parent mais a accepté que le parent soit le PanelItem.
    ... Par contre, lors de la création dynamique il faut veiller à empiler les trucs à poser sur PanelItem dans l'ordre : d'abord ImageFond et ensuite les labels, et ainsi de suite, car si on fait l'inverse les labels seraient cachés par ImageFond.

    5)
    ... en gros la procédure sera la même à quelques détails près ... dont les captions ... il faut que je puisse savoir ce qu'il y a sur le caption de chaque boutton, une procédure avec paramètres sera envisageable
    ... si on est sûrs que les détails pourront être réglès via les paramètres d'une procédure unique ça simplifiera un peu les choses.


    6)
    tu proposes quoi pour la suite ?
    ... ben dans ton premier message tu disais "j'ai besoin d'une listbox qui permet ..." mais on ne sait toujours pas à quoi il doit servir, en bref faudrait détailler un peu le scénario que doit jouer ton application.
    A voir ton dessin on dirait qu'il s'agit d'un jeu mais ça peut être autre chose.
    Pour l'instant je sais seulement qu'on a des Items avec des label et des boutons et j'aime bien savoir ce qui doit se passer si je clique sur le bouton n°1 et ainsi de suite, sinon impossible de programmer.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    je viens juste de lire ton poste, je dois aller au boulot donc je répondrais en détails à mon retour

    oui c'est pour un jeu, et lors du clique sur le bouton, le caption prend une valeur

    les item ne sont pas créés les 15 d'un coup, c'est l'utilisateur qui créé quand il veut

    et bien sur certains disparaitront, à tout moment

    en testant le code d'y hier, j'ai remarqué quelques soucis avec l'image de fond

    enfin ... je verrais tout ça au retour du taf

    thx

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-Bonjour,

    Tiens en attendant voiçi déjà le code d'hier modifié en tenant compte :
    - d'un array de records,
    - d'une initialisation de la ScrollBox avec les 3 premiers Items lors du OnCreate de la Form,
    - et en prime la "suppression" d'un Item par double-click sur l'image de Fond qui rend l'Item invisible puis réajuste le décalage vers le haut des Items suivants visibles dans la ScrollBox : tu cliques sur le 2ième et le 3ième se place juste sous le 1er.
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    private //<- de TForm1
        { Déclarations privées }
        procedure ImageFondDblClick(Sender: TObject);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    var       Count : integer; // Nombre d'items existants
    const     HItem = 55;      //<- Hauteur d'un Item (on en aura besoin en cas de suppression d'un Item
     
    type      TItem = record
                         CaptLab1,CaptLab2,CaptLab3,CaptLab4 : String; // pour les Captions des labels
                         CaptBtn1,CaptBtn2,CaptBtn3,CaptBtn4 : String; // pour les Captions des boutons
                         visible : boolean; //False pour Item caché
                      end;
     
              TItems = array[1..15] of TItem;
     
    var       MesItems : TItems;
     
    procedure PrepaCaptions;
    begin     // Pour l'Item1 :
              MesItems[1].CaptLab1:='Item1_Texte1'; //<- 'Item1_Texte1' à remplacer par valeurs d'intialisation et ainsi de suite
              MesItems[1].CaptLab2:='Item1_Texte2';
              MesItems[1].CaptLab3:='Item1_Texte3';
              MesItems[1].CaptLab4:='Item1_Texte4';
     
              MesItems[1].CaptBtn1:='Item1_Nom1';
              MesItems[1].CaptBtn2:='Item1_Nom2';
              MesItems[1].CaptBtn3:='Item1_Nom3';
              MesItems[1].CaptBtn4:='Item1_Nom4';
     
              // Pour l'Item2 :
              MesItems[2].CaptLab1:='Item2_Texte1';
              MesItems[2].CaptLab2:='Item2_Texte2';
              MesItems[2].CaptLab3:='Item2_Texte3';
              MesItems[2].CaptLab4:='Item2_Texte4';
     
              MesItems[2].CaptBtn1:='Item2_Nom1';
              MesItems[2].CaptBtn2:='Item2_Nom2';
              MesItems[2].CaptBtn3:='Item2_Nom3';
              MesItems[2].CaptBtn4:='Item2_Nom4';
     
              // Pour l'Item3 :
              MesItems[3].CaptLab1:='Item3_Texte1';
              MesItems[3].CaptLab2:='Item3_Texte2';
              MesItems[3].CaptLab3:='Item3_Texte3';
              MesItems[3].CaptLab4:='Item3_Texte4';
     
              MesItems[3].CaptBtn1:='Item3_Nom1';
              MesItems[3].CaptBtn2:='Item3_Nom2';
              MesItems[3].CaptBtn3:='Item3_Nom3';
              MesItems[3].CaptBtn4:='Item3_Nom4';
     
              // et ainsi de suite jusqu'à Item15
    end;
     
    procedure InitialiserListBoxPerso(NbItems : integer);
    //        Remarque : les valeurs numériques de taille et de positionnement des
    //        trucs posés ci-après sur chaque PanelItem correspondent à un TScrollBox large de 390 Pixels
    const     BtnWidth = 70; BtnHeight = 18;
    var       PanelItem : TPanel; ImageFond : TImage;
              lab1,lab2,lab3,lab4 : TLabel;
              Btn1,Btn2,Btn3,Btn4 : TButton;
              ImageDeDroite : TImage;
              i : integer;
    begin     Count :=NbItems; //<- on récupère au passage la valeur de count
              with Form1 do
              begin for i:=1 to NbItems do
                    begin MesItems[i].visible:=True;
                          PanelItem := TPanel.create(Form1);
                          with PanelItem do
                          begin parent:=ScrollBox1;
                                left:=0; width:=ScrollBox1.width-4; height:=HItem;
                                top:=(i-1)*HItem;
                                visible:=true;
                                tag:=-22; //<- Prendre une valeur qcq différente de tous les Tag des autres Panels présents sur Form1
                                          // (sera utile lors des  supressions d'Items)
                                name:='PanelItem'+IntToStr(i); // Idem
                          end;
                          ImageFond := TImage.create(Form1);
                          with ImageFond do
                          begin parent:=PanelItem;
                                width:=PanelItem.width; height:=HItem;
                                Stretch:=True;
                                tag:=-22;
                                Picture.Bitmap:=image2.Picture.Bitmap; //<- Même image de fond pour tous les Items
                                name:='ImageFond'+IntToStr(i);
                                onDblClick:=ImageFondDblClick;
                          end;
                          // les 2 labels de gauche :
                          Lab1:=TLabel.create(Form1);
                          with Lab1 do
                          begin parent:=PanelItem;
                                left:=5; Top:=10;
                                Autosize:=True;
                                tag:=-22;
                                caption:=MesItems[i].CaptLab1;
                          end;
                          Lab2:=TLabel.create(Form1);
                          with Lab2 do
                          begin parent:=PanelItem;
                                left:=5; Top:=32;
                                Autosize:=True;
                                tag:=-22;
                                caption:=MesItems[i].CaptLab2;
                          end;
                          // Les 4 boutons du milieu :
                          Btn1 :=TButton.create(Form1);
                          with Btn1 do
                          begin parent:=PanelItem;
                                left:=100; Top:=5;
                                width:=BtnWidth; Height:=BtnHeight;
                                caption:=MesItems[i].CaptBtn1;
                                tag:=-22;
                                //onClick:=procedure-A-clarifier
                          end;
                          Btn2 :=TButton.create(Form1);
                          with Btn2 do
                          begin parent:=PanelItem;
                                left:=100; Top:=30;
                                width:=BtnWidth; Height:=BtnHeight;
                                caption:=MesItems[i].CaptBtn2;
                                tag:=-22;
                                //onClick:=procedure-A-clarifier
                          end;
                          Btn3 :=TButton.create(Form1);
                          with Btn3 do
                          begin parent:=PanelItem;
                                left:=Btn2.left+Btn2.Width + 5;
                                Top:= Btn1.top;
                                width:=BtnWidth; Height:=BtnHeight;
                                caption:=MesItems[i].CaptBtn3;
                                tag:=-22;
                                //onClick:=procedure-A-clarifier
                          end;
                          Btn4 :=TButton.create(Form1);
                          with Btn4 do
                          begin parent:=PanelItem;
                                left:=Btn3.left;
                                Top:= Btn2.top;
                                width:=BtnWidth; Height:=BtnHeight;
                                caption:=MesItems[i].CaptBtn4;
                                tag:=-22;
                                //onClick:=procedure-A-clarifier
                          end;
                          // les 2 Labels de Droite :
                          Lab3:=TLabel.create(Form1);
                          with Lab3 do
                          begin parent:=PanelItem;
                                left:=Btn4.left+Btn4.Width + 5;
                                Top:=Lab1.Top;
                                Autosize:=True;
                                caption:=MesItems[i].CaptLab3;
                                tag:=-22;
                          end;
                          Lab4:=TLabel.create(Form1);
                          with Lab4 do
                          begin parent:=PanelItem;
                                left:=Lab3.left;
                                Top:=Lab2.Top;
                                Autosize:=True;
                                caption:=MesItems[i].CaptLab4;
                                tag:=-22;
                          end;
                          // l'Image de droite :
                          ImageDeDroite := TImage.create(Form1);
                          with ImageDeDroite do
                          begin parent:=PanelItem;
                                height:=HItem-9; width:=height; //<- ici Image de 46x46
                                Left:=330; Top:=5;
                                ImageList1.Draw(ImageDeDroite.Canvas,0,0, i-1, True);
                                tag:=-22;
                          end;
                    end;
              end;
    end;
     
    // Utilisation :
    procedure TForm1.FormCreate(Sender: TObject);
    begin     PrepaCaptions; //<- on déclare les string des captions
              InitialiserListBoxPerso(3); //<- création dynamique d'initialisation avec les 3 premiers des 15 Items.
    end;
     
    // "Suppression" d'un Item en le cachant : -------------------------------------
     
    procedure CacherItem(Indice : integer);
    var       NomPanelItem,nom : string; i : integer;
    begin     NomPanelItem:='PanelItem'+intToStr(Indice);
              with Form1 do
              begin i:=0;
                    repeat if (components[i] is tPanel) then
                           begin nom:=(components[i] as tPanel).name;
                                 if nom=NomPanelItem then
                                 begin (components[i] as tPanel).visible:=Not (components[i] as tPanel).visible;
                                       Break;
                                 end else inc(i);
                           end else inc(i);
                    until (i>=ComponentCount);
              end;
    end;
     
    procedure ReAfficherItemsVisibles;
    var       i,y : integer;
    begin     y:=0;
              with Form1 do
              begin i:=0;
                    repeat if  (components[i] is tPanel)
                           and ((components[i] as tPanel).tag=-22)
                           and ((components[i] as tPanel).visible) then
                           begin (components[i] as tPanel).Top:=y;
                                 y:=y+HItem;
                           end;
                           inc(i);
                    until i>=ComponentCount;
              end;
    end;
     
    procedure TForm1.ImageFondDblClick(Sender: TObject);
    var       nomImageFond,StrIndice : string;
              indice : integer;
    begin     //Identification de l'Item sur lequel on a double-cliqué :
              nomImageFond:=(Sender as Timage).name; 
              StrIndice:=copy(nomImageFond,length('ImageFond')+1,maxInt);
              ShowMessage('A Double-cliqué sur : '+StrIndice+' pour cacher-supprimer');
              indice:=StrToInt(StrIndice);
              // On cache l'Item :
              CacherItem(indice);
              MesItems[indice].visible:=False;
              // On ré-affiche les visibles à la suite l'un de l'autre :
              ReAfficherItemsVisibles;
    end;
     
    end.
    ... ça donne une idée du mécanisme utilisable pour cacher un Item sans le supprimer (pour pouvoir le réutiliser par exemple, si besoin est), mais si tu veux les supprimer carrément avec des 'Free' faut le dire, c'est faisable mais avec des lignes de code supplémentaires.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  11. #11
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    2/ je vois à peu près ce que tu veux faire pour gére l'affichage / la suppression des items. pour celà, il faut être certain qu'il n'y aura aucun vide entre chaque item ... dans ce cas là ton idée sera de créer les 15 items, et de les faire apparaitre / disparaitre au fur et à mesure que les utilises ? mais en même temps pourquoi ne pas les supprimers pour les recréer ensuite ?

    edit : je viens de tester la suppression, et c'est nikel, du point de vue affichage, car les décalage sont bien fait, mais saches que j'aurai encore à utiliser ces items donc j'ai besoin de savoir si c'est possible de les réutiliser simplement ?
    ou le mieux est de supprimer l'item directement ? surtotu que ça réutilisation, sera du neuf, avec nouveau noms ect ...


    3/ pour le record et les images, on pourrait mettre l'indice de l'image à récupérer dans le Timage List.


    4/ l'image de fond ne sera pas répété ... en faite tout ce base sur cet image et donc le panel devra avoir la taille de l'image, comme ça elle s'affiche une seule fois


    5/ oui les paramètres devraient faie l'affaire ... cependant, il faut pouvoir situer chaque boutton lors du clique ... cad lorsque je clique sur un boutton, il doit savoir sur quel item il est ... le 1er label sera le "nom" de l'item; avant de créer un item, on vérifie si le nom n'existe pas (donc on parcours pour savoir si le nom est libre ou pas); donc en paramètre on a le nom de l'item où se trouve aussi le boutton en question



    voilà ... si tu as d'autres questions sur le fonctionnement de la listbox, tu peux demander


    ma journée était longues, il est 2h lol donc je vais allé me coucher, mais dès que je me lève j'essais de refaire l'appli avec mon système, et je t'envoie les sources pour que tu vois l'image de fond, sa taille ect ...


    si tu as d'autre propositions pour la suite, tu peux présenter

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    2/
    je vois à peu près ... mais en même temps pourquoi ne pas les supprimers pour les recréer ensuite ... ou le mieux est de supprimer l'item directement ? surtout que sa réutilisation, sera du neuf, avec nouveau noms ect ...
    ... OK on supprime, ce sera plus clair.

    3/
    pour le record et les images, on pourrait mettre l'indice de l'image à récupérer dans le Timage List.
    ... Réfelexion faite, pour ce qui est de l'array[1..15] of TItem je pense le supprimer également pour deux raisons : d'abord parcequ'il est redondant avec le contenu de la scrollBox ce qui fait qu'en supprimant un Item dans la ScrollBox il faut aussi se farcir la suppression et le décalage des Items dans cet array, et deuxièmement comme t'as dit "c'est l'utilisateur qui créé quand il veut" il faut forcément des TEdit sur la Form pour permettre à l'utilisateur de saisir ses paramètres donc on peut passer les paramètres saisis directement à la routine qui assurera l'ajout d'un Item dans la ScrollBox sans avoir à passer par l'intermédiaire d'un array superflu.
    ... Et pour l'indice de l'image à récupérer dans le TimageList on peut ajouter un TEdit pour la saisie.

    4/
    l'image de fond ne sera pas répété ... en fait tout se base sur cette image et donc le panel devra avoir la taille de l'image, comme ça elle s'affiche une seule fois
    : Veux-tu dire que l'image de fond n'apparaîtra que dans le 1er Item ? Si oui cela va nous compliquer la vie vu que c'est avec le double-click sur cette image qu'on déclenche les suppressions ... de plus si l'utilisateur supprime le 1er Item il ne pourra plus se baser sur cette image sur laquelle tout se base ???


    5/
    oui les paramètres devraient faire l'affaire ... cependant, il faut pouvoir situer chaque boutton lors du clique ... cad lorsque je clique sur un boutton, il doit savoir sur quel item il est ... le 1er label sera le "nom" de l'item; avant de créer un item, on vérifie si le nom n'existe pas (donc on parcours pour savoir si le nom est libre ou pas); donc en paramètre on a le nom de l'item où se trouve aussi le boutton en question
    ... En fait il est préférable lors de la création dynamique d'un Item de donner des Noms_Incrémentés à chaque composant de l'Item dans le style :
    - name:='PanelItem_'+IntToStr(NuméroDeCréationDeLItem) pour le Panel;
    - name:='Lab1_'+IntToStr(NuméroDeCréationDeLItem) pour 1er label
    - name:='Btn1_'+IntToStr(NuméroDeCréationDeLItem) pour 1er Bouton
    - etc
    ainsi le préfixe du nom permet de distinguer les labels et boutons d'un même Item et le suffixe (_NuméroDeCréationDeLItem) permet d'identifier leur appartenance à un même Item, en bref les noms des composants visibles dans la ScrollBox nous guideront comme si la ScrollBox était une sorte de Tableur : 'Lab1_3' signifiera qu'on a affaire au 1er label du 3ième Item-créé et ainsi de suite. Le suffixe '_3' étant le N° de création et non l'indice vu que si on supprime l'Item 2 c'est l'Item 3 qui se décale à la place de l'Item 2, ça évitera des embrouilles.

    6/
    voilà ... si tu as d'autres questions sur le fonctionnement de la listbox, tu peux demander
    ... pour l'ajout d'un Item par l'utilisateur il faut combien de TEdit ?
    Pour ma part, vu ton dessin, je suppose qu'il en faut 5 : 4 pour la saisie des noms (du style alain, marc, jean, bertrand) et 1 pour la saisie de l'indice de l'image à récupérer dans le TimageList ... car je suppose que 'chamion' et les valeurs numériques '2000', '1542', '865' proviennent d'un résultat de calcul suivant la règle du jeu, Oui,Non ???

    7/
    si tu as d'autre propositions pour la suite, tu peux présenter
    ... je vais développer l'idée présentée ci-dessus, mais en répétant l'image de Fond sur chaque Item pour me simplifier la vie. On verra après.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    Voiçi le code de l'approche exposée tout à l'heure.
    Pour tester il faut que Form1 comporte :
    - une ScrollBox de 390 pixels de large et d'environ 330 de Haut,
    - un TimageList avec quelques images de taille 46x46
    - 5 TEdit pour la saisie des 4 noms et de l'indice de l'image de la TImageList,
    - 1 bouton où un click provoque l'ajout d'un Item avec les paramètres entrés par l'utilisateur,
    - et 1 TImage contenant l'image de fond.
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    implementation
     
    {$R *.DFM}
     
    const     HItem = 55;      //<- Hauteur d'un Item (on en aura besoin en cas de suppression d'un Item
     
    Type      TListItems = Object
                     Count   : integer; // Nombre d'items existants
                     NumCrea : integer; // Numéro de création de l'Item
                     procedure Init;
                     procedure AddItem(nom1,nom2,nom3,nom4 : string; indImg : integer);
                     procedure ReAfficherItems;
                     procedure DelItemImageMouseUp( Sender: TObject; Button: TMouseButton;
                                                    Shift: TShiftState; X,Y : integer);
                     procedure BoutonsClick(Sender: TObject); // pour ProcUniqueAParametres
              end;
     
    var    ListItems : TListItems;
     
    procedure TListItems.Init;
    begin     Count:=0; NumCrea:=0; end;
     
    procedure TListItems.AddItem(nom1,nom2,nom3,nom4 : string; indImg : integer);
    //        Remarque : les valeurs numériques de taille et de positionnement des
    //        trucs posés ci-après sur chaque PanelItem correspondent à un TScrollBox large de 390 Pixels
    const     BtnWidth = 70; BtnHeight = 18;
    var       PanelItem : TPanel; ImageFond : TImage;
              lab1,lab2,lab3,lab4 : TLabel;
              Btn1,Btn2,Btn3,Btn4 : TButton;
              ImageDeDroite : TImage;
    begin     with Form1 do
              begin PanelItem := TPanel.create(Form1);
                    with PanelItem do
                    begin parent:=ScrollBox1;
                          left:=0; width:=ScrollBox1.width-4; height:=HItem;
                          top:=Count*HItem;
                          visible:=true;
                          tag:=-22; //<- Prendre une valeur qcq différente de tous les Tag des autres Panels présents sur Form1
                          // (sera utile lors des  supressions d'Items)
                          name:='PanelItem_'+IntToStr(NumCrea); // Idem
                    end;
                    ImageFond := TImage.create(Form1);
                    with ImageFond do
                    begin parent:=PanelItem;
                          width:=PanelItem.width; height:=HItem;
                          Stretch:=True;
                          tag:=-22;
                          Picture.Bitmap:=image2.Picture.Bitmap; //<- Même image de fond pour tous les Items
                          name:='ImageFond_'+IntToStr(NumCrea);
                          onMouseUp:=DelItemImageMouseUp; //ImageFondDblClick;
                    end;
                    // les 2 labels de gauche :
                    Lab1:=TLabel.create(Form1);
                    with Lab1 do
                    begin parent:=PanelItem;
                          left:=5; Top:=10;
                          Autosize:=True;
                          tag:=-22;
                          caption:='+';
                          name:='Lab1_'+IntToStr(NumCrea);
                    end;
                    Lab2:=TLabel.create(Form1);
                    with Lab2 do
                    begin parent:=PanelItem;
                          left:=5; Top:=32;
                          Autosize:=True;
                          tag:=-22;
                          caption:='++';
                          name:='Lab2_'+IntToStr(NumCrea);
                    end;
                    // Les 4 boutons du milieu :
                    Btn1 :=TButton.create(Form1);
                    with Btn1 do
                    begin parent:=PanelItem;
                          left:=100; Top:=5;
                          width:=BtnWidth; Height:=BtnHeight;
                          caption:=nom1;
                          tag:=-22;
                          onClick:=BoutonsClick; //pour Procédure unique à parametres
                          name:='Btn1_'+IntToStr(NumCrea);
                    end;
                    Btn2 :=TButton.create(Form1);
                    with Btn2 do
                    begin parent:=PanelItem;
                          left:=100; Top:=30;
                          width:=BtnWidth; Height:=BtnHeight;
                          caption:=nom2;
                          tag:=-22;
                          onClick:=BoutonsClick; //pour Procédure unique à parametres
                          name:='Btn2_'+IntToStr(NumCrea);
                    end;
                    Btn3 :=TButton.create(Form1);
                    with Btn3 do
                    begin parent:=PanelItem;
                          left:=Btn2.left+Btn2.Width + 5;
                          Top:= Btn1.top;
                          width:=BtnWidth; Height:=BtnHeight;
                          caption:=nom3;
                          tag:=-22;
                          onClick:=BoutonsClick; //pour Procédure unique à parametres
                          name:='Btn3_'+IntToStr(NumCrea);
                    end;
                    Btn4 :=TButton.create(Form1);
                    with Btn4 do
                    begin parent:=PanelItem;
                          left:=Btn3.left;
                          Top:= Btn2.top;
                          width:=BtnWidth; Height:=BtnHeight;
                          caption:=nom4;
                          tag:=-22;
                          onClick:=BoutonsClick; //pour Procédure unique à parametres
                          name:='Btn4_'+IntToStr(NumCrea);
                    end;
                    // les 2 Labels de Droite :
                    Lab3:=TLabel.create(Form1);
                    with Lab3 do
                    begin parent:=PanelItem;
                          left:=Btn4.left+Btn4.Width + 5;
                          Top:=Lab1.Top;
                          Autosize:=True;
                          caption:='+++';
                          tag:=-22;
                          name:='Lab3_'+IntToStr(NumCrea);
                    end;
                    Lab4:=TLabel.create(Form1);
                    with Lab4 do
                    begin parent:=PanelItem;
                          left:=Lab3.left;
                          Top:=Lab2.Top;
                          Autosize:=True;
                          caption:='++++';
                          tag:=-22;
                          name:='Lab4_'+IntToStr(NumCrea);
                    end;
                    // l'Image de droite :
                    ImageDeDroite := TImage.create(Form1);
                    with ImageDeDroite do
                    begin parent:=PanelItem;
                          height:=HItem-9; width:=height; //<- ici Image de 46x46
                          Left:=330; Top:=5;
                          ImageList1.Draw(ImageDeDroite.Canvas,0,0, indImg, True);
                          tag:=-22;
                          name:='ImgDr_'+IntToStr(NumCrea);
                    end;
              end;
              inc(Count); inc(NumCrea);
    end; // TListItems.AddItem
     
    procedure TListItems.BoutonsClick(Sender: TObject);
    begin     ShowMessage('Procédure à développer pour click sur boutons');
    end;
     
    procedure TListItems.ReAfficherItems;
    var       i,y : integer;
    begin     y:=0;
              with Form1 do
              begin i:=0;
                    repeat if  (components[i] is tPanel)
                           and ((components[i] as tPanel).tag=-22)
                           and ((components[i] as tPanel).visible) then
                           begin (components[i] as tPanel).Top:=y;
                                 y:=y+HItem;
                           end;
                           inc(i);
                    until i>=ComponentCount;
              end;
    end;
     
    procedure TListItems.DelItemImageMouseUp( Sender: TObject; Button: TMouseButton;
                                              Shift: TShiftState; X,Y : integer);
    var       nom,nomImageFond,StrNumCrea,nomImgDr : string;
              nomLab1,nomLab2,nomLab3,nomLab4 : string;
              nomBtn1,nomBtn2,nomBtn3,nomBtn4 : string;
              nomPanel : string;
              i : integer; suppr: boolean;
    begin     // Suppression avec Ctrl+Btn-Souris-Gauche :
              if (Button<>mbLeft) or Not (ssCtrl in shift) then EXIT;
              nomImageFond:=(Sender as Timage).name;
              StrNumCrea:=copy(nomImageFond,length('ImageFond_')+1,maxInt);
              if MessageDlg('Supprimer '+StrNumCrea+' ?',mtConfirmation,[mbYes, mbNo], 0) <> mrYes then Exit;
     
              nomImgDr :='ImgDr_'+StrNumCrea;
              nomLab1  :='Lab1_'+StrNumCrea;
              nomLab2  :='Lab2_'+StrNumCrea;
              nomLab3  :='Lab3_'+StrNumCrea;
              nomLab4  :='Lab4_'+StrNumCrea;
     
              nomBtn1  :='Btn1_'+StrNumCrea;
              nomBtn2  :='Btn2_'+StrNumCrea;
              nomBtn3  :='Btn3_'+StrNumCrea;
              nomBtn4  :='Btn4_'+StrNumCrea;  nomPanel:='PanelItem_'+StrNumCrea;
     
              with Form1 do // Suppression couche supérieure
              begin i:=0;
                    repeat suppr:=False;
                           if components[i].tag=-22 then
                           begin if (components[i] is tImage) then
                                 begin nom:=(components[i] as tImage).name;
                                       if nom=nomImgDr then
                                       begin (components[i] as tImage).Free; suppr:=True; end;
                                 end else
                                 if (components[i] is tLabel) then
                                 begin nom:=(components[i] as tLabel).name;
                                       if (nom=nomLab1) or (nom=nomLab2)
                                       or (nom=nomLab3) or (nom=nomLab4) then
                                       begin (components[i] as tLabel).Free; suppr:=True; end;
                                 end else
                                 if (components[i] is tButton) then
                                 begin nom:=(components[i] as tButton).name;
                                       if (nom=nomBtn1) or (nom=nomBtn2)
                                       or (nom=nomBtn3) or (nom=nomBtn4) then
                                       begin (components[i] as tButton).Free; suppr:=True; end;
                                 end;
                           end;
                           if Not suppr then inc(i);
                    until i>=ComponentCount;
              end;
              with Form1 do // Suppression image du fond
              begin i:=0;
                    repeat if components[i].tag=-22 then
                           begin if (components[i] is tImage) then
                                 begin nom:=(components[i] as tImage).name;
                                       if nom=nomImageFond then
                                       begin (components[i] as tImage).Free;
                                             Break;
                                       end;
                                 end;
                           end;
                           inc(i);
                    until i>=ComponentCount;
              end;
              with Form1 do // Et enfin on cache le Panel-Item (free provoque message d'erreur !!?)
              begin i:=0;
                    repeat if components[i].tag=-22 then
                           begin if (components[i] is tPanel) then
                                 begin nom:=(components[i] as tPanel).name;
                                       if nom=nomPanel then
                                       begin (components[i] as tPanel).visible:=False;
                                             Break;
                                       end;
                                 end;
                           end;
                           inc(i);
                    until i>=ComponentCount;
              end;
              dec(Count);
              ReAfficherItems;
    end; // TListItems.DelItemImageMouseUp
     
    // Utilisation :
    procedure TForm1.FormCreate(Sender: TObject);
    begin     ListItems.Init;
    end;
     
    procedure TForm1.btnAddItemClick(Sender: TObject);
    //        Pour ajouter un Item :
    var       indImg : integer;
    begin     indImg:=StrToInt(edIndiceImage.text);
              if indImg>ImageList1.Count-1 then
              begin Showmessage('Indice d''image doit être compris entre 0 et '+intToStr(ImageList1.Count-1));
                    EXIT;
              end;
              ListItems.AddItem(edNom1.text, edNom2.text, edNom3.text, edNom4.text, indImg);
    end;
     
    end.
    Remarques
    - Pour supprimer un Item il faut faire Ctrl+Btn-Souris-Gauche,
    - Pour l'instant un click sur un des boutons d'un Item provoque simplement l'affichage du message "Procédure à développer .."

    A+

    PS : A mon avis il faudrait ajouter sur l'Item un Tlabel qui affiche son N° de création vu qu'avant une suppression un MessageDlg demande si oui/non il faut supprimer et qui indique le N° de création et non le N° d'ordre ou indice de position dans la ScrollBox qui change au gré des suppressions.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  14. #14
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    salut

    en testant tout ça il y a certains points non conforme, mais l'idée reste là

    4/ je me suis mal exprimé, quand j'ai dis que l'image ne doit pas être répété, c'est à dire que si elle n'a pas la taille du panel, elle ne doit pas s'étirer ou se "repeat" (propriété css d'un background)

    en faite c'est plus simple que tu ne le penses

    oui chaque item aura la même image, mais le panel, comme l'item en lui même aura la taille de l'image

    donc le mieux c'est de t'envoyer par pm cet image (qui est pour le moment qu'un exemple, car il y aura quelques retouches à faire, afin de bien distinguer chaque item) ainsi tu verras qu'il suffit de créer le panel et de déposer l'image dessus; et sur cette image tu as l'emplacement des Tedit / bouton


    5/ alors c'est vrai que l'ajout d'un item avec un nom spécifique pose un peu de problèmes

    en faite l'item est caractérisé par un nom, qui doit être unique; et donc, avant de créer un item on doit s'assurer que ce nom n'existe pas

    regarde l'image plus haut, l'item 3, "champion" c'est le nom de l'item en question

    pour le clique sur les boutons, lorsqu'on clique dessus, il doit connaitre le nom de l'item; donc en gros 2 paramètres seront envoyé lors de la procédure 1) le nom de l'item et 2) le bouton (1, 2, 3 ou 4)


    6/ lors de la création d'un item, il y a que le nom de l'item à entrer "champion" dans l'exemple, les captions des boutons pourraient être 1, 2, 3, 4 selon le bouton, les scores sont en effet calculé, et donc sont à 0 au début, l'image du cadenas, peut en effet changer donc oui on a aussi le n° d'indice à spécifier

    et c'est parce qu'on doit mettre régulièrement les scores à jour qu'on doit bien savoir le nom de l'item sur lequel on va travailler

    et aussi TRES important, pour la suppression d'item, ce sera pas par clique, c'est aussi grâce au nom de l'item


    donc en conclusion, le paramètre de base reste le nom de l'item, qui doit non seulement être unique, mais être créé par l'utilisateur, et donc pas possible de prévoir un nom concaténé à une incrémentation de variable


    bon je t'envoie par pm l'image, t'y vera un peu plus claire je pense

  15. #15
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    re salut

    je t'ai fais un petit exemple, en partant de tes sources, pour te montrer la manière dont je vois les choses

    tu me diras ce que t'en penses

    bien sur j'ai fais du rapide, afin que tu vois le fonctionnement

    c'est pourquoi on ne peut ajouter qu'un item pour le moment

    car il faudra coder les décalages, pour les autres items, et autres éléments nécessaires

    même pour l'image, je ne fais qu'un loadfile, alors que l'image ne sera pas sur le disque dur de l'utilisateur, c'était pour faire au plus simple

    pour l'autre image, elle proviendra d'un Timaglist, mais vu que je ne l'ai pas encore créé, j'ai laissé l'index à 0

    d'ailleurs l'image de fond a un cadenas, or à la base s'est vide; et c'est d'après le interger mis en paramètre qu'il y aura un cadenas fermé ou ouvert (enfin tout ça c'est secondaire)


    en pm tu as le lien de ma source + l'image de fond ainsi qu'une légende

    si tu as la moindre question n'hésites pas, mais je suis sur qu'on avancera bien avec ce début

    edit : j'ai oublié de préciser, dans cette listbox, un nouvelle item apparaitra en tête de liste, ce qui implique un décalage des anciens item vers le bas)

Discussions similaires

  1. Réponses: 10
    Dernier message: 24/07/2020, 16h53
  2. Comment créer une listBox avec plusieurs colonnes ?
    Par volcom_2222 dans le forum VB.NET
    Réponses: 6
    Dernier message: 27/02/2010, 11h44
  3. [Framework] Créer un parseur personnalisé avec un bean interne
    Par Baptiste Wicht dans le forum Spring
    Réponses: 8
    Dernier message: 23/02/2010, 22h44
  4. Comment créer un menu personnalisé avec Access2007
    Par marionAccess dans le forum Access
    Réponses: 6
    Dernier message: 24/01/2007, 16h29

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