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

Bases de données Delphi Discussion :

Hint sur chaque ligne d'un DBgrid


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut Hint sur chaque ligne d'un DBgrid
    Je veux faire apparaitre un message d'information dans une bulle style "hint" lorsque le pointeur de la souris passe sur les lignes d'un dbgrid ( le hint renvoie en pratique la valeur d'une requete "fille").
    Cela fonctionne la premiére fois que la souris passe sur le dbgrid mais n'est pas remis à jour tant qu'elle n'en sort pas, sauf si je clique sur un champ.

    Comment automatiser ce fonctionnement ?

    En simulant un clic par mouse_event et en faisant défiler le grid par des move by les résultats sont difficiles à controler et interfére avec un eventuel événement 'OnClick' du grid.

    Est il possible de 'réactiver' le message sans sortir du grid ?

    Merci de vos conseils.

    DELPHI 7 et Interbase 6

  2. #2
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Je veux faire apparaitre un message d'information dans une bulle style "hint" lorsque le pointeur de la souris passe sur les lignes d'un dbgrid ( le hint renvoie en pratique la valeur d'une requete "fille").
    Cela fonctionne la premiére fois que la souris passe sur le dbgrid mais n'est pas remis à jour tant qu'elle n'en sort pas, sauf si je clique sur un champ.
    Sur quel événement est-ce que tu as placé l'execution de la requete fille?
    Il ne colle peut-être pas exactement à ce que tu veut faire...?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    La requête affichée par le dbgrid est le datasource de la requête fille.
    Les rangées du dbgrid sont parcourues en déplaçant le pointeur de la souris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TfData_PAT.dbgGridMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
        gridCoord:= dbgGrid.MouseCoord(X,Y);              //gridcoord  :  TGridcoord globale
        dbgGrid.SelectedIndex := gridCoord.X-1;
        dbgGrid.DataSource.DataSet.MoveBy(gridcoord.Y-refY);
        dbgGrid.Hint := dm.ibdsRemarquesREM.Value;    // IBDataset fille
        statusbar.Panels[0].Text :=  dm.ibdsRemarquesREM.Value;
        refY := gridcoord.Y;                                      // refY : integer  globale
    end;
    le déplacement du curseur fait apparaître dans la statusBar la réponse correspondant effectivement à la rangée sous jacente.

    La solution (?) serait de redéclencher l'affichage du hint à chaque changement de rangée !

  4. #4
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    l'affichage des infobulles hint est assez long...
    Même en restant longtemps sur une nouvelle ligne, le hint ne se met pas à jour?

    Mais effectivement, si tu provoques le réaffichage du hint, ca devrait marcher. Peut-être comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TfData_PAT.dbgGridMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
        gridCoord:= dbgGrid.MouseCoord(X,Y);              //gridcoord  :  TGridcoord globale
        dbgGrid.SelectedIndex := gridCoord.X-1;
        dbgGrid.DataSource.DataSet.MoveBy(gridcoord.Y-refY);
        dbgGrid.ShowHint := false ;
        dbgGrid.Hint := dm.ibdsRemarquesREM.Value;    // IBDataset fille
        dbgGrid.ShowHint := true ;
        statusbar.Panels[0].Text :=  dm.ibdsRemarquesREM.Value;
        refY := gridcoord.Y;                                      // refY : integer  globale
    end;
    Mais cela risque de provoquer des erreurs d'affichage...
    Peut-être juste comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TfData_PAT.dbgGridMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
        gridCoord:= dbgGrid.MouseCoord(X,Y);              //gridcoord  :  TGridcoord globale
        dbgGrid.SelectedIndex := gridCoord.X-1;
        dbgGrid.DataSource.DataSet.MoveBy(gridcoord.Y-refY);
        dbgGrid.Hint := dm.ibdsRemarquesREM.Value;    // IBDataset fille
        dbgGrid.ShowHint := true ;
        statusbar.Panels[0].Text :=  dm.ibdsRemarquesREM.Value;
        refY := gridcoord.Y;                                      // refY : integer  globale
    end;

  5. #5
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,
    J'ai peut être une solution bien que je ne soit pas tout a fait sur qu'elle soit adaptable aux composants utilisés...
    Je suis ici sur le 'cousin' Builder mais je pense que c'est tout a fait traduisible tout de même.
    Dans le OnMouseMove, c'est tres similaire a ce qui a été fait et/ou proposé :
    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
     
    int depl; String S;
    DBGrid1->Hint = "";
    DBGrid1->ShowHint = false;
    aCoord = DBGrid1->MouseCoord(X, Y);
    if (aCoord.Y > -1 && aCoord.X > 0)
    {
    depl = aCoord.Y - DBGrid1->DataSource->DataSet->RecNo;
            DBGrid1->DataSource->DataSet->MoveBy(depl);
            S = DBGrid1->Fields[aCoord.X - 1]->AsString;
            if ( DBGrid1->Hint !=  S )
            {
                    DBGrid1->Hint = S;
            }
            DBGrid1->ShowHint = true;
    }
    Puis j'ai profité du fait que j'utilisais une TTable et un TDataSet pour l'affichage dans le DBGrid, et dans le TTable j'utilise l'évènement AfterScroll:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TForm4::Table2AfterScroll(TDataSet *DataSet)
    {
    PostMessage( DBGrid1->Handle, WM_NCMOUSEMOVE, HTVSCROLL, NULL);        
    }
    Dans ce que j'ai testé, il semble que le fait de 'forcer' et/ou simuler le survol d'une zone non client de l'objet permet le réaffichage du Hint...

    En espérant que cela aide...
    @ +
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  6. #6
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Re,
    Je viens de regarder, a priori, si je ne me trompe pas trop, les composants IBDataSet ont un évènement OnAfterScroll eux aussi...
    Donc, ça devrait le faire...
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    NO WAY !

    Pour Alyx2 : la modification de la propriété showhint ne "réactive" pas l'affichage...

    Pour SunChaser : l'événement AFTERSCROLL après avoir simulé un passage en zone non cliente ne réveille toujours pas le hint !

    La seule ( mauvaise ) solution est de simuler un clic de souris par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    ce qui a pour double inconvénient:
    • de faire passer la cellule en mode édition ( c'est pas beau )
    • de simuler un double clic ( que j'aimerais utiliser pour d'autres fonctions)


    Je vais essayer de traquer les messages avec Winsight pour essayer de simuler la chose ( mais je ne maîtrise pas trop la bête )

    Merci de toutes façons de vos avis méritants

  8. #8
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par Papino
    Pour SunChaser : l'événement AFTERSCROLL après avoir simulé un passage en zone non cliente ne réveille toujours pas le hint !
    Bonjour,

    Ce truc marche chez moi....l'évènement AftersScroll, je ne l'utilise pas apres
    J'ai mis le 'PostMessage(...)' dedans, puisque dans le code de ton OnMouseMove tu déplacait le curseur dans la table en fonction de la ligne survolée....il y avait donc un évent AfterScroll...

    @ +
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    And the winner is... Sunchaser

    Après un peu d'errance ( la position du message par rapport au Afterscroll et le OnMouseMove... ) ça marche effectivement !

    Pour les "Delphiniens" la syntaxe du message est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage( DBGrid1.Handle, WM_NCMOUSEMOVE, HTVSCROLL, 0);
    le NULL renvoit une erreur d'exécution ( incapable de transformer un variant en entier ! )

    Merci 1000 fois !

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 10/02/2007, 12h02
  2. Réponses: 2
    Dernier message: 10/11/2006, 14h23
  3. Réponses: 5
    Dernier message: 28/07/2006, 08h16
  4. somme sur plusieurs lignes d'un dbgrid
    Par pierrot67 dans le forum Bases de données
    Réponses: 11
    Dernier message: 11/07/2006, 10h24
  5. [vb.net][dataView] test sur chaque lignes
    Par arnolem dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/02/2006, 10h52

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