Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Von TStringGrid abgeleitete Komponente zur Entwurfszeit
UweK - Do 23.02.17 13:01
Titel: Von TStringGrid abgeleitete Komponente zur Entwurfszeit
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.
Delphi-Quelltext
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
Delete - Do 23.02.17 13:33
- Nachträglich durch die Entwickler-Ecke gelöscht -
Blup - Mi 01.03.17 18:40
Man könnte auch allgemeiner ein Property Objects[x, y: Integer] vorsehen.
Damit lassen sich vielseitige Anwendungsfälle abdecken.
z.B.
- jeder Zelle ein TFont-Object zuweisen
- oder eine Objekt das Hintergrundfarbe, Ausrichtung und Schrift kapselt
- oder eine Klsse die das Zeichnen der Zelle übernimmt
UweK - Fr 03.03.17 16:52
@Frühlingsrolle:
Inhaltlich habe ich verstanden, was du vorschlägst. Aber irgendwie bekomme ich den Syntax dafür nicht hin. Könntest du mir bitte mal das sicher simple Beispiel aufschreiben, wie ich für die
Delphi-Quelltext
1:
| property RowCount: Integer read FRowCount write SetRowCount; |
aus der Vorfahrklasse TStringGrid in meiner abgeleiteten Klasse TMyStringGrid das "SetRowCount" so überschreibe, dass es noch was zusätzliches macht, aber dabei immer noch seine normale Funktion im TStringGrid ausführt?
Danke!
Delete - Fr 03.03.17 18:23
- Nachträglich durch die Entwickler-Ecke gelöscht -
UweK - Mo 06.03.17 13:43
Vielen Dank, das war die Lösung!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!