buguetj
Messages postés76Date d'inscriptionlundi 25 octobre 2004StatutMembreDernière intervention 5 avril 2012
-
30 déc. 2008 à 17:01
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDerniè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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 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...
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
buguetj
Messages postés76Date d'inscriptionlundi 25 octobre 2004StatutMembreDerniè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.
buguetj
Messages postés76Date d'inscriptionlundi 25 octobre 2004StatutMembreDerniè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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.
buguetj
Messages postés76Date d'inscriptionlundi 25 octobre 2004StatutMembreDerniè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.