Dans une liste déroulante, j'affiche une liste de noms & prénoms.
Je voudrais associé à chaque nom un numéro (de manière invisible).
Es ce possible ?
Si oui, comment ?
Merci
Dans une liste déroulante, j'affiche une liste de noms & prénoms.
Je voudrais associé à chaque nom un numéro (de manière invisible).
Es ce possible ?
Si oui, comment ?
Merci
Salut.
Bien sur que tu peux le faire.
Regarde l'aide sur la methode AddObject de la Liste qui prends deux paramètres en entrée.
A+
En fait, c'est déjà fait :
Soit ta numérotation dépend de l'ordre dans lequel se trouve tes noms auquel cas, tu pex tirer parti du fait que tout ce qui est basé sur un TStringst, y compris une ListBox (ça marche aussi avec : TStringList,TMemo,TComboBox, etc...) considère que chaque Ligne (qui correspond donc à un nom dans ton cas) possède un index numéroté de 0 à n-1, n étant le nombre de lignes correspondant à ta liste.
Va voir l'aide delphi sur TListBox,
- tu as la propriété ItemIndex qui correspond au numéro de ligne qui à été choisis
- La propriété Items est un TStrings, c'est à dire une liste de chaîne de caractères dans lesquels se trouvent tes noms et prénoms. Si tu regarde dans l'aide ce que tu as a disposition avec TStrings, tu trouve :
- La propriété Count : le nombre d'éléments dans ta liste.
- La propriété Strings : Strings[Index] te renvoie la ligne numéro Index
- La Methode IndexOf(S:String) qui te renvoie l'index de la premiere ligne correspondante à ta recherche dans la liste.
Après, si tu veux absolument mettre un numéro différent que le numéro de ligne, il faut que tu crée une autre liste qui fasse la correspondance entre Nom d'une part et numéro d'autre part. Pour ce faire tu peux utiliser un TStringList et tirer partie des méthodes "Names" et "Values".
Cherche dans l'aide de Delphi, tu verra, c'est assez explicite pour ce que tu veux faire.
Bon courage
Pour compléter la proposition d'Andry, voici l'exemple
Ensuite pour récupérer ce numéro invisible (numéro de l'objet sélectionné):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Const NUM_EPONGE=0; NUM_BRICOLEUR=12; NUM_DYLAN=54; begin //Remplissage de la combo : ComboBox1.AddItem('Bob l'éponge',Pointer(NUM_EPONGE)); ComboBox1.AddItem('Bob le bricoleur',Pointer(NUM_BRICOLEUR)); ComboBox1.AddItem('Bob Dylan',Pointer(NUM_DYLAN));
et enfin pour sélectionner un item dans la liste à partir de son numéro secret
Code : Sélectionner tout - Visualiser dans une fenêtre à part num := Integer(combobox1.Items.Objects[combobox1.itemIndex]);
Attention à ne pas confondre ce numéro, qui set associé à l'objet dans la liste déroulante avec l'index, qui lui référence juste la position de l'objet dans la liste (comme tu as vu, j'ai mis dans mes constantes les valeurs 0, 12 et 54, alors que les indexs sont 0, 1 et 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part ComboBox1.ItemIndex:= ComboBox1.Items.IndexOfObject(Pointer(NUM_EPONGE);
Voilà,
Comme l'exemple de Sylvain Leray, AddObject s'utilise de la même manière que AddItem.
La seule différence est que AddObject est une fonction alors que AddItem est un procédure.
Voilà,
A+
Salut,
si jai bien compris:
je crois qu'a chaque Box.add(Str), ya un (Auto)index interne qui sincremente.
Alors si tu veux avoir lindex actuel, faut faire:
et voila
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 box.Items[Box.ItemIndex]
Et si tu veux referencer 2 Objects ala fois, faut utiliser:
TBucketList
c une sorte de HashTable implementer avec Delphi(je suis sur Delphi 7)
Bon courage
Merci beaucoup pour vos réponses mais je ne suis pas plus avancer.
Avec AddObject, j'ai des problème de type.
Avec AddItem, j'ai l'erreur suivante : [Erreur] U_carnet.pas(337): Identificateur non déclaré : 'AddItem'
Ma solution :
creer une autre liste déroulante invisble qui contient mes numéros et qui a le même index que dans l'autre liste déroulante.
Ce n'est pas une solution mais du bricolageEnvoyé par MANU_2
.
La solution évoqué plus haut par Andry et Sylvain Leray sont bonne, c'est toi qui a du mal les implementer. donne nous ton code (la partie en question) on y verra plus clair sur ton histoire de problème de type et AddItem qui n'est pas reconnue.
J'ai repris exactement le code de Sylvain et j'ai l'erreur suivante :Envoyé par lil_jam63
Peut être qu'il faut ajouter un module (ou unité) mais lequel ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part [Erreur] U_carnet.pas(337): Identificateur non déclaré : 'AddItem'
De plus, dans l'aide pour AddItem, j'ai ceci :
Si j'ai bien compris, additem est limité et ça me plaît pas.The AddItem command instructs Program Manager to add an icon to an existing group. There is a limit of 50 items per group.
Oui, ce que j'ai fait est du bricolage mais ça marche et c'est très simple.
Salut MANU,
Quelle composant utilise tu : Combobox ou autres ?
Sinon, utilise AddObject à la place de AddItem.
A+
Pourrais tu, s'il te plait donner une liste de Noms ou Mots que tu voudrait afficher avec le numéros qui correspondent à tes mots ?
Est ce que ta liste de nom est triée par odre Alphabétique ? (J'imagine que oui)
Est ce que tu veux qu'au premier Nom de ta Liste corresponde le nombre 1, puis au 2ème le nombre 2, etc... ou est ce que le nombre ne correspond pas à l'ordre de la liste ? Est-ce que ces numéro dépendent d'autre chose (longueur du Nom, etc...)
Est-ce que ces Noms et ces numéros existent dans un tableau, un fichier texte ?
Bref dis un peu plus précisemment ce que tu souhaite faire si tu veux être aidé, par ce que dans ton premier post tu n'as pas été assez explicite sur ce que tu souhaitez faire.
Sinon, désolé de te le dire, mais tout ce qui t'a été indiqué ici peu te permettre de réaliser ce que tu veux faire.
Enfin, où as tu été trouver cette aide sur AddItem ? Je n'ai jamais vu ça dans Delphi (Tu es bien sous Delphi, hein ? parce qu'en Pascal ce n'est pas pareil...)
Sinon, si tu as mis une ComboBox sur ta Fiche, Delphi à automatiquement rajouté l'unité qu'il faut dans la clause Uses pour toi, donc...
Moi je fait comme ca:
Je déclare un objet:
Après dans mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 TPersonne = class(TObject) Nombre :integer; end;
Comme ca je rajoute à ma Combobox un item qui apparaitra sous le nom de NomDeLaPersonne et qui aura un objet de type Tpersonne rattaché.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 var membre : Tpersonne; for i:=0 to nb_personne do begin membre:=TPersonne.Create(); membre.Nombre:=.....; Combobox1.Items.AddObject(NomDeLaPersonne,membre); end;
Après pour récuperer cette objet tu fait un truc du genre:
J'espère que ca pourra t'aider.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 buffer:=Combobox1.Items.Objects[i] As TPersonne;
Bonne prog
Vince
Envoyé par waskol
Dans une table, j'ai plusieurs champs dont Id_pers, Nom, Prenom, ...
Dans un combobox, j'affiche ma liste de nom & prenom triée.
Et je voudrais stocker l'id_pers (qui peut être 5, 6, 9, 100, 1, 4, ...) pour le retrouver très facilement.
Les solutions proposé me génèrent des erreurs.
Moi, j'ai trouvé une solution mais on me dit que c'est du bricolage.
Donc j'attend une solution efficace, simple et qui marche.
Oui, je suis sous Dephi professionnel 5.0 et l'aide sur AddItem, je l'ai trouvé en appuyant sur F1.Enfin, où as tu été trouver cette aide sur AddItem ? Je n'ai jamais vu ça dans Delphi (Tu es bien sous Delphi, hein ? parce qu'en Pascal ce n'est pas pareil...)
La c'est clair comme de l'eau.
Voila ce que j'utilise actuellement :
Ceci est une methode de ma classe
J'utilise juste comme ceci :
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 procedure TAUserType.ListTo(Itm: TStrings); begin With TIBQuery.Create(Nil) do try Database := IBDatabase; Transaction := IBTransaction; Itm.Clear; SQL.Text := 'SELECT TUS_NO,TUS_DESC FROM TTYPEUSER_LOAD(Null)'; Itm.Clear; Open; While not eof do begin Itm.AddObject(FieldByName('TUS_DESC').AsString,Pointer(FieldByName('TUS_NO').AsInteger)); Next end; finally Free; end; end;
Sinon pour recuperer le TUS_NO correspondant au TUS_DESc selectionné dans le combo je fais comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TypeUser.ListTo(Combo_user.Items);
Le problème peut se situer sur la version de Delphi, moi c'est la 7 pro.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TypeNo := Integer(Combo_user.Items.Objects[Combo_user.ItemIndex])
Courage
Super, là ça devient clair :
1) Voici une unté toute faite, tout spécialement pour toi, à ajouter à ton projet :
2) Voici un exemple composé d'une fiche sur laquelle j'ai mis une ComboBox et un Label
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 unit Unit2; interface uses Classes,StdCtrls; type TListeID=class private AStringList:TStringList; FComboBox: TComboBox; procedure SetComboBox(const Value: TComboBox); public constructor Create; destructor Destroy; procedure Clear; procedure UpdateComboBox; procedure Add(NomPrenom:string;Id_pers:Integer); procedure Delete(NomPrenom:string); function GetId_pers(NomPrenom:string):Integer; function GetId_persFromCombobox:Integer; property ComboBox:TComboBox read FComboBox write SetComboBox; end; implementation uses SysUtils; { TListeID } constructor TListeID.Create; begin AStringList:=TStringList.Create; AStringList.Sorted:=True; FComboBox:=nil; end; destructor TListeID.Destroy; begin AStringList.Free; FComboBox:=nil; end; procedure TListeID.Add(NomPrenom: string; Id_pers: Integer); begin AStringList.Add(NomPrenom+'='+IntToStr(Id_pers)); end; function TListeID.GetId_pers(NomPrenom: string): Integer; begin result:=StrToInt(AStringList.Values[NomPrenom]); end; procedure TListeID.SetComboBox(const Value: TComboBox); begin FComboBox := Value; end; procedure TListeID.Delete(NomPrenom: string); var Index:Integer; begin Index:=AStringList.IndexOfName(NomPrenom); if Index<>-1 then AStringList.Delete(Index); end; procedure TListeID.UpdateComboBox; var i:Integer; begin if Assigned(FComboBox) then begin FComboBox.Clear; for i:=0 to AStringList.Count-1 do FComboBox.Items.Add(AStringList.Names[i]); end; end; function TListeID.GetId_persFromCombobox: Integer; begin if Assigned(FComboBox) then result:=GetId_pers(FComboBox.Text); end; procedure TListeID.Clear; begin AStringList.Clear; end; end.
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 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Unit2; type TForm1 = class(TForm) ComboBox1: TComboBox; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ComboBox1Change(Sender: TObject); private { Déclarations privées } AListeID:TListeID; public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin //Creation de AListeID (A mettre dans le Oncreate) AListeID:=TListeID.Create; AListeID.ComboBox:=ComboBox1; //<--Dire avec quelle ComboBox on travaille //Remplissage de la liste (ça peut se trouver ailleurs) AListeID.Clear; //On vide la liste AListeID.Add('Stiqué Sophie',100); AListeID.Add('Némar Jean',8); AListeID.Add('Célère Jacques',51); //Remplir la combobox AListeID.UpdateComboBox; end; procedure TForm1.FormDestroy(Sender: TObject); begin AListeID.Free; end; procedure TForm1.ComboBox1Change(Sender: TObject); begin //On récupère l'ID pour l'afficher dans un label Label1.Caption:=IntToStr(AListeID.GetId_persFromCombobox); end; end.
Les solutions proposées semblent répondre parfaitement à ta question MANU_2.
Je réagis simplement à l'affirmation suivante :
J'attire ton attention sur le fait que pour gérer des données que tu as dans un dataset, il vaut mieux utiliser des composants orientés données. Le choix du combobox n'est donc selon moi bien pas judicieux...Envoyé par MANU_2
Je suggère alors :
- Si tu veux sélectionner une personne, pour mettre le ID choisi dans une autre table, utilise un TDBLookUpComboBox.
- Si tu veux une simple sélection de personne et c'est tout, il n'y a pas à ma connaissance de composant (ressemblant à un combobox) pour cela nativement dans delphi (6 en tous cas). Par contre la JVCL en fournit qui fonctionnent parfaitement. Je t'oriente donc par exemple vers un TJvDBSearchComboBox
Dans le 2e cas, par exemple, lorsque la sélection est effectuée dans le TJvDBSearchComboBox, le curseur du dataset est déplacé. Tu affiche donc le champ que tu veux, mais tu as toujours la possibilité de lire ton champ ID courant. En plus question lignes de code, on tend vers 0, ce qui est je crois l'idéal.
Bon dev'
a+
Partager