Frage Wie lösche ich eine TStringGrid-Zeile?


Ich habe ein TStringGrid, und ich möchte die ausgewählte Zeile löschen. Grundlegende Dinge, die ich versucht habe, löschen nur die letzte Reihe. Wie lösche ich eine beliebige Zeile?


11
2018-05-03 03:28


Ursprung


Antworten:


Wenn der Code, den Sie ausprobiert haben, nur die letzte Zeile löscht, verringern Sie wahrscheinlich nur die RowCount Eigentum. Das macht in der Tat immer Ä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 haben wollen, diejenige am Ende ist und dann lösche die letzte Zeile. (Der direkteste Weg wäre zu Bewegung die Reihe, und da ist ein MoveRow Methode, aber es ist geschützt. Wenn Sie geschützte Methoden aufrufen möchten, können Sie dies auch tun Anruf DeleteRow stattdessen.)

Wenn Sie nur öffentliche und veröffentlichte Elemente verwenden, können Sie eine Schleife schreiben, die eine beliebige Zeile löscht. Zum Beispiel, hier ist ein Code inspiriert von Scalabium Software's FAQ zu diesem Thema:

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 unten den, den Sie löschen möchten, in die darüber liegende Zeile. 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 Rasters zu löschen, rufen Sie die Funktion wie folgt auf:

DeleteRow(Grid, Grid.Row);

12
2018-05-03 05:30



Die ausgewählte Zeile des Rasters wird durch seine angegeben Row Eigentum.

TCustomGrid hat ein DeleteRow Methode, aber es ist geschützt, so dass Sie es nicht außer innerhalb von Nachkommen dieser Klasse aufrufen können. Es ist jedoch leicht, diese Einschränkung zu umgehen. Deklariere a TCustomGrid Nachkomme, und geben Sie dann Ihr Rastersteuerelement auf diesen neuen Typ ein. Anruf DeleteRow auf das Ergebnis.

type
  TCustomGridAccess = class(TCustomGrid) end;

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

Dies funktioniert, weil in Delphi Member mit geschützter Sichtbarkeit implizit sind Öffentlichkeit innerhalb derselben Einheit wie die Deklaration der Klasse. Obwohl TCustomGrid ist in der erklärt Gitter Einheit, unsere TCustomGridAccess Klasse wird in deklariert Ihre Einheit, so dass Ihre Einheit Zugriff auf alle geschützten Methoden hat, einschließlich DeleteRow.


Wenn Ihre Delphi-Version neu genug ist, können Sie a verwenden Klassenhelfer. 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;

Verwenden Sie dann einfach die Einheit, in der Sie den Helper deklariert haben. Jeder Nachkomme von TCustomGrid wird automatisch eine haben DelRow Methode, die Sie wie jede andere Grid-Methode aufrufen können:

grid.DelRow(grid.Row);

9
2018-05-03 05:19