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 R

    PS: Sry fuer langen Post!


Anmelden zum Antworten