FormKeyDown() wird bei Escape-Druck 2x ausgefuehrt
-
Einen schoenen Nachmittag wuensche ich allen,
vorweg ein paar Informationen, die evtl. wichtig sein koennten:
Klassenhierarchie:
class BaseWindow : public TForm { //jede menge member }; class EditWindow : public BaseWindow { //jede menge member }; class MultiPageEditWindow : public EditWindow { //jede menge member }; class DBWindow : public MultiPageEditWindow { //jede menge member }; class KundeWindow : public DBWindow { //jede menge member };
Nun ist es so, dass KundeWindow->FormKeyDown() prueft, ob bestimmte
Tasten zulaessig sind, und dann eine Unterroutine aufruft, der
ActiveControl, Key und Shift-Status uebergeben werden und in dieser
Unterroutine werden, falls eine Taste gueltig ist, entsprechende
Aufgaben erledigt und dann mit return; rausgesprungen.Sollte eine Taste in KundeWindow als nicht gueltig erkannt werden,
wird DBWindow->FormKeyDown() mit den entsprechenden Parametern
aufgerufen, wo wiederrum gebrueft wird, ob eine Taste fuer dieses
Window gueltig ist und entsprechend eine Unterroutine aufgerufen
wird usw. usw. bis das ganze bis EditWindow->FormKeyDown() durch-
geschleift worden ist.Damit ich auch alle Tasten mitbekomme und nicht von jedem Control
die FormKeyDown()-Memberfunktion durchschleifen muss, habe ich
im BaseWindow bereits KeyPreview auf 'true' gesetzt.Wenn im eine Instanz vom Typ KundeWindow erstellt wird, dann werden
aus einer Datenbank ein paar Kundendaten ausgelesen und dargestellt
und der User befindet sich ersteinmal in einem 'Suchmodus'. Drueckt
der User dann die 'Enter'-Taste, geht er vom Suchmodus in den
Editiermodus.Und nun zu meinem Problem:
Wenn sich der User im Suchmodus befindet und drueckt die Escape
Taste, wird das KundeWindow geschlossen.Befindet sich der User aber im Editiermodus und drueckt die Escape
Taste, so geht er zurueck in den Suchmodus.Das Problem ist aber, dass beim druecken der Escape-Taste, die
FormKeyDown()-Routine von KundeWindow 2x hintereinander aufgerufen
wird, ohne das ich das will.Ich habe nirgends in den Unterfunktionen einen weiteren Aufruf von
KundeWindow->FormKeyDown(). Ich bin schon im Debugger im Einzelschritt
durch die Tastaturbehandlungsroutinen gegangen und nachdem er
durch alle Routinen durch, das Ende der KundeWindow->FormKeyDown()-
Routine erreicht ist und ich F9 druecke, damit das Programm weitermacht,
kommt er sofort wieder in die KundeWindow->FormKeyDown()-Routine rein,
mit Key == VK_ESCAPE.Ich habe nur keine Ahnung, warum das passiert. Bei allen anderen von
mir getesteten Tasten (z. B. Enter-Taste, F7-, F8-Taste) passiert das
nicht.Any Ideas woran das liegen kann?
Bevor ich es vergesse, die Bahandlung der Escape-Taste geschiet in der
DBWindow-Klasse.Hoffe ich hab genug Informationen geben koennen. Ansonsten einfach
Fragen. Als Anhang noch kurzes Beispiel, wie die FormKeyDown()-Implementationen
aussehen.-----------------------------------------------------------------------
//so z. B. sieht die KundeWindow->FormKeyDown()-Routine aus (gekuerzt) void KundeWindow::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { /* es werden bestimmte bedingungen ueberprueft und sollten diese gegeben sein, wird eine unterroutine aufgerufen, die entsprechende verarbeitungen aufgrund eines tastendrucks ausfuehrt */ switch(Key) { case VK_F4 : if(ActiveControl == txtLand) //bedingung gekuerzt zur //uebersicht unterroutine(ActiveControl,Key,Shift); } /* hier muss ActiveControl uebergeben werden, da ich KeyPreview auf true gesetzt habe und somit als Sender immer die Windowinstanz gegeben ist */ DBWindow::FormKeyDown(ActiveControl, Key, Shift); }
So aehnlich sieht dann auch DBWindow::FormKeyDown() aus, welches
erst anhand von Bedingungen prueft, ob es den Key behandelt oder
diesen nach EditMultiPageWindow::FormKeyDown() durchschleift.mfg
v RPS: Sry fuer langen Post!