Voir le flux RSS

Blog de Serge Girard (aka SergioMaster)

[FMX] Une combobox aux petits oignons

Noter ce billet
par , 17/02/2019 à 09h59 (406 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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 41
Taille : 11,8 Ko

Ce qui donne à l'exécution ce genre de résultat (vous excuserez la censure).
Nom : Capture2.PNG
Affichages : 37
Taille : 4,4 Ko

Peu de code est nécessaire pour remplir la liste, grâce aux Livebindings.
Nom : Capture3.PNG
Affichages : 38
Taille : 17,7 Ko

Quelques évènements restent à écrire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.

Envoyer le billet « [FMX] Une combobox aux petits oignons » dans le blog Viadeo Envoyer le billet « [FMX] Une combobox aux petits oignons » dans le blog Twitter Envoyer le billet « [FMX] Une combobox aux petits oignons » dans le blog Google Envoyer le billet « [FMX] Une combobox aux petits oignons » dans le blog Facebook Envoyer le billet « [FMX] Une combobox aux petits oignons » dans le blog Digg Envoyer le billet « [FMX] Une combobox aux petits oignons » dans le blog Delicious Envoyer le billet « [FMX] Une combobox aux petits oignons » dans le blog MySpace Envoyer le billet « [FMX] Une combobox aux petits oignons » dans le blog Yahoo

Mis à jour 21/02/2019 à 15h15 par SergioMaster

Catégories
Programmation , Delphi , FMX

Commentaires

  1. Avatar de ALWEBER
    • |
    • permalink
    Serge, pour revenir sur ton post d'aujourd'hui (26/02/2019).
    1) Le fait de déclarer TCombobox = class(TCombobox) est une anomalie de programmation qui ne devrait pas exister. Ce que fait Delphi c'est que ne pouvant résoudre cette egalité il le traduit par TCombobox = class(Tobject) donc l'ancêtre primordial. Donc dans la complétion du code tu ne verras que les éléments du TObject et pas les counts, items et autres
    2) J'ai refait les tests le comportement est bien le même en VCL et FMX.
    3) Delphi n'accepte pas que deux composants aient le même nom. Donc si tu veux quand même le faire il faut retirer le composant du même nom du package de base de Delphi et mettre le tient à la place
    Bonne fin de journée
  2. Avatar de SergioMaster
    • |
    • permalink
    Ton commentaire est hors billet. Ici je propose une alternative au TCombobox mais il n'est nulle question d'y créer une nouvelle classe contrairement à la discussion évoquée.