Autor Beitrag
Daniel_K
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: So 13.01.08 04:57 
Hallo,

in einem modal Angezeigten Formular befindet sich ein Textfeld. (TEdit)

Im OnExit Ereignis eines Textfeldes findet folgende Plausiprüfung beim verlassen des Feldes statt, die den Anwender nicht aus dem Feld herauslassen soll, ohne einen gültigen Wert einzugeben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm5.FromToolEditExit(Sender: TObject);
begin
  if not (ActiveControl = CancelBB) then begin 
    if not GueltigerWert(FromToolEdit.Text) then begin
      Fehlermeldung('Bitte einen gültigen Wert eingeben');
      FromToolEdit.SetFocus;
      FromToolEdit.SelectAll;
    end;
  end;
end;


Da ActiveControl bei onExit bereits die Komponente enthält, die den Fokus bekommen soll, prüfe ich (hier in Zeile 3) ob das Formular über den Abbrechen-Button verlassen werden soll, da dann die Plausibilitätskontrolle der Eingaben des Feldes überflüssig sind.

Klickt der Anwender jetzt auf den Abbrechen-Button des Formulars, wird die OnExit-Procedure des Eingabefeldes ausgelöst, bevor der Anwender die Maustaste los läßt :shock: .

Bewegt der Anwender nun den Mauszeiger von dem Abbrechen-Button herunter und läßt erst dann die Maustaste los, wird das Formular nicht verlassen.

Das Eingabefeld hat aber den Fokus ohne Plausi-Prüfung verloren.
Ab jetzt kann so ziemlich alles schief laufen.

Was kann ich dagegen tun, außer bei MausDown auf dem Abbrechen-Button den ModalResult auf mrCancel zu setzen, oder den Anwender zu zwingen eine nicht korrekte Eingabe zu korrigieren bevor er den Dialog abbrechen darf?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 16.01.08 11:18 
Titel: Re: onExit eines TEdit nicht bei Abbrechen-Button (modalForm
Hi

user profile iconDaniel_K hat folgendes geschrieben:

Klickt der Anwender jetzt auf den Abbrechen-Button des Formulars, wird die OnExit-Procedure des Eingabefeldes ausgelöst, bevor der Anwender die Maustaste los läßt :shock: .

das ist logisch. Probiers mal so: Das ModalResult des Cancel-Buttons leer lassen. Beim OnClick deine Prüfung von oben anwerfen. Wenn die Überprüfung ok ist, dann von Hand Form.ModalResult:=mrCancel setzen

user profile iconDaniel_K hat folgendes geschrieben:

Bewegt der Anwender nun den Mauszeiger von dem Abbrechen-Button herunter und läßt erst dann die Maustaste los, wird das Formular nicht verlassen.

in diesem Fall ist es kein "Knopfdruck" (Windowsstandard)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Daniel_K Threadstarter
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: Do 17.01.08 01:05 
Hi, besten Dank Xion für deine Mühe, aber ich glaube ich hab die Frage zu verwirrend Formuliert (oder deine Antwort nicht verstanden)

Wenn der User den Abbrechen Button klickt, muß keine Plausiprüfung stattfinen, da dann das Formular ohne Berücksichtigung der Eingaben geschlossen wird.

Mein Problem ist "lediglich", daß ich bei onExit des Edit-Feldes nicht Feststellen kann, ob der User die Maustaste auf dem Abbrechen Button nur herunterdrückt, oder dort auch wieder losläßt und nur dann das onCLick des Cancel Button wirklich auslöst.

Drückt er Ihn nämlich nur herunter, hat das Edit-Feld ohne die Plausiprüfung in Zeile 4 des Codes den Focus verloren.

Bis jetzt umgehe ich das Problem, in dem ich die Abfrage in Zeile 3 des Codes (in der die Plausiprüfung inaktiviert wird, falls der Abbrechen-Button den Focus bekommen soll) herausgelassen habe.
Dieses wiederum führt dazu, daß ein Anwender der eine Falsche oder noch unvollständige Eingabe in dem Editfeld gemacht hat und das Formular eigentlich nur Abbrechen möchte (somit wäre egal das die Eingabe falsch ist), gezwungen wird eine korrekte Eingabe zu machen, bevor er Abbrechen kann. (würde ich als Anwender als Bug bezeichnen)

Sollte ich keinen neuen Lösungsansatz mehr erhalten, bin ich wohl gezwungen, die Plausiprüfung erst bei onCLick des OK-Buttons zu machen. Wäre sehr sehr schade, in dem Formular sind nämlich noch etliche andere Felder, z.B. Spin-Buttons deren zulässige Wertebereiche von einträgen in anderen Komponenten Abhängig sind. Daher war die Plausiprüfung bei OnExit der einzelnen Komponenten ideal.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 17.01.08 01:17 
Hallo,

ich würde den OK-Button solange deaktivieren bis alle Eingaben ausreichend sind.
Also versuchen eine Plausibilitätsprüfung während der Eingabe zu realisieren.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
uwewo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 154



BeitragVerfasst: Do 17.01.08 08:41 
Hallo,

vielleicht bringt dich das auf neue Ideen.

Button.OnMouseLeave
Button.OnMouseDown
Button.OnMouseUp
Böser Borstel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154



BeitragVerfasst: Fr 18.01.08 11:32 
Ich habe es hinbekommen mit viel getrixe und unsauberer Programmierung -> je nach Rechner muß der FTimer.Interval richtig gesetzt werden.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Edit1Exit(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
    FTest : Boolean;
    FTimer : TTimer;
    procedure FOnTimer(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Edit1Exit(Sender: TObject);
begin
  if (Edit1.Text <> '1'and
    (FTest = FALSE) then
  begin
    // ShowMessage('Bitte einen gültigen Wert eingeben');
    // MessageDlg('thrhth', mtError, [mbOk], 0);
    FTimer.Enabled := TRUE;
  end;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  Close;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  FTimer := TTimer.Create(Self);
  FTimer.Interval := 100;
  FTimer.OnTimer := FOnTimer;
  FTimer.Enabled := FALSE;
end;

procedure TForm2.FOnTimer(Sender: TObject);
begin
  if (Form2.Visible) and
    (FTest = FALSE) then
  begin
    FTimer.Enabled := FALSE;
    ShowMessage('Bitte einen gültigen Wert eingeben');
    Edit1.SetFocus;
    Edit1.SelectAll;
  end;
end;

procedure TForm2.Button2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FTest := TRUE;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  FTest := FALSE;
  FTimer.Enabled := FALSE;
end;

end.


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Fr 18.01.08 13:35 
Hallo,

kannst du nicht einfach die Eingabe prüfen bevor das Fenster geschlossen wird?

Entweder beim Klick auf den OK Button:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm2.Button2Click(Sender: TObject);
begin
  if EingabeOK then
    ModalResult:=mrOK;
  else
    ShowMessage('Bitte einen gültigen Wert eingeben');
end;


oder im CloseQuery des Formular?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if ModalResult=mrOK then    // Anwender hat OK gedrückt
    if not EingabeOK then
    begin
      canClose:=False;        // Formular nicht schließen!!
      ShowMessage('Bitte einen gültigen Wert eingeben');
    end;
end;
Daniel_K Threadstarter
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: Sa 19.01.08 01:08 
Sorry, bin gesten nicht dazu gekommen reinzuschauen.
Danke für die vielen Antworten.

SvenAbeln's Idee möchte ich nicht nutzen, da die Eingabefelder voneinander in Ihrer Plausibilität abhängig sind und so der Anwender ziemlich viel verstellt haben könnte, was er dann alles wieder gerade biegen muß oder von vorne beginnen müsste.

bei Lannes' Idee wird der Anwender ziemlich allein gelassen, er muß solange "rumprobieren" plausible Eingaben zu machen, bis der OK-Button erscheint. OK, man könnte ihn auch irgendwo dabei mit hilfstexten oder ähnlichem unterstützen, aber finde ich persönlich nicht so gut.

Die Idee vom Bösen Börstel ist sehr interessant, allerdings wie er selbst auch schon gepostet hat ein wenig unsauber. Ich habe mir seine Unit in mein D5 kopiert und ein bisschen mit rumgetestet. Wenn der Anwender nach einer falschen Eingabe zum zweiten mal auf den OK-Button (Button1) klickt, und dabei keine 100ms zwischen mouseDown und MouseUp vergehen läßt, wird OK akzeptiert.

Ich habe nicht genau herausgefunden warum, habe aber meine Tests auch abgebrochen, da mich der Anstoß von uwewo völlig begeistert.
Das Problem dabei ist ich programmiere mit Delphi5. Da gibt es onMouseLeave noch nicht.
Ich kenne mich mit den WindowsMessages noch nicht aus, da ich mich mit dem Thema noch nicht beschäftigt habe.
Ich muß mich in das Thema WindowsMessages mal einlesen, da ich gerade auf Hinweise gestoßen bin, daß man das Ereignis onMouseLeave auch in D5 selbst einem Button zuordnen kann. Wenn ich die Lösung habe, werde ich sie hier posten und den Thread dann auf erledigt schalten.

Danke noch mal für eure große Hilfsbereitschaft.

Gruß, Daniel
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Sa 19.01.08 02:27 
Hallo,

schade das Du einen ausgegrauten Ok-Button nicht so schön findest :(

Die Reihenfolge der Ereignisse ist:
Edit.OnExit
Button.OnClick
Button.OnMouseUp (wird immer ausgelöst)

Probier mal das folgende:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if not (ActiveControl = btnAbbrechen) then
    //prüf Eingabe
    else
      btnAbbrechen.Tag := Integer(Sender);//wo war der Focus, merken
end;

procedure TForm1.btnAbbrechenClick(Sender: TObject);
begin
  // damit nachfolgendes onMousUp auf erfolgtes OnClick prüfen kann
  btnAbbrechen.Tag := 0;
end;

procedure TForm1.btnAbbrechenMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If not (btnAbbrechen.Tag = 0then                //es gab kein OnKlick
    ActiveControl := TWinControl(btnAbbrechen.Tag); //also Focus zurück
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Daniel_K Threadstarter
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: Sa 19.01.08 02:51 
Hallo Lannes,

diese Idee gefiel mir auch ausgesprochen gut.

Schade nur, daß ich nach implementierung feststellen musste, daß TForm1.btnAbbrechenMouseUp nicht ausgelöst wird, wenn der Anwender wie anfangs beschrieben nach MouseDown den Mauszeiger vom Abbrechen-Button wegbewegt, bevor er den Mousebutton wieder losläst.

Ich bleib am Ball...
Daniel_K Threadstarter
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: Sa 19.01.08 03:55 
user profile iconuwewo hat folgendes geschrieben:
Hallo,

vielleicht bringt dich das auf neue Ideen.

Button.OnMouseLeave
Button.OnMouseDown
Button.OnMouseUp


Ich würde die Idee gerne aufgreifen, mein Problem ist aber, daß das Ereignis OnMouseLeave noch nicht in Delphi5 enthalten ist.

Bei meinen recherchen habe ich Aussagen gefunden, die besagen, daß man einem Button das entsprechende Windows-Ereignis CM_MOUSELEAVE hinzufügen kann.
Leider habe ich keine mir einleuchtende Erklärung gefunden wie das gehen soll.
Irgendwie bleibt der Aha-Effect bei mir vollkommen aus.
Kann mir bitte jemand eine Einfache Erklärung dafür geben?
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Sa 19.01.08 12:40 
Hallo,
user profile iconDaniel_K hat folgendes geschrieben:
Schade nur, daß ich nach implementierung feststellen musste, daß TForm1.btnAbbrechenMouseUp nicht ausgelöst wird, wenn der Anwender wie anfangs beschrieben nach MouseDown den Mauszeiger vom Abbrechen-Button wegbewegt, bevor er den Mousebutton wieder losläst.

Hab das gerade auch mal in TurboDelphi getestet, wie schon gesagt, MouseUp wird auch dann ausgelöst.
Bau den Code zum Testen doch mal in eine neue Anwendung ein.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Sa 19.01.08 14:37 
zu dem OnMouseLeave:

diese Komponente ermöglicht ein OnMouseLeave eines Images. Einfach analog für deinen Button machen und zur Runtime zuweisen (du musst dann wohl den ganzen Button zur Runtime erstellen)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
unit AdvImage;

interface

uses ExtCtrls,Classes,Messages ;

const
  WM_MouseEnter = $B013;
  WM_MouseLeave = $B014;

type
  TAdvImage = class(TImage)
  private
    FOnMouseLeave: TNotifyEvent;
    FOnMouseEnter: TNotifyEvent;
    procedure WM_MouseEnter(var Msg: TMessage); message WM_MouseEnter;
    procedure WM_MouseLeave(var Msg: TMessage); message WM_MouseLeave;
    procedure SetOnMouseEnter(const Value: TNotifyEvent);
    procedure SetOnMouseLeave(const Value: TNotifyEvent);
  published
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write SetOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write SetOnMouseLeave;
  end;

{ TAdvImage }
implementation

procedure TAdvImage.WM_MouseLeave(var Msg: TMessage);
begin
  if Assigned(FOnMouseLeave) then
    FOnMouseLeave(self);
end;

procedure TAdvImage.WM_MouseEnter(var Msg: TMessage);
begin
  if Assigned(FOnMouseEnter) then
    FOnMouseEnter(self);
end;

procedure TAdvImage.SetOnMouseEnter(const Value: TNotifyEvent);
begin
  FOnMouseEnter := Value;
end;

procedure TAdvImage.SetOnMouseLeave(const Value: TNotifyEvent);
begin
  FOnMouseLeave := Value;
end;
end.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Daniel_K Threadstarter
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: Mo 21.01.08 12:57 
user profile iconLannes hat folgendes geschrieben:
Hallo,
user profile iconDaniel_K hat folgendes geschrieben:
Schade nur, daß ich nach implementierung feststellen musste, daß TForm1.btnAbbrechenMouseUp nicht ausgelöst wird, wenn der Anwender wie anfangs beschrieben nach MouseDown den Mauszeiger vom Abbrechen-Button wegbewegt, bevor er den Mousebutton wieder losläst.

Hab das gerade auch mal in TurboDelphi getestet, wie schon gesagt, MouseUp wird auch dann ausgelöst.
Bau den Code zum Testen doch mal in eine neue Anwendung ein.


Sorry, du hast absolut recht, hab ich wohl beim letzten Test mist gebaut. Danke dir und auch allen anderen die sich hier beteiligt haben.
Erichgue
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 86

Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
BeitragVerfasst: Mo 21.01.08 14:03 
Titel: oder so?
In OnExit deines Edits kannst du folgendes prüfen

ausblenden Delphi-Quelltext
1:
2:
if ActiveControl = [DeinAbbruchButton] then
else


Erich
Daniel_K Threadstarter
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: Di 22.01.08 00:31 
Danke für deine Mühe Erichgue, aber wenn du dich darauf verläst, dann solltest du dir entweder den thread nochmal gründlich von beginn an durchlesen, oder in der Anwendung in der du dich darauf verläst mal folgendes machen:

Mache eine falsche Eingabe in ein Feld das bei onExit geprüft wird außer wenn der Abbrechen-Button den Focus bekommen soll.

Klicke dann auf den Abbrechen-Button, lasse die Maustaste nicht los, bewege den Mauszeiger vom Abbrechen-Button herunter und lasse dann die Maustaste los.

Jetzt hat dein Eingabefeld ohne Plausi-Kontrolle den Focus an den Abbrechen-Button abgegeben.



Die Lösung für das Problem steht in Lannes Antwort von Sa 19.01.08 01:27
Da mußt du noch bei dem MouseUp-Event eine Prüfung hinzufügen, ob es auch tatsächlich die linke Maustaste ist, die losgelassen wird, und dann funktioniert es.
Erichgue
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 86

Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
BeitragVerfasst: Di 22.01.08 09:01 
user profile iconDaniel_K hat folgendes geschrieben:
Danke für deine Mühe Erichgue, aber wenn du dich darauf verläst, dann solltest du dir entweder den thread nochmal gründlich von beginn an durchlesen, oder in der Anwendung in der du dich darauf verläst mal folgendes machen:

Mache eine falsche Eingabe in ein Feld das bei onExit geprüft wird außer wenn der Abbrechen-Button den Focus bekommen soll.

Klicke dann auf den Abbrechen-Button, lasse die Maustaste nicht los, bewege den Mauszeiger vom Abbrechen-Button herunter und lasse dann die Maustaste los.

Jetzt hat dein Eingabefeld ohne Plausi-Kontrolle den Focus an den Abbrechen-Button abgegeben.


Ok, hatte ich in der Tat diesen Umstand nicht berück sichtig, bzw. nie getestet.
Betrachtet hiermit bitte meinen Vorschlag als nicht geschrieben.

Gruß

Erich
Erichgue
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 86

Win XP/2000/7
TurboPacal 7.0; Delphi 2/5/7; BDS 2006/2010/XE6; C#; MSSQl 2000
BeitragVerfasst: Do 24.01.08 08:54 
Titel: Und es geht doch!
Hallo,
ungeachtet dessen, das es hier Teilnehmer gibt, die ihre Arroganz gerne an den Tage legen,
habe ich mir die Problematik nochmals überlegt.

Folgenden Lösungsansatz haben ich gefunden:
Ein Button hat die Eigenschaft ModalResult.
Der Wert von ModalResult wird in die Eigenschaft ModalResult des Formulares geschrieben, wenn der Button gedrückt wird, und bevor das Exit des aktiven Controls aufgerufen wird.
Es ist egal, ob das Formular modal ist oder nicht.

Daraus ergibt sich folgender Ansatz:

Gegeben sei ein TEdit (Edit) und ein TButton (btAbbrechen) mit ModalResult <> 0
Die Methode EditExit ist dem OnExit von Edit zugewiesen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Procedure TForm1.EditExit(sender : TObject);
begin
  // Prüfen, ob das ModalResult durch betätigen von btAbbrechen gesetzt wurde.
  if ModalResult <> btAbbrechen.ModalResult then
  begin
     // Hier Prüfung vornehmen.
  end;
end;


Gruß

Erich
Daniel_K Threadstarter
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: Sa 26.01.08 02:03 
Titel: Re: Und es geht doch!
user profile iconErichgue hat folgendes geschrieben:
...
ungeachtet dessen, das es hier Teilnehmer gibt, die ihre Arroganz gerne an den Tage legen,
...


Hallo Erich,

ich denke mal mit dieser Bemerkung meinst du mich :-(

Sorry, wenn das was ich dir geantwortet hatte für dich arrogant klang.
Zunächst möchte ich einmal betonen, daß ich dankbar gegenüber jedem bin, der sich mit meinem Problem beschäftigt.
Denjenigen die mir helfen wollen arrogant zu Antworten ist daher das letzte das ich möchte.

user profile iconDaniel_K hat folgendes geschrieben:
...
aber wenn du dich darauf verläst, dann solltest du dir entweder den thread nochmal gründlich von beginn an durchlesen, oder in der Anwendung in der du dich darauf verläst mal folgendes machen:
...


Mein Ausdruck "wenn du dich darauf verläst" (evt war es der, der dich stört) bezog sich wirklich darauf, dass ich vermutet hatte, dass du den Fehler
(den ich in etlichen Programmen bereits gemacht hatte, auf den mich überhaupt erst vor kurzem ein neuer sehr guter Betatester aufmerksam gemacht hat)
auch in deiner Programmierung bereits irgendwann mal gemacht hast
(was auch nochmal durch meine Formulierung "in der Anwendung in der du dich darauf verläst" ersichtlich wird).
Meine Empfehlung an dich, dir den Threat nochmal aufmerksam durchzulesen war ehrlich gemeint, und sollte dich davor bewahren, diesen Fehler in Zukunft wieder zu machen, bzw. sollte dir die Chance geben, den Fehler in deinen bereits fertiggestellten Programmen zu korigieren.

Falls du irgendetwas anderes von dem was ich geschrieben habe meinst, dann sag mir bitte was es war.
Da es nach meiner Meinung nur ein Mißverständniss sein kann, werden wir dies dann sicherlich auch beseitigen können.

Danke nochmal für deine Mühe

Daniel
Daniel_K Threadstarter
Hält's aus hier
Beiträge: 14


Delphi5
BeitragVerfasst: Sa 26.01.08 02:15 
Titel: Re: Und es geht doch!
Hallo nochmal Erich,

nach dem persönlichen jetzt nochmal zum sachlichen.

Aufgrund deiner neuen Idee habe ich mal das folgende Testformular erzeugt, was ich aus einem anderen Formular mit form7.showmodal; aufrufe.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
unit Unit7;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm7 = class(TForm)
    Edit1: TEdit;
    btOK: TButton; 
    btAbbrechen: TButton; 
    procedure FormShow(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form7: TForm7;

implementation

{$R *.DFM}

procedure TForm7.FormShow(Sender: TObject);
begin
  btOk.ModalResult:=mrOK;
  btAbbrechen.ModalResult:=mrCancel;
end;


procedure TForm7.Edit1Exit(Sender: TObject);
begin
  if ModalResult <> btAbbrechen.ModalResult then begin
    if Edit1.Text='' then begin
      showmessage('Fehler');
      Edit1.SetFocus;
    end;
  end;
end;

end.


In meinem Delphi5 bleibt aber leider der gewünschte Effect aus.
Ich kann das Formular nicht mit Abbrechen beenden, wenn das Edit-Feld leer ist.
Mache ich etwas falsch?
Oder gibt es womöglich sogar unterschiede in verschiedenen Delphi-Versionen (Ich nutze Delphi5)?