[Gelöst] TToggleBox.Checked vs. Form.Color im Event OnPaint

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

[Gelöst] TToggleBox.Checked vs. Form.Color im Event OnPaint

Beitrag von Michl »

Hallo allerseits,

habe eben im Wiki die Seite für die TToggleBox bearbeitet und ein Beispiel http://wiki.freepascal.org/TToggleBox/de#Verwendung erstellt (als Zip beigefügt). Dabei ist mir der Bug aufgefallen, dass wenn eine ToggleBox.Checked=True ist, dass:
- sich die Prozessortätigkeit extrem erhöht
- wechselt man von einer Anwendung zurück auf diese, werden die Toggleboxen nicht gemäß ihrem Zustandes gezeichnet, sondern immer als nicht checked oder manchmal auch gar nicht gezeichnet
- die Anwendung / das Formular sich nicht schließen lässt

Kann jemand das Verhalten bestätigen bzw. wie verhält es sich auf anderen Systemen?!

Getestet unter:
Win7, 64bit, Lazarus 1.2.2 32bit mit FPC 2.6.4
Win7, 64bit, Lazarus 1.3 32bit Rev. 45097M FPC 2.7.1 Rev. 27805
Dateianhänge
ToggleBoxTest.zip
(125.24 KiB) 76-mal heruntergeladen
Zuletzt geändert von Michl am Di 20. Mai 2014, 11:18, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: TToggleBox.Checked

Beitrag von hde »

ja, da klemmt was gewaltig

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TToggleBox.Checked

Beitrag von Michl »

Ich nehme alles zurück und behaupte das Gegenteil. Es ist kein Problem mit den Toggleboxen, wie gestern abend von mir vermutet, sondern ein Problem der Zuweisung von <Form>.Color!

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
begin
  Color:=$FF0000;
  Color:=$00FF00; 
end;

Sobald man mehr als einmal die Poperty Color vom Formular ändert, hängt sich das Programm auf.

Darf man das nicht oder ist das ein Bug?

Ist das nur unter Win7 so oder auch unter anderen Betriebsystemen?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TToggleBox.Checked

Beitrag von wp_xyz »

Ich denke, das Problem liegt darin, dass du die Farbe ausgerechnet in der Paint-Eventbehandlung änderst, und könnte mir vorstellen, dass dies ein erneutes Neuzeichnen bewirkt. Wenn du die Farbe nicht bei einem anderem Ereignis ändern kannst, funktioniert es vielleicht,den OnPaint-Handler vorübergehend auszuhängen:

Code: Alles auswählen

 
procedure TForm1.FormPaint(Sender: TObject);
begin
  OnPaint := nil;
  Color:=$FF0000;
  Color:=$00FF00; 
  OnPaint := @FomrPaint;
end;

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TToggleBox.Checked

Beitrag von Michl »

Kann ich nachvollziehen, ist ja schließlich ein Property...

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
begin
  OnPaint := nil;
//  Self.BeginFormUpdate;
  Color:=$FF0000;
  Color:=$00FF00;
//  Self.EndFormUpdate;
  OnPaint := @FormPaint;
end;
funktioniert nicht.

Edit: ich sehe das Ganze als Feature!

Mein Beispiel habe ich jetzt geändert zu:

Code: Alles auswählen

procedure TForm1.ToggleBox1Click(Sender: TObject);
var
  aColor: TColor;
begin
  aColor:=0;
  if ToggleBox1.Checked then aColor:=aColor + $0000FF;
  if ToggleBox2.Checked then aColor:=aColor + $00FF00;
  if ToggleBox3.Checked then aColor:=aColor + $FF0000;
  Color:=aColor;
end;
Änderung <Form>.Color führt automatisch zum Neuzeichnen -> ein "RePaint" ist nicht notwendig! Habs entsprechend im Wiki vermerkt.

Danke wp_xyz!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten