2009-07-10 6 views
4

J'ai un TForm (TVehicleEditForm) avec 3 identiques TFrames (TVehicleUnitFrame) à l'intérieur.EventHandler dans un TFrame?

L'idée était que chaque instance de la trame gère les événements eventhandler dans le cadre. Le problème est que le eventhandler n'est pas appelé.

J'ai essayé d'affecter le eventhandler par code à l'intérieur du cadre en remplaçant la méthode Create mais le gestionnaire n'est pas appelé dans ce cas non plus.

Mais si j'attribue le eventhandler en dehors du cadre de la forme cela fonctionne très bien. Comme ceci:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick; 
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick; 
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick; 

Et ceci est seulement pour un seul bouton! Comme j'ai beaucoup de composants à l'intérieur du cadre, cela se traduirait par de nombreuses affectations ... Code assez moche quand cela devrait être fait directement dans l'inspecteur d'objets.

J'utilise D2007. Une idée de la cause?

Cordialement Roland

Répondre

11

La raison pour laquelle cela fonctionne quand vous le faites à partir du code, est que vous remplacez le pointeur vers le gestionnaire d'événements, peu importe ce qui était là avant.

Au moment de la conception, j'ai deux endroits possibles pour définir le gestionnaire. Supposons que j'ai Frame1 dans Unit1 et que je le place sur MyForm dans MyUnit, j'aurai la possibilité de définir le gestionnaire d'événements aux deux endroits.

Dans votre cas, vous souhaitez définir le gestionnaire d'événements dans le cadre lui-même (Unit1 dans mon exemple), car le code auquel il fait référence est sur le cadre lui-même. Si vous faites cela, cela devrait fonctionner. Si vous définissez le gestionnaire d'événements sur l'emplacement où il est utilisé (MyUnit), le gestionnaire d'événements y sera affecté. Delphi est assez intelligent pour appeler encore le gestionnaire d'événements de votre cadre tant que ce gestionnaire d'événements a été affecté avant vous avez ajouté celui dans le formulaire. Si vous l'avez d'abord ajouté sur le formulaire, puis ajouté le gestionnaire sur le cadre, celui sur le cadre est pas appelé. Pour aggraver les choses, si vous supprimez le gestionnaire dans le formulaire, il n'appellera toujours pas celui sur le formulaire.

Ce que vous devez faire est la suivante:

votre formulaire avec le bouton droit et sélectionnez Afficher Clcik sous forme de texte. Faites défiler jusqu'au cadre. Il devrait être quelque chose comme:

inline FrameX: fraVehicleUnitFrame1 

en dessous, chercher

inherited cmdNewOwner: TButton 

Il vous devriez voir quelque chose comme:

OnClick = FormOldClickHandler 

ou peut-être

OnClick = nil 

Supprimer ce Affectation OnClick, voir sous former à nouveau et enregistrer. Tout devrait bien se passer.Si vous sélectionnez maintenant le bouton (ou tout ce que cmdNewOwner est) sur le formulaire, l'inspecteur d'objets ne doit rien afficher à côté de cet événement.

+0

Merci pour le conseil !!! Je l'ai fait fonctionner à nouveau :) Un grand merci –

+0

Content de pouvoir aider! –

+0

Je résous ce problème en supprimant l'instance de frame du formulaire et en le rajoutant à nouveau, mais votre solution est la meilleure solution, surtout si des modifications ont été apportées à l'instance de frame. –

Questions connexes