TColorButton sendet OnClick zweimal?

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1144
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

TColorButton sendet OnClick zweimal?

Beitrag von Timm Thaler »

Ich habe einen Button auf einem Formular. Auf Click soll diese Routine ausgeführt werden:

Code: Alles auswählen

  try
    wHNDcolor := TColorDialog.Create(nil)// Farbdialog öffnen
    wHNDcolor.Title := 'Farbe Vordergrund';
    wHNDcolor.Color := fgrgb;
    if wHNDcolor.Execute then begin
      fgrgb := wHNDcolor.Color// neue Farbe übernehmen
      gIDfcol.ButtonColor := fgrgb;
    end;
  finally
    wHNDcolor.Free();
  end;
 


Funktioniert soweit, klicke ich auf den Button wird der ColorDialog ausgeführt und mit Ok oder Abbruch komme ich da wieder raus.

Nun habe ich den aufrufenden Button durch einen ColorButton ausgetauscht. Ansonsten alles gleich. Allerdings wird der ColorDialog nach dem Beenden nochmals aufgerufen. ColorButton sendet anscheinend das OnClick-Ereignis zweimal.

Rufe ich stattdessen die Routine nicht mit OnClick, sondern OnDblClick auf, wird der ColorDialog wie gewünscht nur einmal ausgeführt. Allerdings fällt auf, dass ein einzelner Klick auf den ColorButton genügt, um ein OnDblClick Ereignis auszulösen.

Ist das ein Bug im OnClick von ColorButton? Oder ist das normal? Kann ich das zweite Ereignis bei OnClick irgendwie abfangen?

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

Re: TColorButton sendet OnClick zweimal?

Beitrag von wp_xyz »

Das zweimalige Auslösen von OnClick erscheint mir falsch. Aber so würde ich den TColorButton auch gar nicht anwenden. Nimm stattdessen das Ereignis OnColorChanged; den ColorDialog musst du auch nicht erzeugen, das macht der TColorButton selber. Um z.B ein TShape mit Hilfe eines ColorButtons einzufärben, ist nur folgender Code erforderlich:

Code: Alles auswählen

procedure TForm1.ColorButton1ColorChanged(Sender: TObject);
begin
  Shape1.Brush.Color := ColorButton1.ButtonColor;
end;

Timm Thaler
Beiträge: 1144
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: TColorButton sendet OnClick zweimal?

Beitrag von Timm Thaler »

Wie, das macht der selber?

Dann muss ich mich ja nicht wundern, dass der Dialog zweimal kommt. Ich dachte, der ColorButton heisst so, weil man den halt einfach eine Farbe geben kann... Peinlich.

Warf
Beiträge: 1524
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: TColorButton sendet OnClick zweimal?

Beitrag von Warf »

Timm Thaler hat geschrieben:Ich dachte, der ColorButton heisst so, weil man den halt einfach eine Farbe geben kann... Peinlich.


Ne dafür gibts den SpeedButton oder BitBtn (weiß nicht welcher/ob beide Hintergrundfarben können)

hubblec4
Beiträge: 246
Registriert: Sa 25. Jan 2014, 17:50

Re: TColorButton sendet OnClick zweimal?

Beitrag von hubblec4 »

Warf hat geschrieben:
Timm Thaler hat geschrieben:Ne dafür gibts den SpeedButton oder BitBtn (weiß nicht welcher/ob beide Hintergrundfarben können)


Unter Windows mit deaktivierten Themes (WinClassic Ansicht) werden die Button Farben nicht verändert.
Ich nutze dazu immer ein Panel auf das ein Speed-Button kommt mit der Eigenschaft "Flat:=true" und dann kann man die Panel-farbe ändern.

Timm Thaler
Beiträge: 1144
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: TColorButton sendet OnClick zweimal?

Beitrag von Timm Thaler »

Passt schon, ich hatte echt nicht auf dem Schirm, dass der ColorButton selbst einen ColorDialog aufmacht. Ich mach das jetzt so wie von wp_xyz angegeben.

Einzig den Titeltext des Dialogs kann ich so nicht ändern. Aber witzigerweise interessiert das Windows sowieso nicht, da steht immer "Farbe" egal was man als .Title angibt.

Antworten