Autor Beitrag
UweK
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51
Erhaltene Danke: 1

Win 7
Delphi Enterprise XE6
BeitragVerfasst: Do 23.02.17 13:01 
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.

ausblenden volle Höhe 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{class}


{Inhalt einer Zelle entsprechend den Vorgaben zeichnen.}
{--------------------------------------------------------------------------------------------------------------------------}
procedure TMyStringGrid.MyStringGridOnDrawCell(ASender: TObject; ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState);
begin

{In festen Zellen Text und Hintergrund immer in Systemfarben zeichnen.}
    if ((ACol < FixedCols) or (ARow < FixedRows)) then
    begin
      ThisFontColor:= Font.Color;
      ThisPaperColor:= FixedColor;
    end

{In beweglichen Zellen Text und Hintergrund in individuellen Farben zeichnen.}
    else
      if CellError[ACol,ARow] then
{Text rot schreiben}
      else
{Text schwarz schreiben}

{usw. dann in die Zelle hineinschreiben funktioniert auch.}

end{procedure TMyStringGrid.MyStringGridOnDrawCell}


{---------------------------------------------------}
constructor TMyStringGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  OnDrawCell:= MyStringGridOnDrawCell;

{Erstmal irgendwelche halbwegs vernünftigen Startwerte für Größe direkt einstellen, z.B:}
  ColCount:= 5;
  RowCount:= 5;
  SetLength(CellError, ColCount, RowCount);
  ClearAllCells; {=> Setzt in "CellError" erstmal alles auf "false".}
end{constructor TMyStringGrid.Create}


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 23.02.17 13:33 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51
Erhaltene Danke: 1

Win 7
Delphi Enterprise XE6
BeitragVerfasst: 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
ausblenden 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!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 03.03.17 18:23 
- Nachträglich durch die Entwickler-Ecke gelöscht -
UweK Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51
Erhaltene Danke: 1

Win 7
Delphi Enterprise XE6
BeitragVerfasst: Mo 06.03.17 13:43 
Vielen Dank, das war die Lösung!