Quelques petits bémols mais
:fou: que j'étais en allant titiller le SQLLocal, le Filter de la FDMemTable convient très bien à mon projet, en modifiant quelque peu la structure de ma table mémoire (pour la future recherche Ville,Code Postal,Pays du second TEdit) je vais m'en sortir
En lieu et place d'un filtre sur la ListView (code en commentaire) j'ai utilisé les propriétés Filter et Filtered de la table mémoire
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| procedure TMainClients.NomSearchChange(Sender: TObject);
begin
if Length(NomSearch.Text)>0 then
begin
{ Listview1.Items.Filter:=function(X: string): Boolean
begin
Result:= X.StartsWith(NomSearch.Text,true);
end; }
Datas.FDClients.Filtered:=false;
Datas.FDClients.Filter:='NOM LIKE '+QuotedStr(UpperCase(NomSearch.Text)+'%');
Datas.FDClients.Filtered:=True;
end
else begin
{Listview1.Items.Filter:=nil;}
Datas.FDClients.Filtered:=False;
end;
end; |
Juste un bémol : Après le filtre, si je vois bien les éléments suivants, je ne vois plus les éléments précédents
je m'explique si je demande les clients dont le nom commence par 'BAR' le filtre fait son travail , j'efface ensuite la demande (donc filtered:=false) la liste ne contient aucun 'A......' comme si la liste ne se remplissait qu'à partir de l'enregistrement courant
j'ai donc été obligé de rajouter un Datas.FDClients.First en fin de procédure
me reste "plus qu'à" travailler sur un expression régulière pour la seconde partie du filtre mais je considère que c'est :resolu: si toutefois quelqu'un sait comment surclasser la fonction OnDoFilterItem ou une manière simple d'utiliser TSearchBox je suis toujours preneur
Cette fois ci vraiment résolu
Bonjour,
encore confronté à ce problème cette fois j'ai fait différemment, le temps de filtrage sur les données étant trop long.
je livre le bébé tel quel
j'ai ajouté une variable privé booléenne ItemDetail, puis j'ai codé l'évènement OnFilter de la listview qui contient je le rappelle Text et Detail, de la manière suivante
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
...
private
ItemDetail : Boolean
...
procedure TForm2.FormCreate(Sender: TObject);
begin
ItemDetail:=False;
...
end;
procedure TForm2.ListView1Filter(Sender: TObject; const AFilter, AValue: string;
var Accept: Boolean);
var Valeur : String;
begin
Valeur:=AValue.Trim.ToLower;
if Nom.IsChecked // case à cocher qui m'indique si je doit faire la recherche sur le texte ou sur le détail
then Accept:= ((not ItemDetail) AND Valeur.StartsWith(AFilter,True)) OR AFilter.IsEmpty // recherche sur item.text
else Accept:= (ItemDetail AND Valeur.Contains(AFilter.Trim.ToLower)) OR AFilter.IsEmpty; // recherche dans item.detail
if Accept then Itemdetail:=false
else ItemDetail:=not ItemDetail;
end; |