2011-01-04 10 views
4

Je crains que cela puisse être une question de "combien de temps est une pièce de ficelle", mais je me demandais si quelqu'un avait des chiffres ou des conseils.Insertion en haut Rang d'un grand TStringGrid

J'ai un TStringGrid qui pourrait avoir 3 600 lignes, peut-être plus, nous ne sommes pas encore sûrs. Comme le moniteur n'a évidemment pas de place pour cela, seulement 20 ou 30 lignes sont affichées à l'écran. Malheureusement, ceux-ci sont les premiers écrits et l'utilisateur doit faire défiler vers le bas pour voir les lignes comme ils sont ajoutés.

Il peut être plus convivial d'inverser l'ordre des lignes, m avec le plus récent en premier et le plus ancien en dernier. Pour ce faire, je dois faire quelque chose comme ça (le code ne peut pas être exacte)

// slightly quicker if there are many rows & no flicker 
    myStringGrid.Visible := False;  
    rowCount := myStringGrid.RowCount; 
    for row := 1 to Pred(rowCount) do 
     myStringGrid.Rows[row + 1] := myStringGrid.Rows[row]; 
    myStringGrid.RowCount := myStringGrid.RowCount + 1; 
    // now add new row... 
    myStringGrid.Cells[1, 0] := <somthing>; 
    myStringGrid.Cells[1, 1] := <somthing else>; 
    myStringGrid.Cells[1, 2] := <etc>; 
    TestRunDataStringGrid.Visible := True; 

Je suis préoccupé par la performance. Si personne n'a d'expérience, je vais coder un rapport de test &.

me demandais simplement si quelqu'un avait une expérience ou une opinion de le faire ...

+2

Peut-être pourriez-vous utiliser un contrôle "virtuel" à la place? Dites un VirtualTreeView (http://www.soft-gems.net/index.php?option=com_content&task=blogsection&id=2&Itemid=33/) ou un TListView en mode virtuel? –

+2

n'a probablement même pas besoin de mode virtuel pour ce nombre de lignes –

+0

+1 aux deux. Quel dommage que je ne comprends pas ce qu'est un contrôle virtuel: -/Uwe ne semble pas penser que je vais avoir des problèmes avec TStringGrid avec 3.6k ROws (et environ 6 colonnes) – Mawg

Répondre

3

Essayez celui

type 
    TForm1 = class(TForm) 
    StringGrid1: TStringGrid; 
    --- 
    --- 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

    type 
    TStringGridHack = class(TStringGrid) 
    protected 
    procedure InsertRow(ARow: Longint); 
    end; 

implementation 

{$R *.dfm} 


procedure TStringGridHack.InsertRow(ARow: Longint); 
var 
    iRow: Integer; 
begin 
    iRow := Row; 
    while ARow < FixedRows do Inc(ARow); 
    RowCount := RowCount + 1; 
    MoveRow(RowCount - 1, ARow); 
    Row := iRow; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    TStringGridHack(StringGrid1).InsertRow(1); 
end; 
+0

+1 Il ne commente pas vraiment les limites de TSringGrid, mais il améliore mon code hasitilly. Je suppose que MoveRow() peut être légèrement plus rapide que de le faire explicitement. Merci. – Mawg

+1

en fonction de la version de Delphi que vous utilisez, vous pouvez également créer un "class helper" pour que vous n'ayez pas besoin de hardcast chaque fois que vous devez insérer une nouvelle ligne, en outre si vous définissez l'aide de classe dans un utilitaire , vous pouvez profiter de la grille de chaînes "hackée" dans tous les formulaires, cadres, etc, par exemple TStringGridHelper = classe Helper pour TStringGrid et copier le code ci-dessus dans le corps de la classe, amusez-vous :-) – ComputerSaysNo

+1

@Dorin: Ou utilisez simplement le chose simple et fiable du passé - une procédure globale: 'procédure InsertRowIntoStringGrid (AGrid: TStringGrid; ARow: Longint);'. :-P –

1

Je recommande un contrôle de grille virtuelle au lieu de VirtualTreeview. J'en ai un, écrit par Roman Mochalov (Роман Мочалов), que je crois être 100% open source, mais pas beaucoup disponible sur le web. J'ai un link ici [sur skydrive]:

+0

Merci, qui ressemble bien – Mawg