Listbox a 2 colonnes [Résolu]

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

13 réponses

Répondre au sujet
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 25 oct. 2005 à 16:24
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 25 oct. 2005 à 20:26
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de DRJEROME
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 25 oct. 2005 à 16:17
0
Utile
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
cs_deubal 198 Messages postés mercredi 26 novembre 2003Date d'inscription 26 août 2009 Dernière intervention - 25 oct. 2005 à 16:34
0
Utile
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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 25 oct. 2005 à 16:59
0
Utile
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
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 25 oct. 2005 à 20:28
0
Utile
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
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 25 oct. 2005 à 20:30
0
Utile
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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 26 oct. 2005 à 05:44
0
Utile
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
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 26 oct. 2005 à 06:37
0
Utile
-->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
cs_deubal 198 Messages postés mercredi 26 novembre 2003Date d'inscription 26 août 2009 Dernière intervention - 26 oct. 2005 à 09:27
0
Utile
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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 26 oct. 2005 à 21:10
0
Utile
@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
jlen100 1651 Messages postés samedi 10 juillet 2004Date d'inscription 25 juillet 2014 Dernière intervention - 26 oct. 2005 à 21:24
0
Utile
essaie des valeurs plus grandes car je l'ai testé et ça fonctionne même en multi-colonnes
Commenter la réponse de jlen100
DRJEROME 447 Messages postés jeudi 9 janvier 2003Date d'inscription 5 février 2015 Dernière intervention - 27 oct. 2005 à 17:46
0
Utile
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.