Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponente wird nicht neu gezeichnet bei Änderung der Farbe
BRobby - Mi 07.12.22 21:13
Titel: Komponente wird nicht neu gezeichnet bei Änderung der Farbe
Hallo,
Ich versuche eine Komponente zu entwickeln, die ein farbiges Quadrat auf einer Form darstellt.
Bei Änderung der Eigenschaft ColorBk soll sich die Farbe des Quadrates ändern und zwar sowohl zur Design- als auch zur Laufzeit.
Leider wird die Komponente nicht neu gezeichnet, wenn die Eigenschaft ColorBk geändert wird.
Woran liegt das und wie kann man das ändern?
Hier der zugehörige Code:
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: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85:
| unit RW_FarbQuadrat;
interface
uses Windows, System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Graphics;
type TRW_FarbQuadrat = class(Tpaintbox) private FColorRd: TColor; FColorBk: TColor; protected procedure SetColorBk(Value: TColor); procedure SetColorRd(Value: TColor); procedure Paint; override; public constructor Create(AOwner: TComponent); published property ColorBk: tColor read FColorBk write FColorBk; property ColorRd: TColor read FColorRd write FColorRd; property Width; property Height; property Visible; property Parent; property ParentColor;
end;
procedure Register;
implementation
constructor TRW_FarbQuadrat.Create(AOwner: TComponent); begin inherited; Width:=25; Height:=25; end;
procedure TRW_FarbQuadrat.SetColorBk(Value: TColor); begin FColorBk:=Value; Invalidate; Repaint; Update; Paint; Refresh; end;
procedure TRW_FarbQuadrat.SetColorRd(Value: TColor); begin FColorRd:=Value; Repaint; Update; Paint; Refresh; end;
procedure TRW_FarbQuadrat.Paint; var R: TRect; begin Windows.Beep(400, 50); with Canvas do begin R:=ClientRect; Pen.Color:=ColorRd; Pen.Mode:= pmCopy; Brush.Color:=ColorBk; Brush.Style:=bsSolid;
Rectangle(R); R.Inflate(-1, -1); FillRect(R);
end; end;
procedure Register; begin RegisterComponents('RW', [TRW_FarbQuadrat]); end;
end. |
[/delphi]
mandras - Mi 07.12.22 22:39
Guten Abend :)
Das Hauptproblem ist, daß in Deinem Code die Farben direkt den jeweiligen Variablen zugewiesen werden:
Delphi-Quelltext
1: 2:
| property ColorBk: tColor read FColorBk write FColorBk; property ColorRd: TColor read FColorRd write FColorRd; |
Damit wird bei einem Schreibzugriff auf
ColorBK und
ColorRD nicht das
Paint aufgerufen.
So funktioniert es:
Delphi-Quelltext
1: 2:
| property ColorBk: tColor read FColorBk write SetColorBK; property ColorRd: TColor read FColorRd write SetColorRD; |
Also wird bei Schreibzugriffen auf
ColorBK die Prozedur
SetColorBK aufgerufen und dort dann
Paint.
In
SetColorBK reicht ein Aufruf von
Invalidate - Refresh, Paint etc. sind nicht erforderlich:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TRW_FarbQuadrat.SetColorBk(Value: TColor); begin FColorBk:=Value; Invalidate; end; |
Moderiert von
Th69: Delphi-Tags hinzugefügt
jaenicke - Mi 07.12.22 23:22
Schau dir am besten einfach mal den Quelltext von TShape in Vcl.ExtCtrls.pas an. Die Komponente macht ja genau das, was du möchtest.
BRobby - Mi 07.12.22 23:55
Vielen Dank an beide Antwortenden.
Jetzt ist mir alles klar. Ich war betriebsblind.
Der zweite Hinweis zeigt mir, dass ich gar keine neue Komponente entwickeln muss.
TShape macht schon das, was ich erreichen möchte.
Beide Antworten haben mir also geholfen.
Nochmals vielen Dank für die schnellen Hilfen.
Moderiert von
Th69: Delphi-Tags hinzugefügt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!