bonjour,
je suis sur delphi, voila je dispose de deus combobox et je veux que quand je fait mon choix dans la premiere combobox, la deuxieme se remplis en fonction de la premiere.
merci d'avance.
procedure RemoveDoublons(Strings : TStrings);
var N : integer;
begin For N := Strings.Count-1 downto 0 do
If Strings.IndexOf(Strings.Strings[N]) <> N Then Strings.Delete(N);
end;
Alors pour Count :
Count donne le nombres d'items présents dans la list
et Count -1 parce que le premier item n'a pas comme index 1 mais 0 Ex.:
si dans ta liste tu as cinq items Count est = à 5 mais en réalité:
Item1 est = à Index 0
Item2 est = à Index 1
...
Item5 est = à Index 4
Et IndexOf(Chaine) :
renvoie la position (Index) de la chaine dans la liste :
IndexOf('Item5') = 4
voilà j'éspère avoir été assez claire sinon n'hésites pas à le dire
<hr> n'oubliez pas de cliquer sur Réponse Acceptée
si elle vous convient
Si ce que tu veux, c'est ajouter dans le 2° combo l'élément sélectionné du 1° combo,
tu peux le faire ainsi dans l'événement OnSelect de ComboBox1 :
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
// on vérifie si l'item sélectionné n'existe pas dans combobox2...
if ComboBox2.Items.IndexOf(ComboBox1.text) = -1 then
// puis on l'ajoute...
ComboBox2.Items.Add(Combobox1.text);
end;
merci mais c pa ce que je veux, mais bon j'ai regler mon probleme mais il me reste une petite chose:
comment faire pour ne pas avoir de double dans la liste du combobox?
merci
Salut,
il faut être plus claire dans ta demande si tu penses que la solution de ThWilliam n'est pas la bonne.
Maintenant si c'est effectivement pour éviter d'avoir des Items en doubles dans la ComboBox2 la méthode proposé par ThWilliam fonctionne, fais un teste et tu verras que tu ne peux pas mettre deux fois le même Item dans la ComboBox2 avec ce code.
<hr> n'oubliez pas de cliquer sur Réponse Acceptée
si elle vous convient
pour par exemple charger des fichiers de liste different selon le choix fait dans la premiere combobox :
procedure TForm1.Combobox1Change(Sender : TObject);
begin
case Combobox1.ItemIndex of
0 : Combobox2.Items.loadfromfile('liste1.txt');
1 : Combobox2.Items.loadfromfile('liste2.txt');
2 : Combobox2.Items.loadfromfile('liste3.txt');
end;
end;
pour eviter les doublons dans une liste, il faut créer une petite methode qui s'utiliseras comme cela :
procedure RemoveDoublons(Strings : TStrings);
var N : integer;
begin
for N := Strings.Count-1 downto 0 do begin
if Strings.IndexOf(Strings.Strings[N]) <> - 1 then
Strings.Delete(N);
end;
end;
on pourrait egalement ecrire une fonction qui nous donnerais tout les index contenant le meme texte :
s'utiliserait comme suis :
var
Indexs : TIndexArray;
begin
GetTextIndexs(Combobox1.Items,Indexs,'Texte a chercher');
Label1.caption := format('Indexs trouvés : %d',[Length(Indexs)]);
end;
Recherche la chaine S dans la liste de chaine Strings et renvois les indexs trouvés dans le tableau Indexs.
type
TIndexArray = array of integer;
procedure GetTextIndexs(Strings : TStrings; Indexs : TIndexArray;const S : String);
var N : integer;
begin
for N := 0 to Strings.Count-1 do begin
if Pos(S,Strings.Strings[N]) > 0 then begin
SetLength(Indexs, Length(Indexs)+1);
Indexs[High(Indexs)] := N;
end;
end;
end;
je te remercis pour la procedure RemoveDoublons sauf que quand le l'ai utilisé je retrouve toujous le meme probleme celui du double et dont je veux me debarasser.
merci.
Tiens voici une petite correction qui fait la différence :
procedure RemoveDoublons(Strings : TStrings);
var N , Idx: integer;
begin for N := Strings.Count-1 downto 0 do begin Idx : = Strings.IndexOf(Strings.Strings[N]);
if (Idx <> - 1) and (Idx <> N) then Strings.Delete(N);
end;
end;
je te remercie Cirec tu ma sauver la vie, par curiositer je voudrai avoir des explications sur 'count-1' et 'indexof' tu peut m'en parler? ou bien tu m'explique ta procedure clairement merci en tt cas.
cette fonction compte le nombre d'elements present dans une liste donc de 1 a N, ou encore 0 si il n'y a aucun element dans la liste.
par contre l'index des elements vas de 0 a N.
il existe souvent dans les composants liste une propriété ItemIndex qui renvois l'index de l'element selectionné.
si aucun element n'est selectionné cette propriété renvois -1.
donc on ecrit Count-1 pour avoir l'index du dernier elements de la liste car si on a 32 elements cela veux dire que le premier element a pour index 0 et le dernier 31 (soit 32 elements).
si l'on ecrivait pas Count-1, quand notre methode demanderait l'element d'index 32 (inexistant) nous aurions une injure d'execution "indice hors limite".
logique vus que notre limite est 0..31
sinon, pour RemoveDoublons, bien vus pour la rectification, le probleme d'ecrire des methodes de tête.
j'ai egalement vus dans l'aide Delphi que les composants listes possédaient une propriété du nom de "Duplicate" qui permet justement d'eviter ou non l'ajout de chaine identique.
(voir aide delphi : "duplicate")