![]() |
TSwitch wieder deaktivieren?
FMX-TSwitch bei Fehler wieder deaktivieren?
In XE3 geht es noch, aber zwischenzeitlich wurde ja mehrmals alles komplett umgebaut. Allein das geht schonmal nicht.
Delphi-Quellcode:
und so war es eigentlich gemeint.
procedure TForm1.Switch1Switch(Sender: TObject);
begin Switch1.IsChecked := False; end;
Delphi-Quellcode:
Auch
procedure TForm1.Switch1Switch(Sender: TObject);
begin try //if Switch1.IsChecked then // Activate //else // Deactivate; raise Exception.Create('Fehlermeldung'); except Switch1.IsChecked := False; raise; end; end;
Delphi-Quellcode:
hilft nix.
Switch1.Model.Value := False;
Kann das jemand bestätigen? Bei TButton.IsPressed funktioniert es. Windows und ControlType=Styled ... sonst weiß ich es nicht, wie es ist, aber windows wird es wohl Nativ eh nicht kennen. PS: Was macht hier eigentlich "iOS" in der Thread-Erstellen-Präfixliste, unter all den anderen "Entwicklungsumgebungen"? |
AW: TSwitch wieder deaktivieren?
Ohne mir das jetzt genauer angesehen zu haben (will jetzt den Matratzenhorchdienst starten), vermute ich mal, dass hier eine Animation verwendet wird, um den Switch gleiten zu lassen. Evtl. ist die Ausführung noch nicht zu Ende und Du versuchst direkt schon wieder den Switch zurückzusetzen und da kommt sich halt irgendwas ins Gehege.
So kannst Du es jedenfalls machen:
Delphi-Quellcode:
procedure TForm14.SetSwitchToFalse;
begin Switch1.IsChecked := false; end; procedure TForm14.Switch1Switch(Sender: TObject); var T: ITask; begin T := TTask.Create(procedure () begin TThread.Synchronize( nil, procedure begin Self.SetSwitchToFalse; end); end); T.Start; end; |
AW: TSwitch wieder deaktivieren?
Das "Aktivieren/Deaktivieren" sollte allerdings auch im Thread ablaufen
|
AW: TSwitch wieder deaktivieren?
Nee, die Komponenten sind ja nicht threadsave und ohne die Synchronisierung startet das Zurücksetzen eventuell zu früh.
Die Animation scheint blockierend abzulaufen und demnach wartet das Synchronize auf das Ende. :thumb: Leider ist es dennoch unschön, denn man sieht den Schalter noch umswitchen, bevor er schnell wieder zurück springt. Witziger Weise ist das nur so, wenn man nur IsChecked auf False setzt ... beim Anzeigen einer Exception ist diese Animation nicht mehr zu sehn.
Delphi-Quellcode:
Ja, ich schreib bei jedem Bugfix emotionsgeladen das Warum dazu, auch bei OpenSource-Codes, damit jeder weiß warum das dort so ist.
// btTcpOpen.IsChecked := FeigTCP.IsActive;
TThread.CreateAnonymousThread(procedure // die Animation und eine schrottige Implementierung verhindern das Zurückschalten begin TThread.Synchronize(nil, procedure begin btTcpOpen.IsChecked := not FeigTCP.IsActive; // nochmal zurück, sonst bekommt der blöde Button es eventuell nicht mit btTcpOpen.IsChecked := FeigTCP.IsActive; end); end).Start; Irgendwo muß man sich ja abreagieren, sonst würde man noch öfters wo anders seine Emotionen rauslassen, wenn es sich anstaut. (ich würde das aber nicht jedem empfehlen, sonst bestehen viele Programme nur noch aus Schimpfworten) Ich hatte keine Lust nur wegen dem Bugfix System.Threading einzubinden, außerdem gibt es das noch nicht lange, was für eine Komponente etwas ungünstig ist, darum TThread.CreateAnonymousThread().Start statt TTast.Run(). (gut, wenn TThread.Queue() richtig arbeiten würde, wäre es noch einfacher :roll:) Jetzt brauch ich nur noch eine Metrik, die auf Schimpfworte und das Wort Bugfix reagiert und die Anzahl der normalen Kommentare damit vergleicht. |
AW: TSwitch wieder deaktivieren?
Zitat:
![]() Stichwort: Happiness index |
AW: TSwitch wieder deaktivieren?
Es ist halt immer problematisch, wenn man etwas falsch umsetzt und dann das richtige Verhalten erwartet.
Wer ein iPhone hat und sehen möchte, wie es richtig umgesetzt ist, der schaltet mal Bluetooth in den Einstellungen ein und aus. Bei jeder Änderung der Switch-Position, verschwindet der Switch und es taucht statt dessen diese Kringel-Animation auf (es passiert etwas im Hintergrund). Nach Abschluss erscheint wieder der Switch und der aktuelle Status (ein/aus) wird mit der Switch-Position angezeigt. Schon bleibt die Oberfläche immer reaktionsbereit. |
AW: TSwitch wieder deaktivieren?
Mit meinem Delph7 Personal habe ich zwar keinerlei/kaum noch Mitspracherecht, aber die Antworten von Sir Rufo sind doch immer wieder sehr lesenswert :thumb:
Vielen Dank an dich dafür, Sir Rufo! Aber wer ist denn das in deinem Avatar-Bild? Ein Fußballer :twisted: ? |
AW: TSwitch wieder deaktivieren?
Zitat:
Zitat:
Also, das Bild zeigt mich selber und darum garantiert zu 100% keinen Fußballer |
AW: TSwitch wieder deaktivieren?
Zitat:
|
AW: TSwitch wieder deaktivieren?
Ich dachte doch TButton funktioniert.
Tja, zu früh gefreut. Mehrere Buttons mit StaysPressed=True und
Delphi-Quellcode:
Wenn man nochmal auf den aktiven Button drückt, würde er sich ja loslassen, also
procedure TTestMainForm.btMenuShowClick(Sender: TObject);
begin tcPages.ActiveTab := tcPages.Tabs[TComponent(Sender).Tag]; TButton(Sender).IsPressed := True; end;
Delphi-Quellcode:
mit reingemacht und ging,
TButton(Sender).IsPressed := True;
aber dann hab ich mal "ausversehn" einen Doppelklick gemacht. :wall: Sollte man nun auf die Idee kommen und sowohl OnClick, als auch OnDblClick dieses Event zuzuweisen, dann wird man enttäuscht ... läuft also auch wieder auf diesen bösen Thread+Synchronize hinaus. Schade, daß es kein abschaltbares AutoCheck gibt, so wie bei den TMenuItems. [edit] Maustaste Drücken und Maus vom Button ziehen, bevor losgelassen wird = kein Klick. So weit funktioniert es, aber IsPressed wird dennoch umgeschaltet, wenn es vorher True war. (hier geb ich wol einfach auf) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz