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/)
-   -   Delphi TSwitch wieder deaktivieren? (https://www.delphipraxis.net/185328-tswitch-wieder-deaktivieren.html)

himitsu 31. Mai 2015 22:22

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:
procedure TForm1.Switch1Switch(Sender: TObject);
begin
  Switch1.IsChecked := False;
end;
und so war es eigentlich gemeint.
Delphi-Quellcode:
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;
Auch
Delphi-Quellcode:
Switch1.Model.Value := False;
hilft nix.

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"?

Harry Stahl 1. Jun 2015 00:27

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;

Sir Rufo 1. Jun 2015 01:40

AW: TSwitch wieder deaktivieren?
 
Das "Aktivieren/Deaktivieren" sollte allerdings auch im Thread ablaufen

himitsu 1. Jun 2015 03:34

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:
    // 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;
Ja, ich schreib bei jedem Bugfix emotionsgeladen das Warum dazu, auch bei OpenSource-Codes, damit jeder weiß warum das dort so ist.
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.

Uwe Raabe 1. Jun 2015 09:19

AW: TSwitch wieder deaktivieren?
 
Zitat:

Zitat von himitsu (Beitrag 1303746)
Jetzt brauch ich nur noch eine Metrik, die auf Schimpfworte und das Wort Bugfix reagiert und die Anzahl der normalen Kommentare damit vergleicht.

Schau mal hier: http://codeofrob.com/entries/evented...b-commits.html

Stichwort: Happiness index

Sir Rufo 1. Jun 2015 13:14

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.

redox 1. Jun 2015 14:09

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: ?

Sir Rufo 1. Jun 2015 14:26

AW: TSwitch wieder deaktivieren?
 
Zitat:

Zitat von redox (Beitrag 1303794)
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!

Danke für die Blumen ...
Zitat:

Zitat von redox (Beitrag 1303794)
Aber wer ist denn das in deinem Avatar-Bild? Ein Fußballer :twisted: ?

Wie kommst du auf Fußballer? Ich habe mit Fußball nicht wirklich was am Hut und bevorzuge als Avatar-Bilder die, die mich selber zeigen.

Also, das Bild zeigt mich selber und darum garantiert zu 100% keinen Fußballer

redox 1. Jun 2015 14:51

AW: TSwitch wieder deaktivieren?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1303795)
Zitat:

Zitat von redox (Beitrag 1303794)
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!

Danke für die Blumen ...
Zitat:

Zitat von redox (Beitrag 1303794)
Aber wer ist denn das in deinem Avatar-Bild? Ein Fußballer :twisted: ?

Wie kommst du auf Fußballer? Ich habe mit Fußball nicht wirklich was am Hut und bevorzuge als Avatar-Bilder die, die mich selber zeigen.

Also, das Bild zeigt mich selber und darum garantiert zu 100% keinen Fußballer

Keine weitere Lobhudeleine von mir hier, du bekommst demnächst eine PN von mir :thumb:

himitsu 3. Jun 2015 21:38

AW: TSwitch wieder deaktivieren?
 
Ich dachte doch TButton funktioniert.
Tja, zu früh gefreut.

Mehrere Buttons mit StaysPressed=True und
Delphi-Quellcode:
procedure TTestMainForm.btMenuShowClick(Sender: TObject);
begin
  tcPages.ActiveTab := tcPages.Tabs[TComponent(Sender).Tag];
  TButton(Sender).IsPressed := True;
end;
Wenn man nochmal auf den aktiven Button drückt, würde er sich ja loslassen, also
Delphi-Quellcode:
TButton(Sender).IsPressed := True;
mit reingemacht und ging,
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 15:41 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