AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Problem bei Hintergrundfarbe setzen bei eigener Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Problem bei Hintergrundfarbe setzen bei eigener Komponente

Ein Thema von Mysterio08 · begonnen am 6. Aug 2010 · letzter Beitrag vom 6. Aug 2010
Antwort Antwort
Mysterio08

Registriert seit: 11. Jan 2009
142 Beiträge
 
#1

Problem bei Hintergrundfarbe setzen bei eigener Komponente

  Alt 6. Aug 2010, 10:08
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.
Miniaturansicht angehängter Grafiken
sample.gif  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente

  Alt 6. Aug 2010, 10:14
Zeichenoperationen im in Paint() durchführen! Denn nur dann wird diese Operation beim Neuzeichnen auch wieder ausgeführt.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente

  Alt 6. Aug 2010, 10:18
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;
Uwe Raabe
  Mit Zitat antworten Zitat
Mysterio08

Registriert seit: 11. Jan 2009
142 Beiträge
 
#4

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente

  Alt 6. Aug 2010, 11:16
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente

  Alt 6. Aug 2010, 11:19
1. Ja da .Paint() standardmässig leer ist.
2. Ja
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Problem bei Hintergrundfarbe setzen bei eigener Komponente

  Alt 6. Aug 2010, 13:42
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:01 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