Combobox [Résolu]

emkka 26 Messages postés vendredi 7 avril 2006Date d'inscription 1 juin 2008 Dernière intervention - 30 avril 2006 à 17:18 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention
- 1 mai 2006 à 17:51
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.
Afficher la suite 

12 réponses

Répondre au sujet
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 30 avril 2006 à 23:05
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 30 avril 2006 à 18:28
0
Utile
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 +
Commenter la réponse de ThWilliam
emkka 26 Messages postés vendredi 7 avril 2006Date d'inscription 1 juin 2008 Dernière intervention - 30 avril 2006 à 18:39
0
Utile
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
Commenter la réponse de emkka
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 30 avril 2006 à 18:52
0
Utile
Peux-tu expliquer ton problème ? pcq pour ne pas avoir de double, je pense t'avoir donné la solution avec IndexOf...
Commenter la réponse de ThWilliam
emkka 26 Messages postés vendredi 7 avril 2006Date d'inscription 1 juin 2008 Dernière intervention - 30 avril 2006 à 18:58
0
Utile
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)
Commenter la réponse de emkka
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 30 avril 2006 à 21:54
0
Utile
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
Commenter la réponse de Cirec
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 30 avril 2006 à 21:57
0
Utile
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;
Commenter la réponse de f0xi
emkka 26 Messages postés vendredi 7 avril 2006Date d'inscription 1 juin 2008 Dernière intervention - 30 avril 2006 à 22:19
0
Utile
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.
Commenter la réponse de emkka
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 30 avril 2006 à 22:37
0
Utile
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
Commenter la réponse de Cirec
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 30 avril 2006 à 22:48
0
Utile
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
Commenter la réponse de Cirec
emkka 26 Messages postés vendredi 7 avril 2006Date d'inscription 1 juin 2008 Dernière intervention - 30 avril 2006 à 22:54
0
Utile
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.
Commenter la réponse de emkka
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 1 mai 2006 à 17:51
0
Utile
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")
Commenter la réponse de f0xi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.