2013-05-03 38 views

Antwort

11

Wenn der Code, den Sie nur versucht haben, die letzte Zeile löscht, dann sind Sie wahrscheinlich nur Erniedrigen der RowCount Eigentum. Das macht in der Tat immer seine Änderungen an der Ende der Liste der Zeilen. In diesem Sinne könnten Sie Code schreiben, um sicherzustellen, dass die Zeile, die Sie nicht mehr wollen, die am Ende ist, und dann löschen Sie die letzte Zeile. (Der direkteste Weg wäre, bewegen die Reihe, und es gibt eine MoveRow Methode, aber es ist geschützt. Wenn Sie es wünschen geschützten Methoden nennen, aber man kann auch nur call DeleteRow statt.)

Mit nur öffentlich und veröffentlichte Mitglieder, ist es möglich, eine Schleife zu schreiben, die eine beliebige Zeile löscht. Zum Beispiel, hier ist ein Code, inspiriert von Scalabium Software's FAQ on this topic:

procedure DeleteRow(Grid: TStringGrid; ARow: Integer); 
var 
    i: Integer; 
begin 
    for i := ARow to Grid.RowCount - 2 do 
    Grid.Rows[i].Assign(Grid.Rows[i + 1]); 
    Grid.RowCount := Grid.RowCount - 1; 
end; 

Es kopiert den Inhalt jeder Zeile unter diejenige, die Sie wünschen oben in die Zeile zu löschen. Am Ende der Schleife wurde die Zeile, die Sie löschen möchten, überschrieben (in der Zeile unmittelbar darunter) und es gibt zwei Kopien der letzten Zeile. Dann löscht es einfach die letzte Zeile.

Um die aktuelle Zeile des Gitters, rufen Sie die Funktion wie folgt zu löschen:

DeleteRow(Grid, Grid.Row); 
+0

hinzuzufügen, wenn Sie Objekte benötigen (wie ich, dynamisch Daten in Zellen aus dem Objekt anstelle von Zellinhalten Zeichnung) , dann ersetzen Sie die zweite Zeile durch 'Grid.Objects [0, I]: = Grid.Objects [0, I + 1];'. Dies ist ein bisschen schneller, als den gesamten Inhalt zu ersetzen, der nicht einmal benutzt wird. –

9

Die ausgewählte Zeile des Rasters wird durch die Eigenschaft angegeben.

TCustomGrid hat eine DeleteRow Methode, aber es ist geschützt, so dass Sie es nur innerhalb von Nachkommen dieser Klasse aufrufen können. Es ist jedoch leicht, diese Einschränkung zu umgehen. Deklarieren Sie einen Nachkommen TCustomGrid, und geben Sie dann Ihr Gittersteuerelement auf diesen neuen Typ ein. Rufen Sie DeleteRow auf das Ergebnis. Diese

type 
    TCustomGridAccess = class(TCustomGrid) end; 

procedure DeleteGridRow(g: TCustomGrid; row: Integer); 
begin 
    TCustomGridAccess(g).DeleteRow(row); 
end; 

funktioniert, weil in Delphi, die Mitglieder mit geschützter Sichtbarkeit sind implizit öffentliche innerhalb derselben Einheit wie die Erklärung der Klasse. Obwohl TCustomGrid in der Grids Einheit deklariert wird, unsere TCustomGridAccess Klasse wird in Ihre Einheit deklariert, so dass Ihr Gerät Zugriff auf alle geschützten Methoden, darunter DeleteRow.


Wenn Ihr Delphi-Version neu genug ist, dann können Sie eine Klasse Helfer verwenden. Klassenhelfer können auf geschützte Elemente zugreifen und benötigen kein Typcasting für technisch nicht verwandte Typen.

type 
    TCustomGridHelper = class helper for TCustomGrid 
    public 
    procedure DelRow(ARow: Integer); 
    end; 

procedure TCustomGridHelper.DelRow(ARow: Integer); 
begin 
    Self.DeleteRow(ARow); 
end; 

Dann verwenden Sie einfach die Einheit, wo Sie den Helfer erklärt haben. Jeder Nachkomme von TCustomGrid wird automatisch eine DelRow Methode, die Sie wie jede andere Gitterverfahren anrufen:

grid.DelRow(grid.Row);