Hallo,
Ich habe eine eigene Komponente von TStringGrid abgeleitet, die später diverse Erweiterungen gegenüber TStringGrid können soll. Als erster Schritt soll in einem zusätzlichen Array "CellError" stehen, ob der in einer Zelle dargestellte Text einen Normalzustand oder einen Fehlerzustand beschreibt. Dementsprechend soll der Text dann schwarz oder rot geschrieben werden.
Ich ziehe zur Entwurfszeit in der IDE mehrere "TMyStringGrid" aus der Palette ins Programmformular, und stelle dann im Objektinspektor für jede Instanz passend die Größe "ColCount" und "RowCount" ein. Falls diese Werte kleiner oder gleich den Voreinstellungen aus "TMyStringGrid.Create" sind, funktioniert diese Größeneinstellung, und hinterher macht die Komponente zur Laufzeit auch das was sie soll.
Das Problem: Sobald ich eine der Größenangaben größer mache als die betreffende Voreinstellung in "TMyStringGrid.Create", bekomme ich schon zur Entwurfszeit Fehlermeldungen, weil offensichtlich bereits dann das interne "MyStringGridOnDrawCell" von der IDE benutzt wird, um die Komponente im Formulareditor auf dem Bildschirm darzustellen. Auch dafür ist mir die Ursache klar, und durch selektives Auskommentieren von Teilen des Quelltextes der Komponente auch so bestätigt: Das Ändern von "ColCount" oder "RowCount" im Objektinspektor ändert natürlich nicht die Größe des Arrays "CellError". Und wenn die IDE eine Zelle auf dem Bildschirm neu zeichnen will, die außerhalb der in "Create" voreingestellten Größe von "CellError" liegt, kommt natürlich ein Fehler wegen ungültigem Index.
Hier hänge ich fest - hat jemand eine Idee, wie die Größe von "CellError" automatisch mitgeändert werden könnte, wenn ich in der IDE im Objektinspektor die Größe des TMyStringGrid ändere? Vielen Dank schon mal vorab!
Hier nur die für die Frage relevanten Auszüge. Registrierung, Eintrag in die Komponentenpalette usw. ist klar.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| TMyStringGrid = class(TStringGrid) procedure MyStringGridOnDrawCell(ASender: TObject; ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState); private CellError: array of array of Boolean; public constructor Create(AOwner: TComponent); override; end;
procedure TMyStringGrid.MyStringGridOnDrawCell(ASender: TObject; ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState); begin
if ((ACol < FixedCols) or (ARow < FixedRows)) then begin ThisFontColor:= Font.Color; ThisPaperColor:= FixedColor; end
else if CellError[ACol,ARow] then
else
end;
constructor TMyStringGrid.Create(AOwner: TComponent); begin inherited Create(AOwner); OnDrawCell:= MyStringGridOnDrawCell;
ColCount:= 5; RowCount:= 5; SetLength(CellError, ColCount, RowCount); ClearAllCells; end; |
Moderiert von Narses: Delphi-Tags hinzugefügt