Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Problem bei Hintergrundfarbe setzen bei eigener Komponente (https://www.delphipraxis.net/153516-problem-bei-hintergrundfarbe-setzen-bei-eigener-komponente.html)

Mysterio08 6. Aug 2010 09:08

Problem bei Hintergrundfarbe setzen bei eigener Komponente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich setzte mich seit kurzen mit der Komponentenentwicklung auseinander, und habe nun folgendes Problem: Ich leite meine Komponente von TGraphicControl ab und möchte nun die Möglichkeit bieten, eine Hintergrundfarbe setzen zu lassen. Hier ein bisschen Code:
Delphi-Quellcode:
private
    FColor: TColor;
    procedure SetColor(const Value: TColor);
...
published
    property Color: TColor read FColor write SetColor;
...
procedure TCalculator.SetColor(const Value: TColor);
begin
  FColor := Value;
  with Canvas do begin
    Brush.Color := FColor;
    Pen.Color := FColor;
    Pen.Width := 1;
    Rectangle(0, 0, Width, Height)
  end
end;
Ich glaube, die Prozedur SetColor ist - naja - schlecht programmiert, aber ich weiß nicht, wie ich sonst die Hintergrundfarbe setzen soll.
Nun ja, die Probleme treten auf:
• Das setzen der Farbe im OI klappt noch, wenn die Komponente im Design-Bereich jedoch den Fokus verliert, dann tritt ein Problem auf, welches durch das Zeichnen verursacht wurde - die Komponente wird nicht vollständig gezeichnet, ich habe mal ein Screenshot gemacht.
• Klickt man erneut auf die Komponente, verschwindet die Farbe.
• Will ich das Programm, und damit die Komponente, kompilieren, tritt folgender Fehler auf und das Programm wird zurückgesetzt: "Exception EInvalid Operation in Modul Standard.exe bei 00072410. Element '' hat kein übergeordnetes Fenster".

Meine Frage also: Wie kann ich die Prozedur SetColor eleganter/besser schreiben?
mfg.

mkinzler 6. Aug 2010 09:14

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente
 
Zeichenoperationen im in Paint() durchführen! Denn nur dann wird diese Operation beim Neuzeichnen auch wieder ausgeführt.

Uwe Raabe 6. Aug 2010 09:18

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente
 
Du musst Paint überschreiben und dabei die Hintergrundfarbe berücksichtigen. In SetColor musst du außer dem Setzen von FColor eigentlich nur ein Invalidate aufrufen.

Delphi-Quellcode:
type
  TMyControl = class(TGraphicControl)
  protected
    procecdure Paint; override;
  end;

procedure TMyControl.Paint;
begin
  with Canvas do begin
    Brush.Color := FColor;
    Pen.Color := FColor;
    Pen.Width := 1;
    Rectangle(0, 0, Width, Height);
  end;
end;

procedure TMyControl.SetColor(const Value: TColor);
begin
  FColor := Value;
  Invalidate;
end;

Mysterio08 6. Aug 2010 10:16

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente
 
Danke an Euch beide, es klappt wunderbar, alle Probleme sind gelöst.

Zwei Verständnisfragen habe ich aber noch:
1. Beim überschriebenen Paint-Ereignis - kann ich die Anweisung inherited Paint; ohne weiteres weglassen? Es funktioniert auch ohne, aber ich habe gedacht, diese Anweisung schreibt man immer in die überschriebenen Prozeduren.
2. Das Invalidate zeichnet ja alles komplett neu. Werden da im Hintergrund also mehrere Prozeduren, zu denen ja auch Paint gehört, aufgerufen?

mkinzler 6. Aug 2010 10:19

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente
 
1. Ja da .Paint() standardmässig leer ist.
2. Ja

stahli 6. Aug 2010 12:42

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente
 
Kleiner Hinweis zu 2.:
Invalidate veranlasst Windows genau genommen nur, das Objekt "bei Gelegenheit" einmal neu zu zeichnen. Das Zeichnen selbst kann daher mit zeitlicher Verzögerung erfolgen.
Sofortigtes Neuzeichnen kann man z.B. mit Update veranlassen.
Das kann ggf. mal beim Neuzeichnen unter zeitkritischen Aktionen relevant sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz