Listbox a 2 colonnes

Résolu
cs_deubal Messages postés 198 Date d'inscription mercredi 26 novembre 2003 Statut Membre Dernière intervention 26 août 2009 - 25 oct. 2005 à 15:46
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015 - 27 oct. 2005 à 17:46
bonjour,
je voudrais savoir si c'est possible d'afficher 2 colonne dans une listbox. Par exemple, une ville (col1) et le code postal (col2).
Comment faut faire ??
Merci par avance
Bonne journée

13 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
25 oct. 2005 à 16:24
Decidement j'oublis toujours quelque chose.









pour eviter l'effet sintillement quand tu redimensionne ou "rafraichis" la listbox,

n'oublie pas de declarer dans l'evenement OnCreate de Form1 la ligne suivant :



procedure TForm1.FormCreate(Sender: TObject);

begin

form1.DoubleBuffered := true;

listbox1.DoubleBuffered := true;

end;



et voilou
3
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
25 oct. 2005 à 20:26
2° solution :

tu prends un Listbox normal, et tu lui mets (par exemple) la propriété "TabWidth" à 40 (choisis une valeur suffisament large par rapport à ton plus long item de ville)


<HR>
begin
listbox1.items.Add('Lyon'+chr(9)+'69000');
listbox1.items.Add('Paris'+chr(9)+'75000');
listbox1.items.Append('Marseille'+chr(9)+'13000');
end;

<HR>

DrJerome
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
25 oct. 2005 à 16:17
avec l'evenement OnDrawItem.



tu stock une donnée de type : ville<separateur>code postal



une fois soumise dans la listbox il suffit de separer les deux et avec
quelques fonctions qui vont bien afficher les deux de maniere a ce
qu'il soit bien callés.



ListBox avec la propriété Style sur "lbOwnerDrawVariable"



les fonctions qui vont bien : GetVilleFrom et GetCodeFrom



// recupere uniquement le nom de la ville

function GetVilleFrom(line : string) : string;

var psep : integer;

sout : string;

begin

// on recupre la position du separateur

psep := Pos(';',line);



// on assigne Line a une variable de traitement

// car on ne peu pas agir directement sur Line

sout := line;



// on coupe la partie que l'on ne veut pas

delete(sout,psep,length(sout));



// on renvois le resultat

result := sout;

end;



// recupere uniquement le code postal

function GetCodeFrom(line : string) : string;

var psep : integer;

sout : string;

begin

psep := Pos(';',line);

sout := line;

delete(sout,1,psep);

result := sout;

end;



Exemple pour l'evenement OnDrawItem de la listbox :



procedureTForm1.ListBox1DrawItem(Control:TWinControl;Index:Integer;Rect:TRect;State:TOwnerDrawState);

var Ln,V,CP : string;

begin

with listbox1.Canvas do begin

// on efface le canvas

FillRect(Rect);



// on recupere les données et on separe

Ln := ListBox1.Items[index];

V := GetVilleFrom ( Ln );

CP := GetCodeFrom ( Ln );



// on ecrit la ville, par defaut a gauche

TextOut(Rect.Left, Rect.Top, V);



// on ecrit le code postal, a partir de la moitiée de la taille de la liste box

// on peu remplacer "Listbox1.widht div 2" par une valeur en pixel fixe.

TextOut(Rect.Left + (ListBox1.Width div 2), Rect.Top, CP);

end;

end;





Dans mon exemple, si la form1 et redimensionnée seule la ligne selectionnée est "rafraichie".

Pour rafraichir l'ensemble des lignes il faudrat declarer dans l'evenement OnResize de Form1 :



procedure TForm1.FormResize(Sender: TObject);

begin

listbox1.Repaint;

end;



voila, a partir de la, tu pourras meme modifier la couleur des elements, dessiner une grille, assigner des icones specifique

ect... ect... a ta guise.



j'espere que cela correspondras a tes besoins.
0
cs_deubal Messages postés 198 Date d'inscription mercredi 26 novembre 2003 Statut Membre Dernière intervention 26 août 2009
25 oct. 2005 à 16:34
je te remercie pour tout ce code.
d'autant plus, que cela est très appréciable d'avoir les commentaires (surtout pour une novice comme moi !!)
encore merci
Bonne journée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
25 oct. 2005 à 16:59
mais de rien, mais mon erreur et peut etre de trop macher le travail au debutants.

je manque de pedagogie lol.



par contre j'ai oublier un truc a te preciser, mais tu as surrement trouver par toi meme.



pour ajouter une entrée dans la liste,

tu doit formater les donnée comme suis :



listbox1.items.append ( ville+ ';' + codepostal );



";" etant le separateur par defaut que j'ai placer.



tu peu le remplacer par exemple par # ou | ou > ou @ ou $ ou * ou %
ect... ect... bref par n'importe quel caractere qui serat a coup sur
pas utiliser dans la chaine.



par exemple n'utilise pas - ou ' ou / car les noms de ville peuvent les inclures.



note que les fonctions GetVille et GetCode peuvent etre remaniée pour d'autre programme.



tu peu egalement dessiner le numero des lignes, le nom des colones ect...

pour cela du devras travailler dans DrawItem

exemple d'affichage des numero de ligne et ligne de separation :



// le numero de l'index +1 pour correspondre a la ligne

TextOut(Rect.left, Rect.Top, IntToStr(Index + 1));



// une ligne de separation

MoveTo(40, rect.Top);

LineTo(40, rect.Bottom);


// la ville, on decale de 5 pixels par rapport a la ligne

TextOut(Rect.Left + 45, Rect.Top, V);


// le code postal

TextOut(Rect.Left + 200, Rect.Top, CP);
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
25 oct. 2005 à 20:28
j'ai mis de "Append" et des "Add" mais ça n'a pas d'importance


N'oubliez pas de cliquer sur Réponse acceptée si c'est OK

DrJerome
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
25 oct. 2005 à 20:30
l'avantage est que tu peux faire plusieurs colonnes :


<HR>

listbox1.items.Add('Lyon'+chr(9)+'69000'+chr(9)+'FRANCE');


<HR>

DrJerome
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 oct. 2005 à 05:44
1 petit defauts a ta solution :



les elements ne sont plus aligné (car il n'ont pas tous la meme longeur)
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
26 oct. 2005 à 06:37
-->f0xi dans la solution de DrJerome, n'aurais-tu pas oublié de fixer la largeur des colonnes avec tabwidth par hazard?
0
cs_deubal Messages postés 198 Date d'inscription mercredi 26 novembre 2003 Statut Membre Dernière intervention 26 août 2009
26 oct. 2005 à 09:27
wouahou, je vois que ma question permet plusieurs solutions...
Je vous remercie tous(ou toutes) pour cela
m'en vais tester les 2 methodes et voir laquelle correspond le mieux a ce que je souaite.
Encor merci
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 oct. 2005 à 21:10
@jlen100 : si justement TabWidth regler a 40 comme dans son exemple ... les elements de la listbox ne sont plus alignés ...

bizare bizare... vas savoir pourquoi ... je ferais des tests cette nuit ...
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
26 oct. 2005 à 21:24
essaie des valeurs plus grandes car je l'ai testé et ça fonctionne même en multi-colonnes
0
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
27 oct. 2005 à 17:46
j'avais bien dit :

<HR>
tu prends un Listbox normal, et tu lui mets (par exemple) la propriété "TabWidth" à 40 (choisis une valeur suffisament large par rapport à ton plus long item de ville)

<HR>

Je traduis : (ça veut dire ce que ça veut dire) :

Choisir des valeurs suffisamment larges càd au-delà de 40 pour le "TabWidth", si nécessaire

Désolé si ce n'était pas clair :-)

DrJerome
0
Rejoignez-nous