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)//(TCustomControl) //(TGraphicControl)
  private
    { Private-Deklarationen }
    FColorRd: TColor;
    FColorBk: TColor;
  protected
    { Protected-Deklarationen }
    procedure SetColorBk(Value: TColor);
    procedure SetColorRd(Value: TColor);
    procedure Paint; override;
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent);
  published
    { Published-Deklarationen }
    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(40050);
  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 user profile iconTh69: 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 user profile iconTh69: Delphi-Tags hinzugefügt