Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Status eines Buttons abfragen (https://www.delphipraxis.net/199335-status-eines-buttons-abfragen.html)

Luckner 16. Jan 2019 13:43

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

DasWolf 16. Jan 2019 13:53

AW: Status eines Buttons abfragen
 
Hallo,

versuche es mal mit einem TSpeedButton anstelle eines TButton.

peterbelow 16. Jan 2019 14:21

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.

Luckner 16. Jan 2019 15:01

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

BerndS 16. Jan 2019 15:12

AW: Status eines Buttons abfragen
 
Hallo mit
Delphi-Quellcode:
 
procedure TForm1.e1Exit(Sender: TObject);
begin
  if Screen.ActiveControl = btCancel then
    exit
  else
    ...;
end;
könnte man das erreichen.

DP-Maintenance 16. Jan 2019 16:34

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.

Moombas 17. Jan 2019 10:14

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:
Button.enabled := false;
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
Delphi-Quellcode:
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;
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)
Dann interessiert es überhaupt nicht mehr wenn du das Panel "schließt" was im Editfeld steht.

peterbelow 17. Jan 2019 10:36

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:
procedure TForm1.Action1Update(Sender: TObject);
begin
  (Sender as TAction).Enabled := edit1.GetTextLen > 0;
end;
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.

Wenn Du das Programm dann laufen läßt wird der Button automatisch disabled solange das edit1-Control leer ist.

DasWolf 17. Jan 2019 11:18

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.

Moombas 17. Jan 2019 11:26

AW: Status eines Buttons abfragen
 
Zitat:

Zitat von DasWolf (Beitrag 1423454)
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.


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 02:04 Uhr.
Seite 1 von 2  1 2      

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