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 :

Auto-suggestion sur une stringgrid


Sujet :

Lazarus Pascal

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 207
    Points : 188
    Points
    188
    Par défaut Auto-suggestion sur une stringgrid
    Bonjour,

    Je souhaiterais qu'une liste s'affiche au fur et à mesure qu'on tape un texte dans la cellule d'un stringgrid.
    La bonne illustration de ce que je souhaite faire est donnée par ce qui se passe quand on tape une requête dans un moteur de recherche : au fur et à mesure de la frappe, des suggestions s'affichent, et il est possible par un simple "entrée" (ou un clic de souris) de sélectionner la suggestion sans taper tout l'ensemble.

    Dans mon cas, les suggestions proviendraient du contenu d'un fichier que je chargerais dans un second stringgrid invisible de l'utilisateur. Les utilisateurs étant parfois rétif à l'utilisation des majuscules, il faut aussi que je m'affranchisse de cela, mais ce n'est pas un gros soucis.

    Avez-vous une piste pour me guider, sachant que mon niveau est celui d'un amateur (voir topic précédent concernant un graphique de type "radar") ?

    Merci

    D.

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    la solution la plus simple est de passer par le inplaceEditor
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 207
    Points : 188
    Points
    188
    Par défaut
    On ne peut pas dire que le wiki soit très prolixe sur cette propriété ni même la doc de Lazarus

    Une doc à me conseiller ?

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    je connais pas parfaitement lazarus
    mais je pense que tu dois faire un truc de ce 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
    // On defini et on utilise le select editor
    procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer; var Editor: TWinControl); 
    begin 
       if aRow= MaColone then 
      begin 
          Editor := (Sender as TStringGrid).EditorByStyle(cbsPickList); 
          TPickListCellEditor(Editor).Items.Assign(FieldList) 
       end
      else 
          Editor := nil; // readonly the rest of rows (or select another editor) 
    end; 
    ...
    procedure TForm1.StringGrid1PickListSelect(Sender: TObject); 
    begin 
     //  C'est ici que tu recuper l'element de la liste
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour diam's.

    Difficile dans ton cas d'utiliser un InplaceEditor du genre ComboBox.
    En effet, on doit "vider" puis "remplir" le ComboBox à chaque caractère frappé.
    Or, l'événement SelectEditor n'est appelé qu'une fois au début de l'édition.
    Et je ne suis pas arrivé non plus à modifier la liste grâce à l'événement OnSetEditText.

    Il y a sans doute mieux, mais la solution que j'ai trouvée est d'utiliser un TListBox indépendant du StringGrid.
    Utilisation de l'événement OnSetEditText pour capturer le texte en cours.
    Recherche dans ton stringgrid caché (tu pourrais utiliser un TStringList).
    Affichage du mot(s) dans le ListBox.
    Clic dans le ListBox pour modifier la valeur de la cellule.
    Inconvénient : ce clic fait perdre la focalisation au stringgrid.

    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
    35
    36
    procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: string);
    begin
       with StringGrid1 do
         if ACol = 1 then
            if Length(Value) < 2 then
               ListBox1.Clear
            else
               SearchNextValue(Value);
    end;
     
    procedure TForm1.SearchNextValue(S: string);
    var
      x, y: integer;
    begin
       ListBox1.Clear;
       S:= LowerCase(S);
       with StringGrid2 do
         for y:= 0 to ColCount - 1 do
            for x:= 0 to RowCount - 1 do
               if Pos(S, LowerCase(Cells[y,x])) = 1 then
                 ListBox1.Items.Add(Cells[y,x]);
    end;   
     
    procedure TForm1.ListBox1Click(Sender: TObject);
    begin
       with ListBox1, StringGrid1 do
         if ItemIndex >= 0 then
            Cells[Col, Row]:= Items[ItemIndex];
    end;
     
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
      var CanSelect: Boolean);
    begin
       ListBox1.Clear;
    end;
    Cordialement
    Thierry

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    pour info le TPickListCellEditor descend du Tcombobox donc je pense qu'il est facile de récupérer les événements comme le OnkeyDown ou autre
    après il faut effectivement gérer la liste en fonction
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    j'ai donc fait un test

    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
     
    TForm1 = class(TForm)
       StringGrid1: TStringGrid;
        procedure FormCreate(Sender: TObject);
        procedure StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
          var Editor: TWinControl);
      private
        FieldList : TStrings;    
       { private declarations }
      public
        { public declarations }
      end;  
    //////////////////////////////////////////////////
    .......
    //////////////////////////////////////////////////
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FieldList := TStringList.Create;
      FieldList.LoadFromFile('C:\Projet\File.txt');
    end;   
    //////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
      var Editor: TWinControl);
    begin
      if Acol = 1 Then
      begin
        Editor := (Sender as TStringGrid).EditorByStyle(cbsPickList);
         TPickListCellEditor(Editor).Items.Assign(FieldList);
         TPickListCellEditor(Editor).AutoComplete := True;
      end
      else
          Editor := nil; // readonly the rest of rows (or select another editor)
    end;
    regarde si ce code te convient
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 207
    Points : 188
    Points
    188
    Par défaut
    j'ai un souci : il m'est impossible de mettre quoi que ce soit dans la grille. Je peux sélectionner une case, mais je ne peux rien y inscrire
    La StringGrid a bien le autoEdit à vrai (ainsi que goEditing)... (ça fait vraiment trop longtemps que je n'ai pas touché à cela).


    Mon source :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
      StringGrid1: TStringGrid;
       procedure FormCreate(Sender: TObject);
       procedure StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
         var Editor: TWinControl);
     private
       FieldList : TStrings;
      { private declarations }
     public
       { public declarations }
     end;
    //////////////////////////////////////////////////
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
     
    //////////////////////////////////////////////////
    procedure TForm1.FormCreate(Sender: TObject);
    var rep : string;
    begin
     FieldList := TStringList.Create;
     rep:=AppendPathDelim(ExtractFilePath(Application.ExeName));
     FieldList.LoadFromFile(rep+'test_auto.txt');
    end;
    //////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
     var Editor: TWinControl);
    begin
     if Acol = 1 Then
     begin
       Editor := (Sender as TStringGrid).EditorByStyle(cbsPickList);
        TPickListCellEditor(Editor).Items.Assign(FieldList);
        TPickListCellEditor(Editor).AutoComplete := True;
     end
     else
         Editor := nil; // readonly the rest of rows (or select another editor)
    end;
     
    end.
    Sinon, j'ai trouvé ce lien sur le forum Delphi : http://www.developpez.net/forums/d11...-manuellement/
    C'est malheureusement basé sur un combobox.

    Si je ne trouve pas de solution, je contournerais via une form à part, ce n'est pas grave.

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    de tete je crois que j'ai mis aussi le ShowAlwayEditor aussi a true ?

    dans mon test tout fonctionne correctement ... je mettrais un zip du projet dés que possible pour voir les différences
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Dans le code d'Anapurna, l'éditeur de la colonne 1 est de type cbsPickList. Donc là tu devrais pouvoir entrer du texte (auto-complete).
    Pour les autres colonnes, l'éditeur = nil, donc pas de saisie possible !

    A remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //...
    else
       Editor := (Sender as TStringGrid).EditorByStyle(cbsAuto); // l'éditeur par défaut
    Cordialement
    Thierry

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Bien vue Thierry,

    j'ai effectivement complètement oublié cette petite astuce, vu que ce n'était que pour un TEST
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 207
    Points : 188
    Points
    188
    Par défaut
    merci, je retesterai (j'ai pa le bon PC sous la main là) et je vous tiens au courant.

    En tout cas, merci du coup de main !

Discussions similaires

  1. Requete Auto jointure sur une table
    Par Guillaume 78 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/11/2007, 09h26
  2. [MySQL] creation de formulaire auto basé sur une table
    Par mj.mj12 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/11/2007, 14h31
  3. Problemes de bordures au clic sur une StringGrid
    Par jmulans dans le forum Delphi
    Réponses: 8
    Dernier message: 27/06/2007, 12h34
  4. auto-incrémentation sur une primary key avec sql server
    Par pops4 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 14h24
  5. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05

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