2010-11-06 3 views
3

Dans Delphi 2010, j'ai besoin d'afficher une grille qui a une barre de défilement horizontale avec environ 15 colonnes x 5 lignes. J'ai choisi d'utiliser un StringGrid.Mise à jour en direct de StringGrid lorsque la barre de défilement horizontale est en mouvement?

Cependant, alors que le bouton de la souris est enfoncé en faisant glisser la barre de défilement horizontale, je veux que la grille fasse défiler en direct.

Le composant StringGrid, il apparaît, ne défile pas en direct. Il attend que le bouton de la souris soit relâché avant de mettre à jour la colonne et de faire défiler si nécessaire.

De même, le bouton de la barre de défilement horizontale (c'est ce que l'on appelle) n'est pas proportionnel au nombre de colonnes. Et pour une flèche vers le bas quand sur la rangée du bas pour aller en haut de la colonne suivante vers la droite ...

Cela ressemble à des besoins communs, donc j'ai été surpris de ne pas les trouver dans TStringGrid.

Des suggestions pour contourner ces deux problèmes? Je peux utiliser un composant DbGrid ou un autre composant standard, mais je préfère ne pas utiliser une grille commerciale si je peux l'éviter. Et je ne vais pas utiliser shareware ou freeware ...

TIA

Répondre

3

Pour la première question, vous pouvez définir goThumbTracking dans le Options de StringGrid au moment de la conception ou à l'exécution:

StringGrid1.Options := StringGrid1.Options + [goThumbTracking];


Pour la troisième question, vous pouvez fournir les fonctionnalités dont vous avez besoin en utilisant l'événement du clavier les gestionnaires du contrôle. Un exemple;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
var 
    StringGrid: TStringGrid; 
begin 
    StringGrid := Sender as TStringGrid; 
    case Key of 
    VK_DOWN: 
     if StringGrid.Row = StringGrid.RowCount - 1 then begin 
     Key := 0; 
     StringGrid.Row := StringGrid.FixedRows; 
     if StringGrid.Col = StringGrid.ColCount - 1 then 
      StringGrid.Col := StringGrid.FixedCols 
     else 
      StringGrid.Col := StringGrid.Col + 1; 
     end; 
    VK_UP: //...; 
    VK_RIGHT: //; 
    VK_LEFT: //; 
    end; 
end; 


Pour la deuxième question, le code de défilement semble être enterré dans des méthodes privées de TCustomGrid. Je n'ai aucune idée de comment y parvenir ..

+0

Merci, Sertac. Je n'avais pas remarqué l'option goThumbTracking. Fonctionne très bien. J'ai manipulé les touches fléchées dans OnKeyDown d'une manière similaire à votre code suggéré. (Merci de l'avoir ajouté à votre réponse.) Et je renoncerai à agrandir le pouce. Merci encore! – RobertFrank

3

Si remarqué que vous n'êtes pas intéressé par des composants tiers - Freeware, je ne suis pas friand de ces non plus, mais nous devons tous faire des sacrifices parfois si nous voulons résoudre les problèmes. C'est un de ces sacrifices! Ce composant est bon à ignorer. Vous ne créerez pas quelque chose comme vous-même si vous n'avez pas quelques années de temps libre.

Soit écrire un nouveau composant à base de TStringGrid (je ne voudrais pas - ce n'est pas le meilleur outil dans la boîte pour commencer)

Mais prendre un certain temps et apprendre TVirtualStringTree. Le composant a des années d'avance sur TStrignGrid. La source est disponible et il y en a beaucoup qui l'utilise.

Et il y a des événements déjà mis en œuvre pour réagir sur scrollbar changements OnScroll, OnShowScrollbar

http://www.delphi-gems.com/index.php?option=com_content&task=view&id=12&Itemid=38

Recherche sur stackoverflow et vous pouvez lire beaucoup plus sur tvirtualstringtree

+0

+1 VirtualTreeView est un excellent composant, sinon le meilleur composant.C'est un concept très intelligent et bien implémenté. – Remko

+0

+1 pour la suggestion TVirtualStringTree – RobertFrank

0

Deuxièmement, la suggestion d'utiliser TVirtualStringTree. Travailler avec le composant TStringGrid, c'est comme vous poignarder dans le ventre avec un ciseau rouillé.

Questions connexes