IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Autocomplétion dans un dBGrid [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé
    Homme Profil pro
    Phyto-aromathérapeute
    Inscrit en
    Juillet 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Phyto-aromathérapeute
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 83
    Par défaut 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. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 489
    Par défaut
    Salut

    Je n'ai pas tout compris.

    Si j'étais toi je me ferais une méthode du genre :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    procedure TMYFORM.SetupGridPickList(DBG : TDBGRID;const FieldName, sql: string);
    var
      slPickList:TStringList;
      i : integer;
      QrDatas : TQuery;
    begin
      slPickList:=TStringList.Create;
      try
        data.CloseQuery(QrDatas);
        QrDatas.SQL.Clear;
        QrDatas.SQL.Add(Sql) ;
        data.OpenQuery(QrDatas);
        //On remplis la liste de completion 
        while not QrDatas.EOF do
        begin
          slPickList.Add(QrDatas.Fields[0].AsString);
          QrDatas.Next;
        end; //while
     
        //place the list it the correct column
        for i:=0 to DBG.Columns.Count-1 do
          if DBG.Columns[i].FieldName = FieldName then
          begin
            DBG.Columns[i].PickList:=slPickList; // Ici on l'affecte a la bonne cellule 
            Break;
          end;
      finally
        slPickList.Free;
        CloseQuery(QrDatas);
      end;
    end; (*SetupGridPickList*)

  3. #3
    Membre confirmé
    Homme Profil pro
    Phyto-aromathérapeute
    Inscrit en
    Juillet 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Phyto-aromathérapeute
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 83
    Par défaut 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-

    Nom : Exemple 1.8.jpg
Affichages : 329
Taille : 55,7 Ko

    Ensuite pas un simple clic sur la valeur, le champ du dBGrid affiche la valeur.

    Nom : Exemple résultat.jpg
Affichages : 318
Taille : 25,3 Ko

    En sorte, ce que je chercher, c'est mimer le comportement du dBGrid de Delphi dans ce domaine.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 489
    Par défaut
    Salut

    Pour la saisie, as-tu vérifié que ton champs soit éditable ?

    TDBGrid(Sender).EditorMode := True;
    Pour que l'autocomplétion fonctionnne il Faut "filtrer" ton combo dans la methode onchange de ton combobox.
    Pour cela il va falloir gérer deux listes... une complète et une filtrée (affichée dans le combo).
    Le filtre ne fait que trier la liste complète et la réinscrire dans le combo.

  5. #5
    Membre confirmé
    Homme Profil pro
    Phyto-aromathérapeute
    Inscrit en
    Juillet 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Phyto-aromathérapeute
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 83
    Par défaut 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.

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 489
    Par défaut
    Salut

    je vois un truc du genre

    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
    17
    18
    19
    procedure FilterItems(Grid : TDbGrid;FStoredItems : TStrings;Col : Integer;Text : String );
    var
      I: Integer;
    begin
      Grid.Columns[Col].PickList.BeginUpdate;
      try
        if Text <> '' then
        begin
          Grid.Columns[Col].PickList.Clear;
           for I := 0 to Pred(FStoredItems.Count) do
             if ContainsText(FStoredItems[I], Text) then
     	    Grid.Columns[Col].PickList.Add(FStoredItems[I]);
        end
        else
          Grid.Columns[Col].PickList.Assign(FStoredItems)
      finally
        Grid.Columns[Col].PickList.EndUpdate;
      end;
    end;

  7. #7
    Membre confirmé
    Homme Profil pro
    Phyto-aromathérapeute
    Inscrit en
    Juillet 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Phyto-aromathérapeute
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 83
    Par défaut 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...

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 489
    Par défaut
    Salut

    J'ai retrouvé une de mes interventions qui déjà à l'époque évoquait cette demande, en espérant que cela te permette d'avancer dans ta recherche.


    lazarus auto-suggestion stringgrid

  9. #9
    Membre confirmé
    Homme Profil pro
    Phyto-aromathérapeute
    Inscrit en
    Juillet 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Phyto-aromathérapeute
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 83
    Par défaut 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.

  10. #10
    Membre confirmé
    Homme Profil pro
    Phyto-aromathérapeute
    Inscrit en
    Juillet 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Phyto-aromathérapeute
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 83
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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,

  11. #11
    Membre confirmé
    Homme Profil pro
    Phyto-aromathérapeute
    Inscrit en
    Juillet 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Phyto-aromathérapeute
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2012
    Messages : 83
    Par défaut 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 : 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
    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,
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri des valeurs dans un DBGrid
    Par soviet dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/06/2015, 14h18
  2. hauteur de ligne dans un DBGrid
    Par mustang-gx dans le forum Bases de données
    Réponses: 9
    Dernier message: 15/03/2004, 20h27
  3. inserer une image dans un dbgrid delphi
    Par cello dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/02/2004, 18h51
  4. Données dans une DBgrid
    Par camino dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/02/2004, 03h40
  5. lenteur d'affichage de requete dans un DBGrid
    Par nico27 dans le forum InterBase
    Réponses: 9
    Dernier message: 23/06/2003, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo