par , 17/02/2019 à 09h59 (2509 Affichages)
Dans le précédent billet je m’étais penché sur quelques propriétés d’un TListView et, en particulier, sa boîte de recherche non accessible directement. Par effet de hasard, ce billet m'a permis de fignoler une zone de saisie se comportant à la manière d'un TCombobox.
Mon objectif était de fournir une boîte de sélection pour obtenir un code particulier. Mon premier choix s’est d’abord porté, bien évidemment sur un TCombobox mais un TCombobox FMX est loin d'arriver à la cheville d'un TDBLookupComboBox VCL et son manque d’auto complétion ainsi que les contraintes que l’implémentation de cette fonctionnalité impose :
- Écriture d’un composant ;
- Recherche en fonction du début de chaîne, ce qui impose un tri strict,
me laissaient dubitatif.
Je suis donc parti dans une toute autre direction. J’ai remplacé ce TComboBox par un TEdit auquel j’ai adjoint un TListView qui ne sera visible que si l’utilisateur en fait la demande.
1 2 3 4
| procedure TForm1.SearchEditButton1Click(Sender: TObject);
begin
ListeClients.Visible:=True;
end; |
Le TlistView est enfant du TEdit pour plus de facilité.
![Nom : Capture1.PNG
Affichages : 662
Taille : 11,8 Ko](https://www.developpez.net/forums/attachment.php?attachmentid=450689&d=1550390340)
Ce qui donne à l'exécution ce genre de résultat (vous excuserez la censure).
![Nom : Capture2.PNG
Affichages : 677
Taille : 4,4 Ko](https://www.developpez.net/forums/attachment.php?attachmentid=450693&d=1550390874)
Peu de code est nécessaire pour remplir la liste, grâce aux Livebindings.
![Nom : Capture3.PNG
Affichages : 644
Taille : 17,7 Ko](https://www.developpez.net/forums/attachment.php?attachmentid=450697&d=1550391759)
Quelques évènements restent à écrire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
// cacher la liste en cas de sortie (clic dans une autre zone de la forme
procedure TForm1.ListeClientsExit(Sender: TObject);
begin
ListeClients.Visible:=False;
end;
// gérer la sélection de l'élément
procedure TForm1.ListeClientsItemClick(const Sender: TObject;
const AItem: TListViewItem);
begin
// SearchClient.Text:=LeftStr(AItem.Text,4); // première solution, traitement du texte affiché
// SearchClient.Text:=AItem.Detail; // deuxième solution, la valeur souhaitée est reportée, seule, dans une zone de l'item de liste (cachée ou non)
SearchClient.Text:=Datas.FDClientsNUM_CLIENT.AsString; // troisième solution, rendu possible par la synchronisation
ListeClients.Visible:=False;
end; |
Me restait à trouver le moyen d’annuler une recherche, par exemple via la touche Escape.
1 2 3 4 5 6 7 8 9 10 11
|
// Abandon de la recherche par utilisation de la touche Escape
procedure TForm1.ListeClientsKeyDown(Sender: TObject; var Key: Word;
var KeyChar: Char; Shift: TShiftState);
begin
if Key=vkEscape then
begin
ListeClients.Visible:=False;
TEdit(ListeClients.Parent).SetFocus;
end;
end; |
Toutefois, le code ci-dessus ne fonctionnait pas, impossible d’intercepter l’utilisation de cette touche à l’intérieur de la boîte de recherche! C’est là où le précédent billet a pris le devant, dans la liste des unités utilisées j'ai ajouté FMX.SearchBox.
1 2 3 4 5 6
|
uses ... FMX.SearchBox;
type
TForm1 = class(TForm)
... |
Il m'a fallu, ensuite, associer l'évènement déjà codé ListeClientsKeyDown à la boîte de recherche.
1 2 3 4 5 6 7 8
| procedure TForm1.FormCreate(Sender: TObject);
begin
// ouverture du fichier Clients
Datas.FDClients.Active:=True;
// association de l'évènement
if ListeClients.controls[1].ClassType = TSearchBox
then TSearchBox(ListeClients.controls[1]).OnKeyDown:=ListeClientsKeyDown;
end; |
Pour parfaire l'illusion il est possible de rajouter un TFloatAnimation sur des propriétés (hauteur, largeur ..) du TListView en complément de son affichage.