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
[Gelöst] TToggleBox.Checked vs. Form.Color im Event OnPaint
[Gelöst] TToggleBox.Checked vs. Form.Color im Event OnPaint
- Dateianhänge
-
ToggleBoxTest.zip
- (125.24 KiB) 81-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;
Re: TToggleBox.Checked
ja, da klemmt was gewaltig
Re: TToggleBox.Checked
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!
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
procedure TForm1.FormPaint(Sender: TObject);
begin
Color:=$FF0000;
Color:=$00FF00;
end;
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;
Re: TToggleBox.Checked
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;
Re: TToggleBox.Checked
Kann ich nachvollziehen, ist ja schließlich ein Property...
funktioniert nicht.
Edit: ich sehe das Ganze als Feature!
Mein Beispiel habe ich jetzt geändert zu:Ä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
procedure TForm1.FormPaint(Sender: TObject);
begin
OnPaint := nil;
// Self.BeginFormUpdate;
Color:=$FF0000;
Color:=$00FF00;
// Self.EndFormUpdate;
OnPaint := @FormPaint;
end;
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;
Danke wp_xyz!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;