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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    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
    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 522
    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 522
    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
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    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
    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
    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

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