![]() |
Status eines Buttons abfragen
Hallo,
habe folgendes Problem. In einem Panel befinden sich mehrere EDITFelder. Eins der EDITfelder ist wichtig und nach dem aktivieren des Panel springe ich automatisch in dieses Feld. In dem Ereigniss "OnExit" überprüfe ich ob in diesem Feld irgendetwas steht, ansonsten spring der Cursor wieder in dieses Feld. Das funktioniert auch. Das Panel soll, unter anderem, durch ein Button "Abbrechen" geschlossen werden. Kann jedoch nicht, weil das Ereigniss "OnExit" das verhindert. Jetzt meine Frage: Kann man vom TButton ein Zustand auslesen, ob er geklickt wurde? Habe es mal mit einer Variablen versucht und die beim Klicken auf diesen Button auf true gesetzt. Im Ereigniss "OnExit" des Edit-Feldes hatte ich es versucht in Abhängigkeit der Variablen zu reagieren. Es hat jedoch nicht funktioniert. Hat jemand einen Vorschlag, wie ich dieses Problem lösen kann? Gruß, Luckner |
AW: Status eines Buttons abfragen
Hallo,
versuche es mal mit einem TSpeedButton anstelle eines TButton. |
AW: Status eines Buttons abfragen
Was Du da treibst ist nicht so ganz problemfrei. OnExit feuert wenn das Control den Fokus verliert, d.h. Windows ist da gerade in einer focus transition. Es mag es überhaupt nicht, wenn Du gerade dann den Fokus manuell wieder zurücksetzt. Mitunter gibt das seltsame Effekte, z. B. Verschwinden des Carets in dem Edit.
Um auf fehlende Eingaben des Benutzers zu reagieren sollte man lieber die Funktion (button, menu) blockieren, die er verwendet, um die Eingaben zu prozessieren (z. B zu speichern) und eventuell die Hintergrundfarbe des Eingabecontrols in etwas auffälliges ändern.Den Fokus zurückzusetzten, selbst wenn man es richtig macht, unterbricht den Workflow des Benutzers, was generell eine richtig schlechte Idee ist, wenn Du willst, das der Benutzer den Programm mag :wink: . Man kann für sowas gut mit Delphi's Actions arbeiten. Wenn man eine Action mit dem Button und/oder Menu für die Verarbeitung der eingegebenen Daten verknüpft kann man in ihrem OnUpdate Event prüfen, ob alles ordnungsgemäß eingegeben wurde, und die Action disablen, wenn das nicht der Fall ist. |
AW: Status eines Buttons abfragen
Hallo peterbelow,
könntest Du mir ein Beispiel für "Action mit dem Button" zeigen? Habe damit so nie gearbeitet. Gruß, Luckner |
AW: Status eines Buttons abfragen
Hallo mit
Delphi-Quellcode:
könnte man das erreichen.procedure TForm1.e1Exit(Sender: TObject); begin if Screen.ActiveControl = btCancel then exit else ...; end; |
Dieses Thema wurde am "16. Jan 2019, 17:34 Uhr" von "Luckie" aus dem Forum "Programmieren allgemein" in das Forum "GUI-Design mit VCL / FireMonkey / Common Controls" verschoben.
|
AW: Status eines Buttons abfragen
@luckner: Ich kenne den Aufbau bei dir nun nicht aber warum deaktivierst du den Button nicht wenn das Panel aktiv wird
Delphi-Quellcode:
und im onChange-Event des Edit-Feldes prüfst du ob im Feld etwas steht (falls möglich auch auf Konsistenz) und wenn das passt, wird der Button erst wieder frei gegeben
Button.enabled := false;
Delphi-Quellcode:
Das macht die OnExit-Abfrage dann überflüdssig (außer du willst dabei ggf. die Edit-Felder zurücksetzen oder noch andere Anweisungen ausführen)
procedure EditChange(Sender: TObject);
begin if (Edit.Text = '') or //Prüfen ob Feld leer (length(Edit.Text) <> 4) then //Konsistenzprüfung (nur ein Beispiel: hier auf Länge des Textes) Button.enabled := False //Button deaktivieren else Button.enabled := True; //Button aktivieren end; Dann interessiert es überhaupt nicht mehr wenn du das Panel "schließt" was im Editfeld steht. |
AW: Status eines Buttons abfragen
Wirf eine TActionList auf das Form, mach einen Doppelklick drauf um den zugehörigen Komponenteneditor zu öffnen. In dessen Toolbar gibt es einen Add-Knopf, damit fügst Du eine TAction zu der Liste hinzu, die dann auch automatisch in der Komponentenliste des Forms auftaucht und im Objektinspektor bearbeitet werden kann. Gehe dort auf den Tab für die Events. Die relevanten Events für eine TAction sind OnExecute und OnUpdate. Wenn Du die dropdownliste für OnExecute aufklappst solltest Du da die Methode sehen, die Du dem Button OnClick-Event zugeordnet hast (plus alle anderen TNotifyEvents auf dem Form), die kannst Du direkt auswählen. Mach dann einen Doppelklick auf OnUpdate um die IDE einen Handler dafür erzeugen zu lassen. Den füllst Du dann etwas so aus:
Delphi-Quellcode:
Dann klick auf den Button und setzte im OI seine Action-Eigenschaft auf die Action (hier Action1). Der Button übernimmt dadurch auch Caption, Hint, Imageindex etc. von der Action, die muss man also auch in den Eigenschaften der Action festlegen.
procedure TForm1.Action1Update(Sender: TObject);
begin (Sender as TAction).Enabled := edit1.GetTextLen > 0; end; Wenn Du das Programm dann laufen läßt wird der Button automatisch disabled solange das edit1-Control leer ist. |
AW: Status eines Buttons abfragen
Hallo,
der TE hat doch geschrieben, dass es einen Schalter "Abbrechen" gibt, der das Panel schließen soll. Interpretiert man den Text richtig, kommt dabei heraus, dass dieser Schalter auch freigegeben sein soll, wenn im Edit-Feld nichts steht. Also muss der Schalter immer Enabled sein. Er kann einfach nur einen TSpeedButton nehmen. Dieser lässt beim Klick den Focus auf dem Edit-Feld, führt kein OnExit-Ereignis aus und schließt das Panel. Dafür braucht man keine Action oder sonst irgendeinen Code. |
AW: Status eines Buttons abfragen
Zitat:
Dagegen spricht auch nichts, aber der Button "OK" (oder wie er zum Bestätigen auch immer heißt) betrifft das enablen oder disablen. Der "Abbrechen"-Button muss natürlich immer enabled sein. Sein Problem war nur das "OnExit"-Event. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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