Tri ValueListEditor [Résolu]

buguetj 78 Messages postés lundi 25 octobre 2004Date d'inscription 5 avril 2012 Dernière intervention - 30 déc. 2008 à 17:01 - Dernière réponse : cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention
- 2 janv. 2009 à 08:50
Bonjour,


J'ai un ValueListEditor dans lequel j'ai plusieurs lignes d'informations. D'autre part j'ai un TEdit.


Ce que je souhaiterais réalisé, c'est une sorte de tri, c'est à dire lorsque je tappe dans mon TEdit un mot qui se trouve sur une des ligne de mon ValueListEditor, que seule cette ligne reste visible et que toute les autres disparaissent.


Je ne sais pas trop quelle fonctions utiliser


Merci d'avance
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 30 déc. 2008 à 23:22
3
Merci
procedure TForm1.Edit1Change(Sender: TObject);
var
  n, i, base: Integer;
begin
  if valuelisteditor1.FindRow(edit1.Text, n) then
  begin
    if doColumnTitles in ValueListEditor1.DisplayOptions then
      base := 1
    else
    begin
      base := 0;
      dec(n);
    end;
    for I := valuelisteditor1.RowCount - 1 downto base do
      if i > n then
        valuelisteditor1.DeleteRow(i)
      else
        if i < n then
        begin
          valuelisteditor1.DeleteRow(i);
          n := i;
        end;
  end;
end;

Mais, comme l'a dit Cantador, pour une nouvelle utilisation il faudra recharger le TValueListEditor avec de nouvelles valeurs.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 1 janv. 2009 à 12:01
3
Merci
@cantador : c'est malheureusement un constat trop fréquent. Les sous-entendus engendrent bien souvent des malentendus. La communication est un art difficile, c'est ainsi.

Bon, revenons à ce qui nous préoccupe...
Voici une nouvelle proposition prenant en compte la dernière demande de notre ami.
J'ai un peu choisi une solution de facilité en faisant appel à l'unité Masks :

uses Masks;

procedure TForm1.Edit1Change(Sender: TObject);
var
  i, base: Integer;
  List: TStrings;
begin
  //Réinitialise la liste pour le cas où
  //aurait effectué un retour arrière
  InitValueList;

  List := TStringlist.Create;
  try
    with ValueListEditor1 do
    begin
      //Ne pas rechercher dans la barre de titre
      //si elle est présente
      if doColumnTitles in DisplayOptions then
        base := 1
      else
        base := 0;
      {Pour chacune des clés, on vérifie si elle correspond
      au masque saisie dans Edit1. Si oui, on ajoute à la liste
      de chaînes}
      for i := base to RowCount - 1 do
      begin
        //NB : Recherche insensible à la casse
        if MatchesMask(Keys[i], Edit1.Text + '*')  then
        begin
          List.Append(Strings[i - base]);
        end;
      end;
      //Effacement du contenu du TValueListEditor
      Strings.Clear;
      //Ajout des chaînes correspondantes trouvées
      Strings.AddStrings(List);
    end;
  finally
    FreeAndNil(List);
  end;
end;

Le code étant suffisamment commenté je pense, notre ami n'aura pas de peine à l'appliquer tel quel.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 30 déc. 2008 à 22:32
0
Merci
bonsoir,
je ne suis pas sûr que TValueListEditor soit le compo approprié pour faire cette opération..car il fonctionne comme un stringgrid  avec des paires :
Nom/Valeur.

Mais si ty y tiens, il faut boucler sur la colonne contenant les valeurs à chercher
et tester laquelle sera égale à Edit1.text et si trouvé alorsil faut supprimer ou effacer toutes les autres..

Bref, un peu barbare car à la prochaine valeur, il faudra tout rechager...

cantador
Commenter la réponse de cs_cantador
buguetj 78 Messages postés lundi 25 octobre 2004Date d'inscription 5 avril 2012 Dernière intervention - 31 déc. 2008 à 11:47
0
Merci
merci, pour ton code
ya-t-il possibilité, lorsque j'efface le contenu de l'Edit que toute les lignes réaparraissent au fur et a mesure?
Merci d'avance
Commenter la réponse de buguetj
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 31 déc. 2008 à 12:25
0
Merci
Ajoute une procédure chargée d'initialiser le TValueListEditor :
procedure TForm1.InitValueList;

begin

  with ValueListEditor1.Strings do

  begin

    Clear;

    add('a=valeur a');

    add('b=valeur b');

    add('c=valeur c');

    add('d=valeur d');

    add('e=valeur e');

    add('f=valeur f');

  end;

end;

Ensuite, modifie légèrement la procédure Edit1Change :

procedure TForm1.Edit1Change(Sender: TObject);
var
  n, i, base: Integer;
begin
  if Edit1.Text = '' then
    InitValueList;

  if valuelisteditor1.FindRow(edit1.Text, n) then
  begin
    if doColumnTitles in ValueListEditor1.DisplayOptions then
      base := 1
    else
    begin
      base := 0;
      dec(n);
    end;
    for I := valuelisteditor1.RowCount - 1 downto base do
      if i > n then
        valuelisteditor1.DeleteRow(i)
      else
        if i < n then
        begin
          valuelisteditor1.DeleteRow(i);
          n := i;
        end;
  end;
end;

Bien sûr, tu peux aussi choisir de charger la liste depuis un fichier :
procedure TForm1.InitValueList;
begin
  with ValueListEditor1.Strings do
  begin
    Clear;
    LoadFromFile('liste.txt');
  end;
end;

en formatant un fichier texte comme ceci :
a=valeur a
b=valeur b
c=valeur c
d=valeur d
e=valeur e
f=valeur f

De cette façon, cela rendra plus dynamique la liste des options sans avoir à recompiler ton programme, par exemple.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
buguetj 78 Messages postés lundi 25 octobre 2004Date d'inscription 5 avril 2012 Dernière intervention - 31 déc. 2008 à 13:10
0
Merci
merci de ta réponse.
Cependant, je n'arrive pas a compiler même en ayant déclarer
procedure TForm1.InitValueList;

merci d'avance
Commenter la réponse de buguetj
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 31 déc. 2008 à 13:31
0
Merci
Deux solutions :
1- soit ajouter "procedure InitValueList;" manuellement dans la déclaration de la classe dans la portée publique ou privée

2- soit, dans le corps de la procédure, faire un clic droit et choisir "compléter la classe sous le curseur" si cette option est disponible (Delphi >= version entreprise) ou Shift+Ctrl+C comme raccourci clavier.

Pour info, quand une procédure ou une fonction contient le nom de la classe (ici : TForm1 .InitValueList), elle doit être déclarée au niveau de la classe.

May Delphi be with you !
<hr color ="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
buguetj 78 Messages postés lundi 25 octobre 2004Date d'inscription 5 avril 2012 Dernière intervention - 31 déc. 2008 à 13:37
0
Merci
merci de ta réponse,


j'ai déclaré manuellement procedure InitValueList dans publique ou privée (j'ai essayé les 2) et dans la deux cas j'ai une erreur de procédure surchargée.

merci
Commenter la réponse de buguetj
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 31 déc. 2008 à 14:02
0
Merci
Peux-tu m'envoyer la déclaration de ta classe en MP, stp ?

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
buguetj 78 Messages postés lundi 25 octobre 2004Date d'inscription 5 avril 2012 Dernière intervention - 31 déc. 2008 à 19:21
0
Merci
je pense qu'on s'est mal compris en mp.
Mon problème, c'est que dans le fichier liste.txt que j'ai créé, j'ai plusieurs entrée qui on le même nom. Donc quand je compile mon prg, j'ai bien le contenu de mon fichier qui s'insère correctement dans mon ValueListEditor mais il s'avère que dans mon fichier j'ai plusieurs entrée qui sont les même et quand je fais la recherche dans mon Edit, il ne m'affiche pas toute les entrée correspondante à ma recherche mais simplement une seule.

Merci
Bonnes fêtes
Commenter la réponse de buguetj
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 31 déc. 2008 à 21:19
0
Merci
Ok, je te donne une variante plus adaptée à ta demande.
Dans le code ci-dessus, je n'avais retenu que la première entrée trouvée.
Malgré tout, je te rappelle ta demande initiale :
"Ce que je souhaiterais réalisé, c'est une sorte de tri, c'est à dire
lorsque je tappe dans mon TEdit un mot qui se trouve sur une des ligne
de mon ValueListEditor, que seule cette ligne reste visible et que
toute les autres disparaissent."
Comme quoi une question mal posée amène toujours une mauvaise réponse !

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 1 janv. 2009 à 01:53
0
Merci
Eh oui delphiprog..
c'est l'éternel problème...

cantador
Commenter la réponse de cs_cantador
buguetj 78 Messages postés lundi 25 octobre 2004Date d'inscription 5 avril 2012 Dernière intervention - 1 janv. 2009 à 18:19
0
Merci
Bonjour,
désolé de ne pas avoir répondu avant j'ai préféré prendre un peu de temps afin de bien comprendre ton code qui marche parfaitement.
Merci encore pour toute ton aide et désolé pour le problème de communication hier.

Bonne fête
bonne continuation
Commenter la réponse de buguetj
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 2 janv. 2009 à 08:50
0
Merci
Y a pas de mal et tout est bien qui finit bien
Bonne continuation à toi aussi.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog

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.