Autocomplétion dans un dBGrid
Bonjour,
Je travaille sous Windows 10/11, Lazarus 2.2.6, SQLite 3.42 et la dernière version de ZeosDbo.
J'ai un jeu de données avec un champ de consultation. Je l'édite avec une grille de données. La grille affiche correctement la liste de sélection pour ce champ, mais je n'ai pas trouvé de moyen facile de l'autocompléter...
Le problème semble être que le champ de la liste de sélection utilise une cellule d'édition de type TPickListCellEditor qui dérive d'une TCustomComboBox qui n'implémenterait pas cette fonctionnalité.
Je suis preneur de toute suggestion.
En vous remerciant.
2 pièce(s) jointe(s)
Autocomplétion dans un dBGrid
Bonjour Anapurna,
Merci pour ta réponse, et en effet, je n'ai pas été très explicite dans ma demande.
J'ai 2 fichiers, Chromato et Molecule avec un champ de données de Chromato qui pointe sur le champ de données de Molécule.
J'arrive très bien à afficher les valeurs dans le dBGrid mais impossible d'entrer le moindre caractère et donc de se déplacer sur la valeur la plus proche de ce que je cherche. En sorte, mimer le comportement du dBGrid de Delphi
Exemples pour rechercher la valeur 1.8-
Pièce jointe 640270
Ensuite pas un simple clic sur la valeur, le champ du dBGrid affiche la valeur.
Pièce jointe 640271
En sorte, ce que je chercher, c'est mimer le comportement du dBGrid de Delphi dans ce domaine.
Autocomplétion dans un dBGrid
Bonjour Anapurna,
Merci pour ta réponse.
Je n'avais pas mis dbGrid en édition...
J'ai compris qu'il me fallait 2 listes, l'une complète et l'autre filtrée dans le combo du dBGRid. Cela me paraît un peu nébuleux.
J'ai beaucoup de RDV ces prochains jours, je teste dès que possible.
Autocomplétion dans un dBGrid
Hello Anapurna,
Merci pour tes différentes pistes cela m'a donné des idées. Je me permets de stocker cela dans un fichier pour le tester lorsque je le pourrais.
Pour l'heure, entre 2 RDV, je passe en revue tout ce qui concerne les dBGrid et j'en étudie les différentes options qui sont nombreuses et parfois intriquées... Je m'intéresse notamment goAllwaysShowEditor et à onSelectEditor qui permet d'afficher un contrôle dans le dBGrid...
En te remerciant encore pour le code, je mets le post sur résolu...
Autocomplétion dans un dBGrid
Salut Anapurna,
Merci pour ta dernière piste, cela va agréablement compléter mes investigations dans les arcanes de dBGrid.
Déjà, j'avais oublié quelques propriétés intéressantes... Notamment dans Options, dgAlwaysShowEditor.
Ensuite, il y a onSelectEditor, onEditingDone...
Je vais continuer d'étudier les codes que tu m'as transmis.
Encore merci pour tes solutions.
Autocomplétion dans un dBGrid
Bonjour Anapurna,
J'ai bien lu les codes que tu m'as envoyé et à leur lecture, m'est venu une idée... le filtrage...
J'ai utilisé le code ci-après dans mon dBGrid et cela fonctionne :
Code:
1 2 3
| DataModule1.TVertus.Filtered := False;
DataModule1.TVertus.Filter := 'Upper(Vertu) like ' + QuotedStr(UpperCase(Edit1.Text) + '*');
DataModule1.TVertus.Filtered := True; |
Encore merci pour les pistes suggérées.
Cordialement,
1 pièce(s) jointe(s)
Autocomplétion d'un dBGrid
Salut Anapurna,
Je ne sais pas si cela pourra te servir, mais je te partage mes trouvailles concernant ce que je souhaitais faire... Après de nombreuses recherches, j'ai trouvé ça sur un site en Anglais et ça fonctionne quoiqu'un peu lourd à mettre en oeuvre.
On est loin de la documentation Lazarus avec le onSelectEditor et autre StringCellEditor...
Il faut juste un dBLookUpCombobox et un dBGrid. Donc en résumé, dans le fichier à remplir, il n'y a pas besoin de champ de recherche sur le champ recherché du fichier source et à l'exécution, on peut masquer le dBLookUpCombobox... Et bien sur, cela fonctionne avec un DataModule.
A l'insertion, le dBGrid affiche un champ vierge avec une flèche bas, on clique et la liste source s'affiche, on saisit quelques caractères, le pointeur se déplace sur l'occurrence recherchée ou éventuellement la plus proche et on valide lorsque l'on a trouvé ce que l'on cherche.
Code tel que je l'ai trouvé :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| TForm1.DBGrid1DrawColumnCell (Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (gdFocused in State) then
begin
if (Column.Field.FieldName = DBLookupComboBox1.DataField) then
with DBLookupComboBox1 do
begin
Left := Rect.Left + DBGrid1.Left + 2; //A mon avis on peut virer le +2, c'est purement visuel.
Top := Rect.Top + DBGrid1.Top + 2;
Width := Rect.Right - Rect.Left;
Width := Rect.Right - Rect.Left;
Height := Rect.Bottom - Rect.Top;
Visible := True;
end;
DataCol := 1 ; //Le numéro de la colonne
end;
end;
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
if DBGrid1.SelectedField.FieldName = DBLookupComboBox1.DataField then
DBLookupComboBox1.Visible := False ;
end;
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
Var WM_Char : word = 0;
begin
if (key = Chr(9)) then Exit;
if (DBGrid1.SelectedField.FieldName = DBLookupComboBox1.DataField) then
begin
DBLookupComboBox1.SetFocus;
SendMessage(DBLookupComboBox1.Handle, WM_Char, word(Key), 0);
end;
end; |
Je te joins la fiche de M. Van Canneyt traduite et complétée.
En te remerciant encore d'avoir consacré du temps à mon problème.
Cordialement,