2009-11-18 2 views
1

Quel est le bon moment pour démarrer le sous-classement d'un contrôle?Delphi: temps approprié pour sous-classer, et restaurer, un contrôle?

Quel est le bon moment pour restaurer le processus de fenêtre d'origine?

En ce moment, je sous-classe pendant la forme création:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FOldPanel1WindowProc := Panel1.WindowProc; 
    Panel1.WindowProc := Panel1WindowProc; 
end; 

et je ramènerai le sous-classement lors de la destruction sous forme :

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    Panel1.WindowProc := FOldPanel1WindowProc; 
end; 

Cela fonctionne bien, aussi longtemps que je ne suis pas utilisez ThemeManager, qui sous-classe les contrôles lui-même. Dès que vous essayez de sous-classer un contrôle que ThemeManager sous-classe également, je reçois des erreurs très méchant.

je suppose qu'il est dommage parce que je ne devrais pas commencer à la sous-classe pendant Créer et restaurer pendant Destroy. Alors, quel est le temps correctement documenté pour sous-classer et annuler la sous-classe d'un contrôle dans Delphi?

+0

Essayez de rechercher dans la source vers ThemeManager pour voir quand il effectue le sous-classement. –

+0

Chose est qu'il met des formes sur une liste de retard, parce que le handle de fenêtre sous-jacent n'est pas créé pendant la construction de l'objet (comme avec les contrôles .NET qui enveloppent les contrôles Win32) –

+0

pourriez-vous pirater dans la même liste de retard? –

Répondre

3

La question n'est pas claire, mais je suppose que vous obtenez les erreurs lorsque vous essayez de restaurer l'ancienne procédure de fenêtre dans le gestionnaire d'événement OnDestroy du formulaire. La classe

ThemeManager rétablit sa sous-classe lors du traitement WM_DESTROY pour un contrôle. Par conséquent vous devez probablement faire la même chose: observez WM_DESTROY dans votre nouvelle procédure de fenêtre et retournez d'abord votre sous-classe, puis appelez l'ancienne procédure de fenêtre (et laissez ThemeManager faire la même chose).

Je n'ai pas testé cela mais je pense que cela devrait fonctionner.

+0

Vous avez raison. Plus d'enquête montre que c'est * un problème de commande. Ordre des événements maintenant: 1. FormCreate (ma sous-classe) 2. Sous-classe ThemeManager 3. FormDestroy (mon unsubclass) 4. ThemeManager unsubclass. Depuis ma sous-classe arrive avant que ThemeManager je doive se désintéresser après; ou j'ai besoin de faire la sous-classe ThemeManager avant mon FormCreate. –

+0

Votre solution a fonctionné. Avoir la sous-classe gérer le WM_DESTROY et restaurer la sous-classe d'origine à ce moment corrige une erreur. J'ai également trouvé des méthodes non documentées dans le TThemeManager (RegisterListener, UnregisterListener), qui vous donnent fondamentalement un hook WindowProc - tout comme une sous-classe. Marqué comme réponse. –

Questions connexes