2013-04-09 16 views
5

Dopo aver applicato un nuovo stile in fase di esecuzione, il MainForm della mia applicazione crea un nuovo handle di finestra - esiste un modo per fermarlo o riassegnare l'handle mentre ottengo una tonnellata del seguente errore :Delphi XE2, stili vcl che ricreano la maniglia della finestra

'Errore di sistema. Codice: 1400. Handle di finestra non valido '

C'è un modo per manipolare il processo che impone il nuovo handle da assegnare?

Ho risolto questo nel seguente modo:

La mia forma principale ha creato una forma invisibile 'aiutante' che non viene mai visualizzato, ma che dispone di componenti visive - si stava gettando l'errore maniglia quando stava cercando di ridisegnare questi componenti visuali, quindi ho sostituito i componenti rilevanti con gli oggetti (nota che non ho scritto questo codice in origine).

+1

Non archiviare le copie dell'impugnatura della finestra (soprattutto nei thread), vedere ["PostMessage restituisce" l'handle di finestra non valido "nella discussione"] (http://stackoverflow.com/q/3474227/576719). –

+1

Sì, ci sono modi per evitarlo. Se tu ci dicessi perché succede, potremmo aiutare. Quindi, perché hai una maniglia della finestra obsoleta? –

risposta

5

Non c'è modo di evitare di ricreare le maniglie delle finestre. Invece, scavalca i metodi e DestroyWnd della tua finestra in modo da essere avvisato quando una finestra viene ricreata.

Inoltre, evitare di mantenere riferimenti persistenti alle maniglie di finestre che potrebbero essere distrutte. Invece, leggi la proprietà Handle ogni volta che ne hai bisogno. Quindi non dovrai guardare per le notifiche.

Attenzione però a leggere Handle da un thread diverso, poiché potrebbe causare l'associazione della finestra al thread sbagliato. Avvolgi qualsiasi codice che deve interagire con una finestra VCL in un metodo che chiami tramite Synchronize o Queue.

Problemi correlati