2010-07-13 22 views
1

Dans Codegear C++ Builder, j'essaie d'étendre la classe TMemo VCL pour exécuter certaines fonctionnalités au cours de l'événement OnKeyDown. J'ai mis en place le contrôle et je suis capable de l'ajouter aux formulaires et ainsi de suite. Le problème est que je suis incapable de capturer l'événement OnKeyDown (ou tout autre événement, d'ailleurs).Gestionnaire d'événements de remplacement dans C++ Builder

Voici ma classe:

class PACKAGE TREMemoFind : public TMemo 
{ 
private: 
    TFindDialog *FindDialog; 

protected: 
    void __fastcall MemoKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); 

public: 
    __fastcall TREMemoFind(TComponent* Owner); 

__published: 
}; 


__fastcall TREMemoFind::TREMemoFind(TComponent* Owner) : TMemo(Owner) 
{ 
    ScrollBars = ssVertical; 
    OnKeyDown = MemoKeyDown; 
} 

void __fastcall TREMemoFind::MemoKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) 
{ 
    ShowMessage("It worked!"); 
} 

Donc, je suppose que ma question est: comment puis-je configurer les classes que je Dérive des classes VCL pour exécuter des fonctions personnalisées lorsqu'un certain événement se déclenche?

+0

Nevermind. Apparemment, je faisais la bonne chose. Codegear n'incorporait pas mes mises à jour dans mon contrôle de test, malgré des recompilations répétées. Quoi qu'il en soit, cela fonctionne maintenant. Quelle est l'étape appropriée à prendre sur ce post? Devrais-je voter pour la suppression? –

Répondre

1

Ce n'est pas une bonne idée qu'un composant affecte un gestionnaire à son propre événement. Cela empêche le code externe d'utiliser ce même événement, ou pire d'écraser votre affectation avec votre propre afin que votre code personnalisé ne fonctionne plus. Au lieu de cela, ce que vous devez faire remplace la méthode virtuelle KeyDown(), c'est-à-dire:

class PACKAGE TREMemoFind : public TMemo 
{ 
protected: 
    virtual void __fastcall KeyDown(WORD &Key, TShiftState Shift); 

public: 
    __fastcall TREMemoFind(TComponent* Owner); 
}; 


__fastcall TREMemoFind::TREMemoFind(TComponent* Owner) : TMemo(Owner) 
{ 
    ScrollBars = ssVertical; 
} 

void __fastcall TREMemoFind::KeyDown(WORD &Key, TShiftState Shift) 
{ 
    ShowMessage("It worked!"); 
    TMemo::KeyDown(Key, Shift); // fire public OnKeyDown event 
} 
+0

Merci pour l'info! Je devais vraiment mettre plus de réflexion dans mon design. Je vais faire ces changements. –