Abfrage wird zweimal durchlaufen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Lazarus-Tom
Beiträge: 11
Registriert: So 6. Jun 2010, 16:07

Abfrage wird zweimal durchlaufen

Beitrag von Lazarus-Tom »

Hallo Forum,

wird schön langsam was...

1. Problem aktuell:

Code: Alles auswählen

 
procedure TfrmHauptfenster.lbeRezeptEditingDone(Sender: TObject);
var
  Dummy: PChar;
begin
  Rezept := lbeRezept.Text;
  Dummy := PChar('Rezeptname ok: "' + Rezept + '"?');
  lbeRezept.Enabled := False;
  if Application.MessageBox(Dummy, 'Bestätigung', MB_ICONQUESTION + MB_YESNO) = idYes then
  begin
    lbeAbfragetext.Enabled := True;
    memRezept.Clear;
    memRezept.Lines.Add(Rezept);
  end
  else
  begin
    ShowMessage('Rezeptnamen bitte neu eingeben!');
    lbeRezept.Enabled := True;
  end;
 
end;    
 
Die Abfrage läuft prinzipiell immer 2 x durch (Messagebox kommt 1 x hoch, nach Drücken auf Yes oder No kommt sie wieder), danach geht es erst im Programm weiter.

Ist das ein Problem des OnEditingDone (das ich aus einem TLabeledEdit aus anspringe)?

2. Problem: Die englischen "Yes" und "No"-Buttons kann man nicht so einfach "eindeutschen"?

Danke & Viele Grüße,

Tom
Zuletzt geändert von Lori am Fr 11. Apr 2014, 14:48, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Abfrage wird zweimal durchlaufen

Beitrag von Michl »

Was bezweckst Du denn damit?:

Code: Alles auswählen

  lbeRezept.Enabled := False;
Dies dürfte der Auslöser für den nochmaligen Aufruf von .EditingDone sein!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: Abfrage wird zweimal durchlaufen

Beitrag von wp_xyz »

Ich würde das Ereignis OnEditingDone gar nicht verwenden, weil es immer ausgelöst wird, wenn das Edit-Feld verlassen wird (TAB drücken), auch wenn nichts geändert worden ist. Von den Abläufen einfacher zu verstehen wäre für mich ein Schalter "Übernehmen" oder "OK", den man ja als Default setzen kann, so dass er auf ENTER reagiert.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Abfrage wird zweimal durchlaufen

Beitrag von Michl »

@wp_xyz: Ich persönlich nutze auch öfters die direkte Eingabe und frage OnEditingDone ab - finde ich teilweise schöner. Um zu testen, ob eine geänderte Eingabe erfolgt ist oder nicht, könnte man z.B. ".Modified" abfragen.

@Lazarus-Tom: Frage 2 siehe http://wiki.lazarus.freepascal.org/Tran ... _Programms
Ansonsten gibts im Forum schon einige Threads deswegen:
http://www.lazarusforum.de/viewtopic.ph ... 02&p=47497
oder
http://www.lazarusforum.de/viewtopic.php?p=60818#p60818

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Lazarus-Tom
Beiträge: 11
Registriert: So 6. Jun 2010, 16:07

Re: Abfrage wird zweimal durchlaufen

Beitrag von Lazarus-Tom »

Michl hat geschrieben:Was bezweckst Du denn damit?:

Code: Alles auswählen

  lbeRezept.Enabled := False;
Dies dürfte der Auslöser für den nochmaligen Aufruf von .EditingDone sein!
An dieser Stelle ist der Rezeptname eingegeben UND überprüft worden. Eine weiter Eingabe ist nicht nötig!

Ich habe das mal rausgelassen: Trotzdem der Artefakt.

Viele Grüße,

Tom

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Abfrage wird zweimal durchlaufen

Beitrag von Michl »

Lazarus-Tom hat geschrieben:An dieser Stelle ist der Rezeptname eingegeben UND überprüft worden. Eine weiter Eingabe ist nicht nötig!

Ich habe das mal rausgelassen: Trotzdem der Artefakt.
Habs eben getestet, wenn ich es auskommentiere, kommt es nicht zu einem zweiten Aufruf:

Code: Alles auswählen

procedure TForm1.LabeledEdit1EditingDone(Sender: TObject);
var
  Rezept: String;
begin
  Rezept := LabeledEdit1.Text;
//  LabeledEdit1.Enabled:=False;
  if Application.MessageBox(PChar('Rezeptname ok: "' + Rezept + '"?'), 'Bestätigung', MB_ICONQUESTION + MB_YESNO) = idYes then
  begin
    ShowMessage('Alles OK');
    LabeledEdit1.Enabled:=True;
  end
  else
  begin
    ShowMessage('Rezeptnamen bitte neu eingeben!');
    LabeledEdit1.Enabled:=True;
  end;
end;
Lazarus-Tom hat geschrieben:An dieser Stelle ist der Rezeptname eingegeben UND überprüft worden. Eine weiter Eingabe ist nicht nötig!
Soweit konnt ich mir das schon denken, das Problem ist, dass Du dadurch das Event vom LabeledEdit nicht ordentlich abarbeiten lässt. IMHO, entweder Du verzichtest darauf das LabeledEdit auszustellen, verbiegst das Event oder nutzt den Ansatz von wp_xyz mit einem separaten Button (was in diesem Fall wahrscheinlich die sauberste Lösung wäre).

[Edit]Mit einem Application.Processmessage wird das LabeledEdit bei mir dann auch ordentlich ausgeschaltet und .EditingDone nicht doppelt aufgerufen:

Code: Alles auswählen

procedure TForm1.LabeledEdit1EditingDone(Sender: TObject);
var
  Rezept: String;
begin
  Rezept := LabeledEdit1.Text;
  LabeledEdit1.Enabled:=False;
  Application.ProcessMessages;
  if Application.MessageBox(PChar('Rezeptname ok: "' + Rezept + '"?'), 'Bestätigung', MB_ICONQUESTION + MB_YESNO) = idYes then
  begin
    ShowMessage('Alles OK');
    LabeledEdit1.Enabled:=True;
  end
  else
  begin
    ShowMessage('Rezeptnamen bitte neu eingeben!');
    LabeledEdit1.Enabled:=True;
  end;
end; 
...gefällt mir trotzdem irgendwie nicht.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Lazarus-Tom
Beiträge: 11
Registriert: So 6. Jun 2010, 16:07

Re: Abfrage wird zweimal durchlaufen

Beitrag von Lazarus-Tom »

Michl hat geschrieben:
Lazarus-Tom hat geschrieben:An dieser Stelle ist der Rezeptname eingegeben UND überprüft worden. Eine weiter Eingabe ist nicht nötig!

Ich habe das mal rausgelassen: Trotzdem der Artefakt.
Habs eben getestet, wenn ich es auskommentiere, kommt es nicht zu einem zweiten Aufruf:

Code: Alles auswählen

procedure TForm1.LabeledEdit1EditingDone(Sender: TObject);
var
  Rezept: String;
begin
  Rezept := LabeledEdit1.Text;
//  LabeledEdit1.Enabled:=False;
  if Application.MessageBox(PChar('Rezeptname ok: "' + Rezept + '"?'), 'Bestätigung', MB_ICONQUESTION + MB_YESNO) = idYes then
  begin
    ShowMessage('Alles OK');
    LabeledEdit1.Enabled:=True;
  end
  else
  begin
    ShowMessage('Rezeptnamen bitte neu eingeben!');
    LabeledEdit1.Enabled:=True;
  end;
end;
Lazarus-Tom hat geschrieben:An dieser Stelle ist der Rezeptname eingegeben UND überprüft worden. Eine weiter Eingabe ist nicht nötig!
Soweit konnt ich mir das schon denken, das Problem ist, dass Du dadurch das Event vom LabeledEdit nicht ordentlich abarbeiten lässt. IMHO, entweder Du verzichtest darauf das LabeledEdit auszustellen, verbiegst das Event oder nutzt den Ansatz von wp_xyz mit einem separaten Button (was in diesem Fall wahrscheinlich die sauberste Lösung wäre).

[Edit]Mit einem Application.Processmessage wird das LabeledEdit bei mir dann auch ordentlich ausgeschaltet und .EditingDone nicht doppelt aufgerufen:

Code: Alles auswählen

procedure TForm1.LabeledEdit1EditingDone(Sender: TObject);
var
  Rezept: String;
begin
  Rezept := LabeledEdit1.Text;
  LabeledEdit1.Enabled:=False;
  Application.ProcessMessages;
  if Application.MessageBox(PChar('Rezeptname ok: "' + Rezept + '"?'), 'Bestätigung', MB_ICONQUESTION + MB_YESNO) = idYes then
  begin
    ShowMessage('Alles OK');
    LabeledEdit1.Enabled:=True;
  end
  else
  begin
    ShowMessage('Rezeptnamen bitte neu eingeben!');
    LabeledEdit1.Enabled:=True;
  end;
end; 
...gefällt mir trotzdem irgendwie nicht.
Danke, alles verstanden!

Antworten