Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi XE2, vcl styles recreating window handle

After applying a new style at runtime the MainForm of my application creates a new window handle – is there any way to stop this or reassign the Handle as I a getting a tonne of the following error:

'System Error. Code: 1400. Invalid window handle'

Is there any way to manipulate the process that forces the new handle to be assigned?

I solved this doing the following:

My main form created an unseen 'helper' form that is never displayed, but that does have visual components - it was throwing the handle error when it was trying to redraw these visual components, so I replaced the relevant components with objects instead (note I did not write this code originally).

like image 968
Elissa Avatar asked Apr 09 '13 06:04

Elissa


1 Answers

There is no way to avoid re-creating the window handles. Instead, override your window's CreateWnd and DestroyWnd methods so that you're notified when a window is re-created.

Also, avoid keeping persistent references to handles of windows that might get destroyed. Instead, read the Handle property each time you need it. Then you won't have to watch for notifications.

Beware of reading Handle from a different thread, though, since it may cause the window to become associated with the wrong thread. Wrap any code that needs to interact with a VCL window into a method that you call via Synchronize or Queue.

like image 111
Rob Kennedy Avatar answered Sep 22 '22 17:09

Rob Kennedy