Delphi: Proper time to subclass, and restore, a control

delphisubclasssubclassingthemes

What is the correct place/time to start subclassing a control?

What is the proper time to restore the original window proc?

Right now i subclass during form creation:

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

and i restore the subclassing during form destruction:

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

This works fine, as long as i don't use ThemeManager, which subclasses controls itself. As soon as a try to subclass a control that ThemeManager also sub-classes, i get very nasty errors.

i assume it's becuase i should not start the subclass during Create and restore it during Destroy. So what is the properly documented time to subclass and unsubclass a control in Delphi?

Best Answer

It's not clear from your question but I assume you get the errors when you're trying to restore the old window procedure in the form's OnDestroy event handler.

ThemeManager reverts its subclassing when processing WM_DESTROY for a control. Therefore you probably have to do the same: watch for WM_DESTROY in your new window procedure and revert your subclassing first, then call the old window procedure (and let ThemeManager do the same thing).

I haven't tested this but I think it should work.

Related Topic