Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Schon wieder TToggleSwitch (https://www.delphipraxis.net/199046-schon-wieder-ttoggleswitch.html)

Willie1 20. Dez 2018 15:56

Schon wieder TToggleSwitch
 
Hallo Leute,
ich habe vier ToggleSwitches tsw1 bis 4 und will, dass nur einer auf [ein] geschaltet werden kann. Ich habe mir Folgendes ausgedacht:
Delphi-Quellcode:
procedure MultipleChoiceDlg.tsw1Click(Sender: TObject);
var
  tsNr,i: Integer;
begin
  tsNr:=(Sender as TToggleSwitch).Tag;
  for i:=1 to 4 do
    if i <> tsNr then TToggleSwitch(FindComponent('tsw'+IntToStr(i))).State:=tssOff;
//TToggleSwitch(FindComponent('tsw'+IntToStr(tsNr))).State:=tssOn; Das funktioniert nicht!
end;
Die anderen Switches werden zwar [aus] geschaltet aber der angeklickte Switch bleibt unverändert. Ich muss erneut klicken. Nur eine Kleinigkeit aber es ist irgendwie unlogisch. Es sieht so aus, als wenn im OnClick-Ereignis etwas ausgeführt wird, das Schalten des ToggleSwitch nicht mehr statt findet.

Der schöne Günther 20. Dez 2018 16:29

AW: Schon wieder TToggleSwitch
 
Und was ist wenn der eingeschaltete auf AUS geschaltet wird, sollen dann KEINER auf EIN stehen?

Jedenfalls: Das Problem liegt darin dass der Profi der
Delphi-Quellcode:
TToggleSwitch
verbrochen hat das
Delphi-Quellcode:
OnClick
-Event auslösen lässt wenn du die
Delphi-Quellcode:
State
-Eigenschaft änderst.

Mach ein ShowMessage(..) oder Memo1.Lines.Add(..) oder Debugger-Haltepunkt in deine Routine und du siehst dass die Methode somit mehrmals aufgerufen wird.


//// Edit

Eine Lösung könnte z.B. sein dass du das OnClick-Event der Switches temporär deaktivierst wenn du den Status umstellst:


Delphi-Quellcode:
type
   TToggleSwitchHelper = class helper for TToggleSwitch
      procedure setToOffWithoutEvent();
   end;

procedure TForm1.toggleSwitchClick(Sender: TObject);
var
   tsNr, i: Integer;
   componentName: TComponentName;
begin
   tsNr := (Sender as TToggleSwitch).Tag;

   for i := 1 to 4 do
      begin
         componentName := 'ToggleSwitch' + i.ToString();
         if (i <> tsNr) then
            (FindComponent(componentName) as TToggleSwitch).setToOffWithoutEvent()
      end
end;

procedure TToggleSwitchHelper.setToOffWithoutEvent();
var
   onClickEvent: TNotifyEvent;
begin
   onClickEvent := OnClick;
   try
      OnClick := nil;
      State := TToggleSwitchState.tssOff;
   finally
      OnClick := onClickEvent;
   end;
end;

Uwe Raabe 20. Dez 2018 17:31

AW: Schon wieder TToggleSwitch
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der ToggleSwitch arbeitet eigentlich recht gut mit Actions zusammen. Das anhängende Beispielprojekt zeigt das Prinzip basierend auf deinen Vorgaben.

Willie1 20. Dez 2018 17:48

AW: Schon wieder TToggleSwitch
 
Hallo Günther, so klappt es, danke.
Ich hatte ein kleines Testprogramm geschrieben und schon gesehen, dass das OnClick Event zweimal durchlaufen wird, also beim zweiten Durchlauf wieder abgeschaltet wird. Meine Lösung wären nur die guten alten Radio-Buttons gewesen. Da sehen die ToggleSwitcher doch etwas besser aus.

Hallo Uwe, ich bin nur Hobbyprogrammierer, da kann man entspannt sein, besonders mit der Zeitschiene aber ich habe schon den Anspruch ein gutes Programm zu schreiben. Mein Projekt ist ein universelles Abfrageprogramm vom Vokabeln lernen bis zum Quiz mit Multiple Choice. Ein bischen modern soll es auch aussehen.
Ich werde mir das Zip genau durchsehen.

Gruß Willie.

Willie1 21. Dez 2018 10:24

AW: Schon wieder TToggleSwitch
 
Nachtrag:
Es ist verblüffend mit wie wenig Quelltext man auskommt, wenn man es richtig macht. Willie.

Uwe Raabe 21. Dez 2018 10:35

AW: Schon wieder TToggleSwitch
 
Zitat:

Zitat von Willie1 (Beitrag 1421628)
Es ist verblüffend mit wie wenig Quelltext man auskommt, wenn man es richtig macht.

Das würde sich auch gut als Daily-Quote eignen. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 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