Bonsoir,
J'ai un petit problème concernant l'insertion d'une tabulation entre deux colonnes d'un DBComboBox. Je n'arrive pas à le faire. L'idée c'est d'aligner les lignes de la combo.
Merci.
Version imprimable
Bonsoir,
J'ai un petit problème concernant l'insertion d'une tabulation entre deux colonnes d'un DBComboBox. Je n'arrive pas à le faire. L'idée c'est d'aligner les lignes de la combo.
Merci.
Bonjour,
Normalement, une tabulation c'est le caractère "\t".
Je ne sais pas si cela peut te servir...
Je ne connais pas le composant que tu utilises, désolé.
Merci pour ta réponse mais ca ne marche pas. j'ai déjà essayé. ca donne un 9 entre les colonnes: 1 9 mètre par exemples avant: 1 mètre. Moi je veux inserer une tabulation entre 1 et mètre.
Tu peux essayer de redessiner les éléments de la Combo, auquel cas du dessineras "1" et un peu plus loin "mètre".
Si tu peux STP être un peu plus précis.
Je veux aligner toutes les lignes de la combo:
et non pasCode:
1
2
3
4 1 mètre 10 mètre 200 mètre
Code:
1
2
3 1 mètre 10 mètre 200 mètre
Voici un exemple :
PS : ne pas oublier de mettre Style à csOwnerDrawFixedCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { int PositionEspace; AnsiString LaPhrase,LePremierMot,LeSecondMot; ComboBox1->Canvas->FillRect(Rect); LaPhrase = ComboBox1->Items->Strings[Index]; PositionEspace = LaPhrase.Pos(" "); //On cherche ou mettre la 'tabulation' if (PositionEspace != 0) {//On découpe la phrase LePremierMot = LaPhrase.SubString(1,PositionEspace); LeSecondMot = LaPhrase.SubString(PositionEspace,LaPhrase.Length() - PositionEspace); } else LePremierMot = LaPhrase; DrawText(ComboBox1->Canvas->Handle,LePremierMot.c_str(),LePremierMot.Length(),(tagRECT *)&Rect,DT_VCENTER | DT_SINGLELINE | DT_LEFT); //On écrit le premier mot Rect.Left += 40; //On se décale un peu DrawText(ComboBox1->Canvas->Handle,LeSecondMot.c_str(),LeSecondMot.Length(),(tagRECT *)&Rect,DT_VCENTER | DT_SINGLELINE | DT_LEFT); //puis le second }
Merci bcp pour ton code, mais ca na pas réglé le problème, il y a toujours un décalage quant il s'agit de 2 caractères ou plus cad plus de 9:
Affiché:
Code nom
1 bouteille
10 vrac
200 carte
Souhaité:
Code nom
1 bouteille
10 vrac
200 carte
salut,
je ne voit pas bien la différence entre ton affiché et souhaité, mais je pense avoir compris ton problème, en fait tu souhaites que les intitulé soient allignés??
pour commencer utilise la police courier (même si elle n'est pas très belle) car tous les caractères ont la même taille (occupe la même place).
ensuite il faut que tu gère le longueur de tes quantités, ie que tu doit savoir si il y a 1 chiffre, 2 ... et ensuite ajusté le nombre d'espace nécessaire pour effectuer l'alignement de tes intitulés
j'espère avoir été assez claire et avoir répondu à a question.
Dans mon exemple précédent, j'ai mis 40 au pif. Il suffit de déterminer à l'avance la valeur à mettre en fonction des items de ta Combo.
Merci à vous tous. J'ai trouvé la solution en s'inspirant de vos codes et de vos suggestions.
Voici le code:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 AnsiString Phrase,Mot1,Mot2; DBComboBox1->Canvas->FillRect(Rect); Phrase = DBComboBox1->Items->Strings[Index]; Mot1 = Phrase.SubString(0,2); if (Phrase.SubString(3,1) == " ") { Mot2 = Phrase.SubString(4,Phrase.Length()); } else { Mot2 = Phrase.SubString(3,Phrase.Length()); } DrawText(DBComboBox1->Canvas->Handle,Mot1.c_str(),Mot1.Length(),(tagRECT *)&Rect,DT_VCENTER | DT_SINGLELINE | DT_LEFT); //On écrit le premier mot Rect.left += 40; DrawText(DBComboBox1->Canvas->Handle,Mot2.c_str(),Mot2.Length(),(tagRECT *)&Rect,DT_VCENTER | DT_SINGLELINE | DT_LEFT); //puis le second