Ich habe mir mal selbst add- und delete-Methoden für
TStringGrid geschrieben, die so, wie folgt, meiner Meinung nach objekt-orientiert implementiert sind:
Delphi-Quellcode:
{
@author
Nogge
@description
TStringGridEx extends TStringGrid with two methods, which based on
methods and properties of TStringGrid. So TStringGridEx can easily be
used as type-cast class without creating an instance of it.
- addRow
Adds a new row to the end of the StringGrid and fills a
specific string in each column
- deleteRow
Clears the content of each column of the row specified by an
index and, if applicable, deletes it from the StringGrid
}
unit StringGridEx;
interface
uses Grids, SysUtils;
type
EListError =
class(
Exception);
TStringGridEx =
class(TStringGrid)
public
function addRow(
const VCols:
array of String): Integer;
(* HINT for reintroduce:
- overrides virtual method of TCustomGrid
- changes access right from protected to public
*)
procedure deleteRow(ARow: Longint);
reintroduce;
end;
implementation
function TStringGridEx.addRow(
const VCols:
array of String): Integer;
var
i: Integer;
begin
// catch exception
if (Length(VCols) > ColCount)
then
raise EListError.CreateFmt('
Col index out of bounds (%d)', [High(VCols)])
else
begin
// execute code
if (Length(Cells[0, FixedRows]) = 0)
then // wenn kein Zeichen enthalten ist
begin
for i := Low(VCols)
to High(VCols)
do
Cells[i, FixedRows] := VCols[i];
end
else
begin
RowCount := RowCount +1;
for i := Low(VCols)
to High(VCols)
do
Cells[i, RowCount-1] := VCols[i];
end;
Result := RowCount -1;
end;
end;
(*
Clears all entries (Strings[] AND Objects[]) of the specific row
*)
procedure TStringGridEx.deleteRow(ARow: Longint);
begin
// FixedRows should not be deleted
if (ARow < FixedRows)
or (ARow >= RowCount)
then
begin
raise EListError.CreateFmt('
Row index out of bounds (%d)', [ARow]);
end
else
begin
if (RowCount-1 > FixedRows)
then
inherited DeleteRow(ARow)
else // FixedRows is always less than RowCount
Rows[FixedRows].Clear;
end;
end;
Verwendungsbeispiel:
Delphi-Quellcode:
uses: [...], StringGridEx;
[...]
// als einfacher Aufruf...
TStringGridEx(StringGrid1).deleteRow(2);
// ...oder als Methode
procedure DeleteRow(sg: TStringGrid; index: Integer);
begin
TStringGridEx(sg).deleteRow(index);
end;
Hierdurch werden alle public-Methoden und Properties der Klasse
TStringGrid sowie die beiden zusätzlichen public-Methoden von
TStringGridEx zur Verfügung gestellt, ohne das private-Methoden und Attribute sichtbar werden.