2009-10-03 4 views
1

Bien que la question semble simple, je ne pouvais pas trouver la réponse.Comment se débarrasser de l'espace vide dans la partie droite de DBGrid Delphi

J'ai un composant DBGrid avec beaucoup de colonnes, et par conséquent, ils ne tiennent pas dans la page et la barre de défilement apparaît. J'ai aussi un mécanisme d'auto-ajustement de colonnes, qui fait que chaque colonne a la largeur de l'élément le plus long de la table. Lorsque je fais défiler DBGrid vers la droite, il y a un espace vide après la dernière colonne. Comment se débarrasser de cet espace?

Une solution que je vois est d'étirer la dernière colonne pour s'adapter à l'espace vide. Mais je ne sais pas comment trouver la longueur de cet espace vide! DbGrid.Width et DbGrid.ClientWidth donnent uniquement la longueur de la pièce, mais pas la longueur réelle de la table. Des indices?

Répondre

1

Je pense avoir trouvé une solution (bien que cela me paraisse un peu étrange). Afin de trouver la différence entre les largeurs de colonnes et la largeur réelle de DBgrid (ce qui signifie trouver la largeur de l'espace vide restant après la dernière colonne), nous devons garder une trace de la colonne affichée à gauche (colonne actuelle c'est défilé vers). Nous pouvons le faire en utilisant l'événement OnDrawColumnCell, car il ne dessine que les colonnes qui défilent maintenant. Ensuite, nous devons calculer la somme des largeurs de toutes les colonnes visibles, et soustraire cela de la largeur de DBGrid. P.S. Désolé pour le mauvais anglais

Code Ex:

 For i:=0 to Last do 
    if Vis[i] then 
    Begin 
     Sum:=Sum+DBG.Columns[i].Width; 
     Inc(Cnt); 
    End; 

    if dgColLines in DBG.Options then 
    Sum := Sum + Cnt; 

    //add indicator column width 
    if dgIndicator in DBG.Options then 
    Sum := Sum + IndicatorWidth; 
    Dif:=DBG.ClientWidth - Sum; 
5

Il n'est pas toujours facile de faire en sorte que DBGrid se comporte comme vous le souhaitez. J'ai décidé d'utiliser des grilles db alternatives après un projet avec la mise en œuvre standard et je n'ai jamais regardé en arrière.

Si vous pouvez utiliser une autre grille, vous avez le choix entre plusieurs options. Il y a même un sujet here on SO avec beaucoup de pointeurs. Parmi les options libres avec source, j'ai toujours été très friands du projet JVCL.

Juste un dernier conseil: il y a des grilles qui offrent des options et des possibilités de personnalisation au-delà de ce dont vous pouvez rêver. Soyez conscient qu'il y a un coût attaché à ce degré de liberté, par ex. il peut rendre le composant lent, difficile à intégrer dans votre code, ou les deux.

1

La ci-dessous réponse est assez bonne, mais pas du tout efficace parce qu'il est placé en cas OnDrawColumnCell, donc s'il y a un grand nombre de lignes et/ou des collunes, la performance pourrait tomber. Au lieu de cela, placez le même code pas dans un événement de peinture, mais dans l'événement AfterOpen (et AfterRefresh) de l'ensemble de données source afin de l'exécuter une seule fois pour chaque ensemble de résultats.

Questions connexes