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

Composants VCL Delphi Discussion :

Synchro horizontale de 2 TDBGrid identiques


Sujet :

Composants VCL Delphi

  1. #1
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut Synchro horizontale de 2 TDBGrid identiques
    Bonjour

    J'ai un petit soucis et je trouve pas de solution propre.

    J'ai 2 TDBGrid qui possèdent strictement les mêmes colonnes.
    Une au dessus, une en dessous.

    Dans le cas ou toutes les colonnes ne peuvent pas tenir dans la largeur de l'écran, j'aimerai rendre une des 2 grilles (celle du haut), dépendante du scroll horizontale de l'autre grille (celle du bas).
    -> Afin d'avoir toujours le bon alignement entre ma grille du haut et du bas.

    J'ai regardé dans les sources des TCustomGrid et autre, toutes les variables de scroll sont bien planquées en private
    D'autre part, je tiens à garder mon type TDBGrid...

    Si quelque avait une soluce

    Merci !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Remarque :Curieusement, TDbgrid hérite de TCustomGrid, mais dans la doc Delphi et à la conception on ne voit pas l'event "OnTopleftChange". on ne voit pas non plus dans la doc la propriété "Leftcol" : .
    Il ne s'agit pourtant pas de fonctions définies comme abstract.

    Suggestion :Tu peux peut-être, essayer de définir dans le code l'événement "OntopLeftChange" de la dbgrid1 (c'est pas possible à la conception). Si le compilo rale, tu castes sur TcustomGrid. Dans l'event "OntopLeftChange", il suffirait de faire Grid2.Leftcol=Grid1.leftcol (en castant si necessaire) pour aligner les scroll.

  3. #3
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Merci pour ta réponse Graffito.
    Ta réponse m'a donnée des idées.

    Le probleme c'est que LeftCol est Private sur TCustomGrid, TCustomDBGrid et TDBGrid

    Au contraire de TCustomDrawGrid (dérivant également de TCustomGrid) qui rend cette propriétée publique.

    Donc dans TDBGrid, même en castant sur ses peres, on ne peut pas atteindre LeftCol.

    Mais bon... La source Delphi de TDBGrid comportait plusieurs bug (reconnus) et j'ai du la modifier manuellement auparavant. Donc je vais en profiter pour rendre public LeftCol
    (pas bien! mais compatibilité ascendante 100% )

    OU BIEN, autant cette méthode est sure mais pas très propre
    j'ai trouvé une autre solution

    C'est effectivement en castant avec TDrawGrid.
    Ca marche.
    Mais là... je ne sais pas quel risque je prends en castant avec le type d'un 'frère' (et non d'un père...). A priori aucun, puisque la propriété est strictement la même dans TDrawGrid, seulement publiée en +...?
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    J'ai confondu le TcustomGrid et le TcustomDrawGrid.

    Pour pouvoir caster sur la classe frere via "TcustomDrawGrid(dbgrid1.Leftcol)", il faudrait que :
    - la property LeftCol ne soit pas redéfinie par le TcustomDrawGrid (c'est le cas, elle est simplement publiée),
    - les méthodes SetLeftCol et GetLeftCol ne fassent appel qu'à des méthodes du TcustomGrid (c'est aussi le cas),
    - que les méthode appelées, elles-mêmes, n'appelent pas de méthodes redéfinies par le TCustomDrawGrid et ainsi de suite (là, j'ai pas bien vérifié) ...

  5. #5
    Membre expérimenté

    Profil pro
    Personnel
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Personnel

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Par défaut
    Salut TicTacToe,
    Pourquoi pas 2 DBGrids liés par 1 même Datasource, pointant sur la Table ?
    Tu définis dans chaque DBGrid les colonnes qui t'intéressent.
    Et de ce fait, n'importe quelle action sur 1 DBGrid, entraîne la modif de l'enregistrement de la Table, et de ce fait, du 2ème DBGrid.
    @+
    Fabrice

  6. #6
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Bonjour MFDev,

    Je crois que tu n'as pas bien saisie ma question.

    1. même si je liais mes 2 DBGRid au même DataSource, les scrolls horizontaux ne seraient pas synchro puisque c'est une information de DBGRid. (pas testé mais ce serait logique)

    2. De plus j'aurais strictement les mêmes données dans les 2 grilles, or cela n'a pas bcp d'interet, même si les 2 grilles pointent sur la même table avec les mêmes colonnes, les données affichées sont différentes. (filtres, range...)

    Donc je crois que je vais choisir la solution du cast sur cousin/frere, car en voyant les sources Delphi, il ne devrait pas y avoir de probleme pour acceder aux bonnex propriétés normalement private du DBGrid.

    Dans tous les cas, merci MFDev d'avoir posté
    Merci Graffito pour m'avoir mis sur cette voie

    a++
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  7. #7
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut,

    bon j'arrive après la bagarre, mais j'ai ça comme solution:
    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
     
    TForm1 = class(TForm)
      // ...
    private
      OldGridProc: TWndMethod;
      procedure GridWindowProc(var Message: TMessage);
     
    //...
    Implementation
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      OldGridProc := DBGrid1.WindowProc;
      DBGrid1.WindowProc := GridWindowProc;
    end;
     
    procedure TForm1.GridWindowProc(var Message: TMessage);
    begin
      OldGridProc(Message);  // Envoyer le message vers DBGrid1
      // Envoyer message identique vers DBGrid2
      if Message.Msg = WM_HSCROLL then
        SendMessage(DBGrid2.Handle, WM_HSCROLL, Message.WParam, Message.LParam);
    end;
    Ca fonctionne sur mon test.
    NB: Ne fonctionne que de DBGrid1 vers DBGrid2. Pour faire une double synchro, euh là attention aux appels récursifs !

    @+ Claudius

  8. #8
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Bon, je revenenais pour mettre (presque) résolu

    Ca fonctionne bien de caster avec TDrawGrid et d'utiliser la propriété 'LeftCol', ce qui parait normal vu les discussions du dessus.

    Par contre, comme prévu, l'assignation avec l'evt. TopLeftChanged ne fonctionne pas (violation), normal puisque cet méthode n'est définie qu'à partir de TCustomDrawGrid, donc dans la branche soeur de TCustomDBGrid

    Je fais donc ma synchro sur DBGridColEnter, satisfaisant.
    Sauf qu'effectivement, la synchro se fait seulement lorsque le focus cellule change, et non quand l'ascenseur horizontal est déplacé.

    Ta solution Claudius m'a l'air très sympa, je vais l'essayer de ce pas, puisque visiblement cela fera 1 pierre de coup / à l'ascenseur.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  9. #9
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Bravo pour la solution avec les messages Claudius.

    En fait cela ne fait pas une 1 pierre 2 coups, mais 1 pierre 2eme coup.

    Le messages n'étant appelé que lorsque le user touche à la scrollbar.
    Lorsque le focus cellule change, ce msg n'est pas appelé, et la 2eme grille pas synchronisée.

    Mais c'est pas grave, puisque la solution d'avant faisait 1 pierre 1er coup sur le focus cellule

    Donc les solutions sont complémentaires

    MERCI A TOUS !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  10. #10
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Re-salut TicTacToe,

    Le messages n'étant appelé que lorsque le user touche à la scrollbar.
    Lorsque le focus cellule change, ce msg n'est pas appelé, et la 2eme grille pas synchronisée.

    Mais c'est pas grave, puisque la solution d'avant faisait 1 pierre 1er coup sur le focus cellule
    Alors hop une petite optimisation !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.GridWindowProc(var Message: TMessage);
    begin
      case Message.Msg of
        WM_HSCROLL:
          SendMessage(DBGrid2.Handle, WM_HSCROLL, Message.WParam, Message.LParam);
        WM_KEYDOWN, WM_KEYUP:
          if Message.WParam in [VK_TAB, VK_LEFT, VK_RIGHT] then
            SendMessage(DBGrid2.Handle, Message.Msg, Message.WParam, Message.LParam);
      end;
      OldGridProc(Message);
    end;
    Ca a l'air de fonctionner correctement ! Pour être parfaitement complet il doit y avoir d'autres VK_... à traiter: Home, End, ....

    Voilà l'idée est là !
    Salut et Bon dev,
    Claudius.

  11. #11
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Yep bonne idée de prendre le max de msg

    mais en fait je vais rester à ne gérer que le 1er message (le scrollbar)

    si je traite VK_LEFT par exemple, il me synchroniserais également lorsque je suis en edition dans une cellule, et alors il faudrait que je prenne ceci en compte...
    le cast me prends 1 seule ligne dans le DBGridCol et marche quelquoi la manière de changement de col. et comme je suis feignant

    merci encore !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

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

Discussions similaires

  1. Oter la barre de défilement horizontale d'un TDBGrid
    Par adelavarenne dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/06/2004, 15h37
  2. VGA : synchro verticale (et horizontale ?)
    Par Blustuff dans le forum Assembleur
    Réponses: 19
    Dernier message: 21/06/2003, 08h46
  3. Dimensions des colonnes d'un TDBGrid
    Par osmose22 dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/12/2002, 11h27
  4. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57
  5. balises identiques
    Par Phmichel dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 28/10/2002, 09h18

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