Tri ValueListEditor

Résolu
buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012 - 30 déc. 2008 à 17:01
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 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

14 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
30 déc. 2008 à 23:22
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.
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
1 janv. 2009 à 12:01
@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.
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 déc. 2008 à 22:32
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
0
buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012
31 déc. 2008 à 11:47
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 déc. 2008 à 12:25
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.
0
buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012
31 déc. 2008 à 13:10
merci de ta réponse.
Cependant, je n'arrive pas a compiler même en ayant déclarer
procedure TForm1.InitValueList;

merci d'avance
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 déc. 2008 à 13:31
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.
0
buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012
31 déc. 2008 à 13:37
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
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 déc. 2008 à 14:02
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.
0
buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012
31 déc. 2008 à 19:21
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
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
31 déc. 2008 à 21:19
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.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 janv. 2009 à 01:53
Eh oui delphiprog..
c'est l'éternel problème...

cantador
0
buguetj Messages postés 76 Date d'inscription lundi 25 octobre 2004 Statut Membre Dernière intervention 5 avril 2012
1 janv. 2009 à 18:19
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
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
2 janv. 2009 à 08:50
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.
0
Rejoignez-nous