Salut, je voudrais savoir comment faire avec un combobox pour afficher une valeur et stocker une autre valeur, a titre exemple je veux sauvegarder la valeur 'A' et afficher sur combobox la valeur "chaise" ?
Salut, je voudrais savoir comment faire avec un combobox pour afficher une valeur et stocker une autre valeur, a titre exemple je veux sauvegarder la valeur 'A' et afficher sur combobox la valeur "chaise" ?
J'utilise une méthode qui n'est peut-être pas la plus élégante mais qui a le mérite d'être simplissime
Au moment du chargement des Item je charge l'information que l'utilisateur verra et j'y concatène un filler assez long (une chaine d'espaces) et la valeur correspondante.
J'affecte à la combobox la propriété Style DrowDownList
Au moment du clic on récupère les derniers caractère de droite de la valeur sélectionnée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 LC_Filler := ''; While Length(LC_Filler) < 150 Do LC_Filler := LC_Filler + ' '; // Mise en grille PO_Combo.Clear; While LO_Champs.Count > 0 do Begin PO_Combo.AddItem('valeur visible' + LC_Filler + 'Code correspondant', Nil);
Code : Sélectionner tout - Visualiser dans une fenêtre à part Trim(Copy(PO_Combo.Items[LN_Ligne], 125, 255))
merci, mais c'est pas ce que je veux parce que je travaille avec des lettres en arabes et je dois stocker en fr.
Tu peux utiliser la fonction AddObject !
Puis récuperer ton objet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 var test: String; begin test:='showmessage'; ComboBox1.Items.AddObject('salut',Tobject(test)) end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 showmessage(String(Combobox1.Items.Objects[0]));
Bonjour !
Voici une autre possibilité.
@Delphi-ne
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 procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(ComboBox1.Text); end; procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var surimpression: string; begin surimpression := ''; if ComboBox1.Items[Index] = 'un' then surimpression := 'ein' else if ComboBox1.Items[Index] = 'deux' then surimpression := 'zwei' else if ComboBox1.Items[Index] = 'trois' then surimpression := 'drei'; if surimpression <> '' then begin ComboBox1.Canvas.Font.Color:= clBlack; ComboBox1.Canvas.Brush.Color:= clWhite; ComboBox1.Canvas.FillRect(Rect); ComboBox1.Canvas.TextOut(Rect.Left+5, Rect.Top+1, surimpression); end; end; procedure TForm1.FormCreate(Sender: TObject); begin ComboBox1.AddItem('un', nil); ComboBox1.AddItem('deux', nil); ComboBox1.AddItem('trois', nil); ComboBox1.Style := csOwnerDrawFixed; ComboBox1.ItemIndex := 0; end;
La fonction StringOfChar peut rendre service.
Code : Sélectionner tout - Visualiser dans une fenêtre à part LC_Filler := StringOfChar(' ', 150);
Tu peux aussi maintenir une TStringList avec les mêmes index donnant le code français à ton texte arabe
Attention, avec Sorted, cela ne fonctionne pas !
La proposition de Zephos est pertinente
Par contre, attention, le transtypage de chaine n'est pas fiable
L'utilisation réelle d'un descendant de TObject est la solution la plus longue, la plus complexe (instanctiation, transypage, libération)
Pour un étudiant, cela à l'intérêt pédagogique de voir comment utiliser la POO dans une IHM Delphi
Pour un utilisateur, il n'a à l'écran que ce qui le concerne, il a un affichage métier simple sans être encombré d'élément technique
Si tu as tout en DB, aussi bien le champ a mémoriser que la liste de valeurs, tu peux tenter le TDBLookupComboBox
le contrôle TDBLookupComboBox nécessite une bonne connaissance des TDataSet et de bien comprendre la différence entre le DataSource et le ListSource
Si tu veux détacher ton IHM de la DB et passer par un code manuel, tu peux donc le faire avec le Objects[]
Si le TStringList fourni un OwnsObjects mais pas TStrings, il faut donc libérer, j'ai fourni un code réutilisable pour cela
je fais cela très souvent, si ce n'est pas systématiquement
j'utilise un objet interne TRayonDataObject (mis dans la section implementation)
Mon but est d'avoir un TComboBox qui affiche des Rayons, il affiche évidemment les libellés mais je veux conserver l'ID
par Exemple
RayonID, RayonLibelle
1, Fruit
2, Yaourt
3, Textile
...
Dans la combo, je ne veux QUE le libellé et dans cet ordre (via propriété Sorted du TComboBox)
Fruit
Textile
Yaourt
Pour ajouter, par exemple depuis une Query Q dans le ComboBox des rayons cbxRayonFilter
pour savoir ce qui est sélectionné, dans le OnChange par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part cbxRayonFilter.Items.AddObject(Q.FielbByName('RayonLibelle').AsString, TRayonDataObject.Create(Q.FielbByName('RayonID').AsInteger, Q.FielbByName('RayonLibelle').AsString));
Mon code réel dans l'écran que je développe aujourd'hui même permet de filter des grilles en fonction d'un rayon
Code : Sélectionner tout - Visualiser dans une fenêtre à part ShowMessage(IntToStr(TRayonDataObject.GetSelected(TComboBox(Sender)).RayonID));
Personnellement, j'ai un objet controller qui charge ce genre de dico au moment opportun
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 //------------------------------------------------------------------------------ procedure TModulexxxForm.cbxRayonFilterChange(Sender: TObject); var Rayon: TRayonDataObject; begin // OnChange d'un ComboBox ne se produit que lors de la modification utilisateur FControleur.RayonFilter.Active := False; if Sender is TComboBox then begin Rayon := TRayonDataObject.GetSelected(TComboBox(Sender)); if Assigned(Rayon) then begin FControleur.RayonFilter.ID := Rayon.RayonID; FControleur.RayonFilter.Active := True; end; end; end;
Tant que l'objet controller est utilisé, le dictionnaire est conservé (évite de lire la DB tout le temps et de conserver des curseurs inutilement)
En général, un fenêtre (vue) va créer son controller et le libérer à sa fermeture
Voici la classe interne TRayonDataObject
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 TModulexxxForm.ShowRayons(); var it: TModulexxxControleur.TRayonDictionary.TRayonMapIterator; begin ClearRayons(); cbxRayonFilter.ItemIndex := cbxRayonFilter.Items.Add(' Tout'); with FControleur.RayonDictionary do for it in Dictionary do cbxRayonFilter.Items.AddObject(it.Value, TRayonDataObject.Create(it.Key, it.Value)); end; //------------------------------------------------------------------------------ procedure TModulexxxForm.ClearRayons(); begin TStringsSLTToolHelp.ClearStringsAndObjects(cbxRayonFilter.Items); 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 type { internal class declarations } TRayonDataObject = class(TObject) strict private FRayonID: Integer; FRayonLibelle: string; public constructor Create(ARayonID: Integer; const ARayonLibelle: string); property RayonID: Integer read FRayonID; property RayonLibelle: string read FRayonLibelle; public class function GetSelected(ACombo: TComboBox): TRayonDataObject; static; 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 { TRayonDataObject } //------------------------------------------------------------------------------ constructor TRayonDataObject.Create(ARayonID: Integer; const ARayonLibelle: string); begin FRayonID := ARayonID; FRayonLibelle := ARayonLibelle; end; //------------------------------------------------------------------------------ class function TRayonDataObject.GetSelected(ACombo: TComboBox): TRayonDataObject; begin if ACombo.ItemIndex >= 0 then Result := TRayonDataObject(ACombo.Items.Objects[ACombo.ItemIndex]) else Result := nil; 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
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
87
88 //------------------------------------------------------------------------------ (* SoLuTions is an Versatile Library for Delphi - * - * Copyright ou © ou Copr. "SLT Solutions", (2006) - * contributeur : ShaiLeTroll (2012) - Renommage Fichier et Correction XE2 - * contributeur : ShaiLeTroll (2012) - Documentation Insight - * - * ShaiLeTroll@gmail.com - * - * Ce logiciel est un programme informatique servant à aider les développeurs - * Delphi avec une bibliothèque polyvalente, adaptable et fragmentable. - * - * Ce logiciel est régi par la licence CeCILL-C soumise au droit français et - * respectant les principes de diffusion des logiciels libres. Vous pouvez - * utiliser, modifier et/ou redistribuer ce programme sous les conditions - * de la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA - * sur le site "http://www.cecill.info". - * - * En contrepartie de l'accessibilité au code source et des droits de copie, - * de modification et de redistribution accordés par cette licence, il n'est - * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, - * seule une responsabilité restreinte pèse sur l'auteur du programme, le - * titulaire des droits patrimoniaux et les concédants successifs. - * - * A cet égard l'attention de l'utilisateur est attirée sur les risques - * associés au chargement, à l'utilisation, à la modification et/ou au - * développement et à la reproduction du logiciel par l'utilisateur étant - * donné sa spécificité de logiciel libre, qui peut le rendre complexe à - * manipuler et qui le réserve donc à des développeurs et des professionnels - * avertis possédant des connaissances informatiques approfondies. Les - * utilisateurs sont donc invités à charger et tester l'adéquation du - * logiciel à leurs besoins dans des conditions permettant d'assurer la - * sécurité de leurs systèmes et ou de leurs données et, plus généralement, - * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. - * - * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez - * pris connaissance de la licence CeCILL-C, et que vous en avez accepté les - * termes. - * - *----------------------------------------------------------------------------*) unit SLT.Common.ClassesEx; interface uses System.Classes; type /// <summary>Boite à outil pour la classe TStrings</summary> /// <remarks>Le TStringsSLTToolHelp n'est pas un class helper car lors de sa création en 2002 sous Delphi 5, le code était procédural, /// lors de la refonte en classe en 2007, la version utilisée était Delphi 7, en s'inspirant du concept des Assistances de classes (Class Helper) du Delphi.NET /// <para>En XE2, la TStringList offre une propriété OwnsObjects (n'existe pas dans la TStrings) qui se comportent comme celle d'une TObjectList, cela remplace ClearStringsAndObjects</para></remarks> TStringsSLTToolHelp = class(TObject) public class procedure FreeAndNilObjects(AList: TStrings); static; class procedure ClearStringsAndObjects(AList: TStrings); static; end; implementation { TStringsSLTToolHelp } //------------------------------------------------------------------------------ class procedure TStringsSLTToolHelp.ClearStringsAndObjects(AList: TStrings); begin FreeAndNilObjects(AList); AList.Clear(); end; //------------------------------------------------------------------------------ class procedure TStringsSLTToolHelp.FreeAndNilObjects(AList: TStrings); var I: Integer; Obj: TObject; begin for I := 0 to AList.Count - 1 do begin Obj := AList.Objects[I]; if Assigned(Obj) then begin AList.Objects[I] := nil; Obj.Free(); end; end; end; end.
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Partager