Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zustand eines Buttons erkennen (https://www.delphipraxis.net/187007-zustand-eines-buttons-erkennen.html)

Luckner 20. Okt 2015 12:14

Zustand eines Buttons erkennen
 
Hallo,

folgendes Problem. Ich habe ein Editfeld und einen Abbruch-Button. Im Editfeld sollen und müssen nur Zahlen eingetragen werden. Diese Überprüfung habe ich realisiert im OnExit-Ereigniss und es funktioniert auch. Wenn ich jedoch auf den Abbruch-Button drücke, dann kommen entsprechende Fehlermeldung, weil das OnExit-Ereigniss natürlich aktiv wird. Wenn ich jedoch einen Klick-Zustand des Button auslesen könnte, dann würde ich mit einer Abfrage gleich rausspringen. Geht das? (Bestimmt, nur ich weiß nicht wie).

Gruß, Luckner

Sailor 20. Okt 2015 12:17

AW: Zustand eines Buttons erkennen
 
Im OnClick-Ereignis des Buttons ein Flag setzen, das den Abbruch signalisiert

Sir Rufo 20. Okt 2015 12:27

AW: Zustand eines Buttons erkennen
 
Zitat:

Zitat von Sailor (Beitrag 1319190)
Im OnClick-Ereignis des Buttons ein Flag setzen, das den Abbruch signalisiert

Was nichts bringt, denn erst kommt
Delphi-Quellcode:
TEdit.OnExit
,
Delphi-Quellcode:
TButton.OnEnter
und dann
Delphi-Quellcode:
TButton.OnClick
. Und hier ist bei
Delphi-Quellcode:
TEdit.OnExit
schon Schluss (so wird es jedenfalls beschrieben)

baumina 20. Okt 2015 12:29

AW: Zustand eines Buttons erkennen
 
Ein OnExit wird nur aufgerufen, wenn das Feld den Fokus verliert. Ein Buttonklick holt sich nicht immer den Fokus, deswegen wundert mich das beschriebene Verhalten. Vielleicht wäre es sinnvoller die Validierung zu einem anderen Zeitpunkt zu machen.

Sir Rufo 20. Okt 2015 12:31

AW: Zustand eines Buttons erkennen
 
Zitat:

Zitat von baumina (Beitrag 1319193)
Ein OnExit wird nur aufgerufen, wenn das Feld den Fokus verliert. Ein Buttonklick mit der Maus holt sich im Normalfall nicht den Fokus, deswegen wundert mich das beschriebene Verhalten. Vielleicht wäre es sinnvoller die Validierung zu einem anderen Zeitpunkt zu machen.

Das ist bei einem
Delphi-Quellcode:
TSpeedButton
richtig ... ein
Delphi-Quellcode:
TButton
bekommt aber den Fokus (vor dem Klick)

baumina 20. Okt 2015 12:34

AW: Zustand eines Buttons erkennen
 
Ist der Button z.B. Default, Cancel oder per Shortcut erreichbar und es wird die entsprechende Taste gedrückt, bekommt der Button keinen Fokus.

Sir Rufo 20. Okt 2015 12:38

AW: Zustand eines Buttons erkennen
 
Zitat:

Zitat von baumina (Beitrag 1319195)
Ist der Button z.B. Default, Cancel oder per Shortcut erreichbar und es wird die entsprechende Taste gedrückt, bekommt der Button keinen Fokus.

Der TE drückt aber keine Taste, sondern den Button ... und das geht nur mit der Maus, bzw. dieses angesprochene Problem bekommt er nur in der Kombination mit einem
Delphi-Quellcode:
TButton
und einem Mausklick.

Wäre es anders hätte er nicht gefragt, weil er kein Problem hätte ;)

baumina 20. Okt 2015 12:39

AW: Zustand eines Buttons erkennen
 
Ja vielleicht nicht verständlich genug ausgedrückt. Wichtig war mir zu sagen, dass das OnExit-Ereignis nicht zuverlässig genug für eine Validierung ist.

Sir Rufo 20. Okt 2015 12:43

AW: Zustand eines Buttons erkennen
 
Zitat:

Zitat von baumina (Beitrag 1319197)
Ja vielleicht nicht verständlich genug ausgedrückt. Wichtig war mir zu sagen, dass das OnExit-Ereignis nicht zuverlässig genug für eine Validierung ist.

Gegen die Validierung spricht nichts ... aber eben nur eine Validierung und eben kein zwanghaftes Festhalten an dem Control.

frankyboy1974 20. Okt 2015 12:48

AW: Zustand eines Buttons erkennen
 
hallo,

also ich würde damit leben können. Der Anwender gibt in ein Zahlenfeld einen String ein und drückt anschliessend auf Abbrechen. Das Feld sagt nun geben "Geben Sie bitte einen Zahlenwert ein". Auch wenn der Anwender sowieso den Vorgang abbrechen möchte, könnte ich damit leben, das der Anwender erstmal einen Zahlenwert eingeben muss.
Valiediere ich also direkt bei der Eingabe oder erst wenn alle Eingaben vom Anwender getätigt wurden sind, egal wie du das progammierst, am Ende steht einer und sagt, dass hätte ich aber anders programmiert.:?

mfg

Luckner 20. Okt 2015 12:56

AW: Zustand eines Buttons erkennen
 
Das Problem ist, dass ich gerne wieder zurück in das Edit-Feld springen würde, falls Jemand doch keine Zahl eingibt. Dadurch erzeuge ich eine Schleife aus der man nicht so schnell rauskommt.

Sir Rufo 20. Okt 2015 13:02

AW: Zustand eines Buttons erkennen
 
Also mal ganz rudimentär würde ich so etwas vorschlagen:
Delphi-Quellcode:
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm3 = class( TForm )
    Value1Edit: TEdit; // Validate OnChange
    Value2Edit: TEdit; // Validate OnExit
    Value3Edit: TEdit; // Validate Button.OnClick
    Button1: TButton;
    Value1ErrorLabel: TLabel;
    Value2ErrorLabel: TLabel;
    Value3ErrorLabel: TLabel;
    procedure Value1EditChange( Sender: TObject );
    procedure Value2EditExit( Sender: TObject );
    procedure Button1Click( Sender: TObject );
  private
    FValue1Valid, FValue2Valid, FValue3Valid: Boolean;
    FValue1, FValue2, FValue3               : Integer;
    procedure ValidateValue1;
    procedure ValidateValue2;
    procedure ValidateValue3;
  public

  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Value1EditChange( Sender: TObject );
begin
  ValidateValue1;
end;

procedure TForm3.Value2EditExit( Sender: TObject );
begin
  ValidateValue2;
end;

procedure TForm3.Button1Click( Sender: TObject );
begin
  ValidateValue1;
  ValidateValue2;
  ValidateValue3;

  if FValue1Valid and FValue2Valid and FValue3Valid
  then
    begin

    end;
end;

procedure TForm3.ValidateValue1;
begin
  FValue1Valid := TryStrToInt( Value1Edit.Text, FValue1 );
  if FValue1Valid
  then
    Value1ErrorLabel.Caption := ''
  else
    Value1ErrorLabel.Caption := 'not a valid number';
end;

procedure TForm3.ValidateValue2;
begin
  FValue2Valid := TryStrToInt( Value2Edit.Text, FValue2 );
  if FValue2Valid
  then
    Value2ErrorLabel.Caption := ''
  else
    Value2ErrorLabel.Caption := 'not a valid number';
end;

procedure TForm3.ValidateValue3;
begin
  FValue3Valid := TryStrToInt( Value3Edit.Text, FValue3 );
  if FValue3Valid
  then
    Value3ErrorLabel.Caption := ''
  else
    Value3ErrorLabel.Caption := 'not a valid number';
end;

end.

DeddyH 20. Okt 2015 13:04

AW: Zustand eines Buttons erkennen
 
Könnte man nicht den Sender-Parameter auswerten? Oder alternativ das Edit gleich so einstellen, dass nur (ganze) Zahlen akzeptiert werden, in älteren Delphis gibt es da zwar noch keine Property für, kann man aber nachbauen.

mm1256 20. Okt 2015 13:47

AW: Zustand eines Buttons erkennen
 
Yupp...sehe ich genauso wie DeddyH. Noch dazu ist das "Nachrüsten" mit einer einzigen Zeile Quellcode passiert:

Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if ord(Key) > 27 then if not (Key in ['0'..'9']) then Key := #0;
end;
Und wenn ich z.B. 20 Edit's auf der Form hätte, dann weise ich das halt jedem TEdit zu. Es bleibt bei einer Zeile Code.

EDIT: Abgesehen davon finde ich persönlich (andere Programmierer mögen andere Meinungen haben) es etwa abartig, einem Anwender zuerst statt Zahlen irgendwas Anderes eingeben zu lassen, die Eingabe zu überprüfen, um ihm dann mitzuteilen, dass er Bockmist eingegeben hat.

DeddyH 20. Okt 2015 13:51

AW: Zustand eines Buttons erkennen
 
Ich hatte jetzt eher an so etwas gedacht:
Delphi-Quellcode:
procedure MakeEditNumbersOnly(TheEdit: TCustomEdit);
begin
  Assert(Assigned(TheEdit));
  SetWindowLong(TheEdit.Handle, GWL_STYLE, GetWindowLong(TheEdit.Handle, GWL_STYLE) or ES_NUMBER);
end;

Dalai 20. Okt 2015 13:53

AW: Zustand eines Buttons erkennen
 
Ich habe sowas ähnliches kürzlich umgesetzt und dabei das Ereignis OnKeyPress bemüht. Dafür hab ich ganz dreist von hier geguttenbergt.

MfG Dalai

p80286 20. Okt 2015 13:53

AW: Zustand eines Buttons erkennen
 
Zitat:

Zitat von mm1256 (Beitrag 1319208)
Yupp...sehe ich genauso wie DeddyH. Noch dazu ist das "Nachrüsten" mit einer einzigen Zeile Quellcode passiert:

Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if ord(Key) > 27 then if not (Key in ['0'..'9']) then Key := #0;
end;
Und wenn ich z.B. 20 Edit's auf der Form hätte, dann weise ich das halt jedem TEdit zu. Es bleibt bei einer Zeile Code.

wenn ich mich richtig erinnere fehlt da noch Return,Backspace....:angel2:
aber das Prinzip ist schon mal gut.
Wobei ich irgendwie das Gefühl habe das die Validierung zum falschen Zeitpunkt stattfindet.
Wenn nach dem onExit der Abbruch oder die Validierung stattfinden soll, wäre es nicht schlecht das auch so zu programmieren.

Gruß
K-H

mm1256 20. Okt 2015 13:57

AW: Zustand eines Buttons erkennen
 
Zitat:

Zitat von p80286 (Beitrag 1319211)
..wenn ich mich richtig erinnere fehlt da noch Return,Backspace..

Nein, fehlt nicht, weil das durch
Code:
if ord(Key) > 27
bereits erledigt wird.

Zitat:

Zitat von p80286 (Beitrag 1319211)
Wenn nach dem onExit der Abbruch oder die Validierung stattfinden soll, wäre es nicht schlecht das auch so zu programmieren.

Das ist ja die grundsätzliche Frage zur Vorgehensweise. Beim Autofahren würde man ja auch zuerst den Sicherheitsgurt anlegen (Validierung) um dann los zu fahren (Eingabe auswerten) anstelle loszufahren und wenn es gekracht hat den Gurt anlegen. Das meinte ich mit "abartig".

DeddyH 20. Okt 2015 14:01

AW: Zustand eines Buttons erkennen
 
Bei der KeyPress-Variante wird aber die Zwischenablage nicht berücksichtigt, d.h. damit bekommt man immer noch Grütze ins Edit.

Luckner 20. Okt 2015 14:17

AW: Zustand eines Buttons erkennen
 
Hallo,
habe vergessen zu erwähnen, das es sich um ein 'TJvValidateEdit' von den Jedi-Tools handelt. Die Validierung übernimmt schon dieses Tool. Das Edit-Feld darf nur nicht leer sein bzw. die Zahlen müssen in einer bestimmten Tabelle existieren.

Jumpy 20. Okt 2015 14:20

AW: Zustand eines Buttons erkennen
 
Deswegen ist es wohl am besten einfach beides zu machen :-D

Ist doch bei Formularen im Internet meist auch so. Wenn möglich wird begrenzt, was da so eingegeben werden kann, trotzdem findet eine serverseitige Validierung statt, die dann entsprechende Fehleingaben zurückmeldet.
Das wäre dann (bezogen auf dieses Beispiel) aber nicht unbedingt beim OnExit eines Controls, sondern bei drücken des Speichern-Buttons.

mm1256 20. Okt 2015 14:22

AW: Zustand eines Buttons erkennen
 
Zitat:

Zitat von Luckner (Beitrag 1319189)
Hallo,

folgendes Problem. Ich habe ein Editfeld und einen Abbruch-Button. Im Editfeld sollen und müssen nur Zahlen eingetragen werden....

Wenn ich das "müssen" richtig interpretiere, darf der Inhalt des TEdit nicht leer sein. Folglich muss an anderer Stelle sowieso noch eine Validierung auf <> '' stattfinden, womöglich auch noch Wertebereich-Check usw.

BTW ein einfaches TEdit ist nun mal keine "gute" Komponente für ein rein numerisches Eingabefeld. Auch nicht die neue Variante mit "NumbersOnly", denn wenn die z.B. noch mit dem Default-Text "Edit1" vorbelegt ist, oder der Text falsch vorbelegt wird (Edit1.Text := 'Hallo') dann hat man ein ähnliches Problem.

FarAndBeyond 20. Okt 2015 14:56

AW: Zustand eines Buttons erkennen
 
FormKeyPress:
Delphi-Quellcode:
If Sender Is TEdit
Then
 Begin
  If Pos(Key,'1234567890'+#8#27#13) = 0 Then Key:= #0;
 End;

himitsu 20. Okt 2015 14:58

AW: Zustand eines Buttons erkennen
 
Nur ein Tipp zum Vorgehen, ohne dass etwas blockiert:

Keine blokierenden Operationen im OnExit und es gibt keine Probleme. :roll:


Im OnExit oder OnChange nur prüfen und dann per Farbe, Hint, BallonHint oder Dergleichen den Status/Hinweis anzeigen.
Der HintText ist auch nett, wenn etwas eingegeben werden muß, da er nur angezeigt wird, wenn nichts in Text steht.

Und bei "OK" (Ausführen der Aktion) dann mit richtigen Fehlermeldungen um sich werden, wenn dann immernoch nichts drin steht.

baumina 20. Okt 2015 15:04

AW: Zustand eines Buttons erkennen
 
Ich hab die Jedis nicht, aber hat so ein TJvValidateEdit kein OnValidate-Event?

FarAndBeyond 20. Okt 2015 18:12

AW: Zustand eines Buttons erkennen
 
Zitat:

Bei der KeyPress-Variante wird aber die Zwischenablage nicht berücksichtigt, d.h. damit bekommt man immer noch Grütze ins Edit.
Seit wann kann Grütze selbstständig irgendwo hingehen?
Außerdem kann man den einfachen Zugang ja blocken:
Delphi-Quellcode:
Procedure TForm1.Edit1ContextPopup(Sender: TObject; MousePos: TPoint; Var Handled: Boolean);
 Begin
  Handled:= True;
 End;

Procedure TForm1.Edit1KeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
 Begin
  If (ssShift In Shift) Then Key:= 0;
 End;

Procedure TForm1.Edit1KeyPress(Sender: TObject; Var Key: Char);
 Begin
  If Pos(Key,'1234567890'+#8#27#13) = 0 Then Key:= #0;
 End;
STRG+V und Shift+Einfg fällt jetzt flach und ebenso die rechte Maustaste...

Das sollte doch erstmal reichen, außerdem gibt es immernoch Try Except End.
Was bleibt wäre expliziter Code... gibt es sonst noch 'was???

mm1256 20. Okt 2015 18:22

AW: Zustand eines Buttons erkennen
 
Die Jedi's kenne ich nicht. (Vorab-)Validierung bei der Eingabe lässt sich meiner Meinung nach immer noch am Benutzerfreundlichsten mit der Orpheus-Bibliothek von Turbopower realisieren, die ich mittlerweile schon ca. 18 Jahren verwende. Sind OpenSource und heute immer noch erste Sahne, dazu die komfortablen Einstellungen im OvcController wie AutoAdvanceChar, AutoAdvanceLeftRight, AutoAdvanceUpDown, AutoSelect, BeepOnError und InsertPushes.

HolgerX 20. Okt 2015 19:04

AW: Zustand eines Buttons erkennen
 
Um mal zur Fragestellung zurück zu kommen...

Mit Delphi 6 gehts z.B. so:

Delphi-Quellcode:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if not(ActiveControl is TButton) then DoValidate(Edit1.Text);
end;
Statt '(ActiveControl is TButton)' kannst Du auch 'ActiveControl = AbbruchButton' benutzen und somit wird das Validieren nur ausgeführt, wenn du NICHT auch Abbruch clickst.. ;)

Luckner 21. Okt 2015 12:32

AW: Zustand eines Buttons erkennen
 
Danke an Alle. HolgerX werde Deinen Vorschlag mal ausprobieren und werde das Ergebnis hier melden.

Luckner.

Luckner 23. Okt 2015 10:03

AW: Zustand eines Buttons erkennen
 
Hallo HolgerX,

bin gerade erst dazu gekommen Dein Vorschlag auszuprobieren. Leider schmeißt mein Delphi7 Ent. 'ActiveControl' als undefinierten Bezeichner raus. Benutzt Du spezielle Buttons?

Gruß, Luckner

baumina 23. Okt 2015 10:07

AW: Zustand eines Buttons erkennen
 
TForm.ActiveControl hat nichts mit dem Button zu tun.

Luckner 23. Okt 2015 10:32

AW: Zustand eines Buttons erkennen
 
Danke baumina. Jetzt scheint es zu funktionieren.

Luckner


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:48 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