Listbox a 2 colonnes [Résolu]

Messages postés
198
Date d'inscription
mercredi 26 novembre 2003
Dernière intervention
26 août 2009
- 25 oct. 2005 à 15:46 - Dernière réponse :
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
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
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 25 oct. 2005 à 16:24
3
Merci
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

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 25 oct. 2005 à 20:26
3
Merci
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

Merci DRJEROME 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de DRJEROME
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 25 oct. 2005 à 16:17
0
Merci
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.
Commenter la réponse de f0xi
Messages postés
198
Date d'inscription
mercredi 26 novembre 2003
Dernière intervention
26 août 2009
- 25 oct. 2005 à 16:34
0
Merci
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
Commenter la réponse de cs_deubal
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 25 oct. 2005 à 16:59
0
Merci
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);
Commenter la réponse de f0xi
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 25 oct. 2005 à 20:28
0
Merci
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
Commenter la réponse de DRJEROME
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 25 oct. 2005 à 20:30
0
Merci
l'avantage est que tu peux faire plusieurs colonnes :


<HR>

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


<HR>

DrJerome
Commenter la réponse de DRJEROME
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 26 oct. 2005 à 05:44
0
Merci
1 petit defauts a ta solution :



les elements ne sont plus aligné (car il n'ont pas tous la meme longeur)
Commenter la réponse de f0xi
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
- 26 oct. 2005 à 06:37
0
Merci
-->f0xi dans la solution de DrJerome, n'aurais-tu pas oublié de fixer la largeur des colonnes avec tabwidth par hazard?
Commenter la réponse de jlen100
Messages postés
198
Date d'inscription
mercredi 26 novembre 2003
Dernière intervention
26 août 2009
- 26 oct. 2005 à 09:27
0
Merci
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
Commenter la réponse de cs_deubal
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 26 oct. 2005 à 21:10
0
Merci
@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 ...
Commenter la réponse de f0xi
Messages postés
1651
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
25 juillet 2014
- 26 oct. 2005 à 21:24
0
Merci
essaie des valeurs plus grandes car je l'ai testé et ça fonctionne même en multi-colonnes
Commenter la réponse de jlen100
Messages postés
447
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
5 février 2015
- 27 oct. 2005 à 17:46
0
Merci
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
Commenter la réponse de DRJEROME

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.