Combobox [Résolu]

Signaler
Messages postés
26
Date d'inscription
vendredi 7 avril 2006
Statut
Membre
Dernière intervention
1 juin 2008
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
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.

12 réponses

Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
42
La même mais simplifié :

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

<hr>
@+
Cirec
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
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;

A +
Messages postés
26
Date d'inscription
vendredi 7 avril 2006
Statut
Membre
Dernière intervention
1 juin 2008

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
Messages postés
418
Date d'inscription
mardi 3 janvier 2006
Statut
Membre
Dernière intervention
26 novembre 2013
3
Peux-tu expliquer ton problème ? pcq pour ne pas avoir de double, je pense t'avoir donné la solution avec IndexOf...
Messages postés
26
Date d'inscription
vendredi 7 avril 2006
Statut
Membre
Dernière intervention
1 juin 2008

desolé on s'est pas bien compris je veux eviter le double dans element d'une meme combobox (pa de double choix de le meme chose)
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
42
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

<hr>
@+
Cirec
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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 :

RemoveDoublons(Combobox1.items);
RemoveDoublons(Combobox2.items);
RemoveDoublons(Listbox1.items);

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;
Messages postés
26
Date d'inscription
vendredi 7 avril 2006
Statut
Membre
Dernière intervention
1 juin 2008

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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
42
Salut F0xi,
ce qui est étrange avec ta procédure RemoveDoublons c'est qu'elle me vide la combobox de tous les items (en double où non) ?

@+
Cirec
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
42
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;

@+
Cirec
Messages postés
26
Date d'inscription
vendredi 7 avril 2006
Statut
Membre
Dernière intervention
1 juin 2008

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.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
je vais eclaircir un peu les propos de cirec :

Count = Compte

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")