![]() |
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:
Ich glaube, die Prozedur SetColor ist - naja - schlecht programmiert, aber ich weiß nicht, wie ich sonst die Hintergrundfarbe setzen soll.
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; 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. |
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.
|
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; |
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? |
AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente
1. Ja da .Paint() standardmässig leer ist.
2. Ja |
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 18:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz