AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Status eines Buttons abfragen

Ein Thema von Luckner · begonnen am 16. Jan 2019 · letzter Beitrag vom 18. Jan 2019
Antwort Antwort
Seite 1 von 2  1 2      
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#1

Status eines Buttons abfragen

  Alt 16. Jan 2019, 14:43
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
  Mit Zitat antworten Zitat
DasWolf

Registriert seit: 7. Jun 2016
76 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Status eines Buttons abfragen

  Alt 16. Jan 2019, 14:53
Hallo,

versuche es mal mit einem TSpeedButton anstelle eines TButton.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#3

AW: Status eines Buttons abfragen

  Alt 16. Jan 2019, 15:21
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 .

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.
Peter Below
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Status eines Buttons abfragen

  Alt 16. Jan 2019, 16:01
Hallo peterbelow,

könntest Du mir ein Beispiel für "Action mit dem Button" zeigen? Habe damit so nie gearbeitet.

Gruß, Luckner
  Mit Zitat antworten Zitat
BerndS
Online

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#5

AW: Status eines Buttons abfragen

  Alt 16. Jan 2019, 16:12
Hallo mit
Delphi-Quellcode:
  
procedure TForm1.e1Exit(Sender: TObject);
begin
  if Screen.ActiveControl = btCancel then
    exit
  else
    ...;
end;
könnte man das erreichen.
  Mit Zitat antworten Zitat
16. Jan 2019, 17: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.
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Status eines Buttons abfragen

  Alt 17. Jan 2019, 11:14
@luckner: Ich kenne den Aufbau bei dir nun nicht aber warum deaktivierst du den Button nicht wenn das Panel aktiv wird
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#8

AW: Status eines Buttons abfragen

  Alt 17. Jan 2019, 11:36
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.
Peter Below
  Mit Zitat antworten Zitat
DasWolf

Registriert seit: 7. Jun 2016
76 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: Status eines Buttons abfragen

  Alt 17. Jan 2019, 12:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Status eines Buttons abfragen

  Alt 17. Jan 2019, 12:26
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:29 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