AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Schon wieder TToggleSwitch

Ein Thema von Willie1 · begonnen am 20. Dez 2018 · letzter Beitrag vom 21. Dez 2018
Antwort Antwort
Willie1

Registriert seit: 28. Mai 2008
659 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Schon wieder TToggleSwitch

  Alt 20. Dez 2018, 16:56
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.172 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Schon wieder TToggleSwitch

  Alt 20. Dez 2018, 17:29
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 TToggleSwitch verbrochen hat das OnClick -Event auslösen lässt wenn du die 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;

Geändert von Der schöne Günther (20. Dez 2018 um 17:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Schon wieder TToggleSwitch

  Alt 20. Dez 2018, 18:31
Der ToggleSwitch arbeitet eigentlich recht gut mit Actions zusammen. Das anhängende Beispielprojekt zeigt das Prinzip basierend auf deinen Vorgaben.
Angehängte Dateien
Dateityp: zip ToggleDemo.zip (1,3 KB, 52x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
659 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: Schon wieder TToggleSwitch

  Alt 20. Dez 2018, 18:48
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (20. Dez 2018 um 18:59 Uhr) Grund: Neue Antwort
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
659 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: Schon wieder TToggleSwitch

  Alt 21. Dez 2018, 11:24
Nachtrag:
Es ist verblüffend mit wie wenig Quelltext man auskommt, wenn man es richtig macht. Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Schon wieder TToggleSwitch

  Alt 21. Dez 2018, 11:35
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:04 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