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 :

Alignement dans un TListBox


Sujet :

Composants VCL Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 37
    Points : 34
    Points
    34
    Par défaut Alignement dans un TListBox
    Bien le bonjour à tous,

    Je me demandais s'il est possible de faire un alignement dans un TListBox? Par exemple :

    Un début de ligne | fin de ligne.
    Bonjour | à tous.
    Testing one two | one two.

    Les caractères | seraient tous placés à la même position vers la droite dans le ListBox, ce qui créerait un "genre" d'alignement si on veut.

    Mes premiers tests furent de me créer des fonctions permettant de faire des alignements, puis d'essayer de les utiliser avec le TlistBox. Dans un fichier texte ça va marcher parfaitement, mais pour une raison x ce n'est pas fonctionnel dans un TListBox.

    Voici le genre de fonction que je me suis fait :

    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
     
    function UStr_Pad_Right(cStr : String; nLong : integer; cCar : Char) : string;
    var i, nLen : integer;
        PadStr : string;
    begin
       PadStr := '';
       Result := trim(cStr);
       nLen   := nLong - Length(Result);
       if nLen > 0 then
          begin
             for i := 1 to nLen do
                 PadStr := PadStr + cCar;
             Result := Result + PadStr;
          end
       else Result := copy(Result,1,nLong);
    end;
    Après je faisais par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ListBox1.Items.Add( UStr_Pad_Right(chaine1, 50, ' ') + chaine2);
    ListBox1.Items.Add( UStr_Pad_Right(chaine3, 50, ' ') + chaine2);
    ListBox1.Items.Add( UStr_Pad_Right(chaine4, 50, ' ') + chaine2);
    Mais malheureusement, comme je le mentionnais, ça va bien fonctionner dans un fichier texte mais pas dans un ListBox.

    Avez-vous une idée?
    Merci d'avance...

  2. #2
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut
    c'est possible mais si tu ne veux pas bricoler des trucs qui marcheront à moitié, le mieux c'est de gérer le ownerdraw et placer au pixel près le texte comme tu le veux..

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 37
    Points : 34
    Points
    34
    Par défaut
    Idée fort intéressante...

    Un exemple de code, sans être nécessairement très élaboré, serait le bienvenu.

    Merci pour le feedback rapide!!!

  4. #4
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Ton algorithme ne peut fonctionner que si tu utilise une police à chasse fixe, c'est à dire dans laquelle toutes les lettres ont la même largeur (courier par exemple). Ce n'est pas le cas avec les polices utilisée habituellement. Un exemple avec 20 caractères:
    iiiiiiiiiiiiiiiiiiii
    AAAAAAAAAAAAAAAAAAAA

    La technique à utiliser est effectivement de se servir de l'évènement OnDrawItem. Voici un exemple de ce que cela pourrait donner. Attention, il faut que la propriété Style du TListBox soit à lbOwnerDrawFixed pour que cela fonctionne.
    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
     
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    const
      POSITION = 50; // La "marge" est à 50 % du contrôle
    var
      p: integer;
      gauche, droite: string;
      largeur: Integer;
      rg, rd: TRect;
    begin
      with Control as TListBox do
      begin
        p:= Pos('|', Items[Index]);
        if p = 0 then
        begin
          { Si le caractère | n'est pas présent, on trace normalement }
          Canvas.FillRect(Rect); // Efface le rectangle
          Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]); // Imprime le texte
        end
        else
        begin
          largeur:= Rect.Right - Rect.Left; // Largeur du contrôle en pixels
     
     
          { On travaille sur la partie gauche }
          gauche:= Copy(Items[Index], 1, p - 1); // Récupère la partie gauche du texte
          rg:= Classes.Rect(Rect.Left, Rect.Top,
            Rect.Left + largeur * POSITION div 100, Rect.Bottom);
          Canvas.FillRect(rg);
          Canvas.TextOut(rg.Left, rg.Top, gauche);
     
          { Même chose pour la partie droite }
          droite:= Copy(Items[Index], p + 1, Length(Items[Index]) - p);
          rd:= Classes.Rect(Rect.Left + largeur * POSITION div 100, Rect.Top,
            Rect.Right, Rect.Bottom);
          Canvas.FillRect(rd);
          Canvas.TextOut(rd.Left + 1, rd.Top, droite);
        end;
      end;
    end;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2002
    Messages : 69
    Points : 77
    Points
    77
    Par défaut
    Pour des colonnes comme ça on utilise en général une TListView en mode vsReport.

  6. #6
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Citation Envoyé par antp
    Pour des colonnes comme ça on utilise en général une TListView en mode vsReport.
    Evidemment, antp a définitivement raison.
    Je suis passé complètement à coté du problème.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2003
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 37
    Points : 34
    Points
    34
    Par défaut
    Ça fonctionne super bien!!!
    Un gros merci à tous!!!

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

Discussions similaires

  1. Alignement dans un TListBox
    Par gurvan1983 dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2007, 11h18
  2. Alignement dans les cellules d'un tableau
    Par philippef dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/02/2005, 12h15
  3. Ouvrir un fichier sur un double-clic dans une TListBox
    Par SegmentationFault dans le forum Composants VCL
    Réponses: 4
    Dernier message: 09/08/2004, 17h22
  4. Comment griser une ligne dans une TListBox ?
    Par SegmentationFault dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/06/2004, 09h15

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