Autor Beitrag
BRobby
Hält's aus hier
Beiträge: 10

Win 10
Delphi 10.4 Community Edition
BeitragVerfasst: Mi 07.12.22 21:13 
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:

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mi 07.12.22 22:39 
Guten Abend :)

Das Hauptproblem ist, daß in Deinem Code die Farben direkt den jeweiligen Variablen zugewiesen werden:

ausblenden 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:
ausblenden 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:

ausblenden 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

Für diesen Beitrag haben gedankt: BRobby
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10

Win 10
Delphi 10.4 Community Edition
BeitragVerfasst: 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