Delphi-PRAXiS

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/)
-   -   Delphi dbNavigator Aktion abbrechen (https://www.delphipraxis.net/182476-dbnavigator-aktion-abbrechen.html)

Sidi61 27. Okt 2014 23:34

dbNavigator Aktion abbrechen
 
Hallo zusammen,

kann mir jemand helfen folgendes Problem zu lösen:

Vorgehensweise

Eingabe in beliebiges Eingabefeld
während das Eingabefeld noch den Focus besitzt klickt der Anwender auf Post im dbNavigator
im onExit Ereignis des Eingabefeldes wird festgestellt dass der Eintrag nicht zulässig ist

jetzt das Problem

wie kann ich die eingeleitete Aktion des dbNavigators abbrechen und dem Eingabefeld den Focus zurück geben??

Gruß Sidi61

Uwe Raabe 27. Okt 2014 23:40

AW: dbNavigator Aktion abbrechen
 
Abort

Sidi61 28. Okt 2014 20:56

AW: dbNavigator Aktion abbrechen
 
Hallo - ja, Abort ist mir bekannt, müsste dann aber die Gültigkeit in der onclick Methode des dbNavigator prüfen bzw. dort alle Felder die geprüft werden müssen prüfen - wollte es aber in der onexit des Eingabefeldes machen. Wenn das geht - wie wäre es mit einem kleinen Beispiel:?:
Gruß Sidi61

Uwe Raabe 28. Okt 2014 21:28

AW: dbNavigator Aktion abbrechen
 
Das Edit soll doch den Fokus behalten, oder? Dann sollte das TabStop beim Navigator auf false stehen und die Überprüfung und gegebenenfalls das Abort im BeforeAction-Event des Navigators erfolgen. Der Navigator-OnClick-Event wird erst nach der Ausführung der Operation aufgerufen, aber dann ist es schon zu spät.

Der Focus-Wechsel und damit das OnExit-Event des Edit kommt nur, wenn beim Navigator TabStop auf true steht (zumindest ist das bei XE7 so).

Sidi61 28. Okt 2014 22:01

AW: dbNavigator Aktion abbrechen
 
Da die Prüfung in einem dbNavigator Ereignis erfolgen muss um Abort ausführen zu können, habe ich eine function zur Prüfung erstellt und diese im dbNavigatorClick Ereignis aufgerufen und ensprechend dem Ergebnis Abort ausgeführt. Dies hatte den unschönen Effekt dass sich die Farbe des Post-Buttons veränderte. Das ganze in die dbNavigatorBeforeAction verlegt sieht besser aus.

Code:

function TForm_Schleifbrand.Eingabe_ok : boolean;
var eintrag : string;
    ok : boolean;
begin
  ok := true;
  //Feldeingabe erstpruefung prüfen
  if OK then
  begin
    eintrag := dbCombobox_erstpruefung.Text;
    if dbCombobox_erstpruefung.Items.IndexOf(eintrag) < 0 then
    begin
      ok := false;
      showmessage('Eintrag '+''''+eintrag+''''+' ist nicht in Auswahl für Erstprüfung enthalten!');
      dbCombobox_erstpruefung.SetFocus;
    end;
  end;
  result := ok;
end;

procedure TForm_Schleifbrand.DBNavigator1BeforeAction(Sender: TObject;
  Button: TNavigateBtn);
begin
  case Button of
    nbPost : if (Editmode = true) and (Eingabe_ok = false) then abort;
  end;
end;

Jetzt kommt sicher der Einwand dass dbCombobox mit Einstellung CsDropDownList eine Eingabe außerhalb der Listeneinträge nicht zulassen würde und somit eine Prüfung nicht notwendig wäre ;-) Die zur Auswahl stehenden Einträge stammen aus einer separaten Datei und können sich im Laufe der Zeit ändern, die dbCombobox hat jedoch bei Einstellung CsDropDownList die unschöne Eigenschaft nur Einträge anzuzeigen, die auch in der Liste sind d.h. ändert sich die Liste dann werden bei Datensätzen die vorher angelegt wurden und nun Einträge haben die nicht in der Liste sind, diese Einträge nicht angezeigt d.h. das Textfeld von dbCombobox bleibt leer obwohl das Feld einen Eintrag hat.

Also dann besten Dank für die Unterstützung
Gruß Sidi61

baumina 29. Okt 2014 06:02

AW: dbNavigator Aktion abbrechen
 
Eine Überprüfung aller DB-Feld-Inhalte auf Gültigkeit würde ich im BeforePost des DataSets machen.


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