sull'errore
Questo messaggio di errore viene generato dall'unità Controls.pas, dal metodo TWinControl.CreateWnd
. Essenzialmente quel codice è usato per creare l'handle di Window per il tuo discendente TWinControl (TFrame, TButton, TEdit ... se può avere il focus della tastiera è un discendente TWinControl), ed è in realtà un messaggio di errore molto sensato: non puoi avere un Finestra senza un WindowParent, e visto che stiamo parlando della VCL qui, ha molto senso cercare di ottenere l'handle della finestra genitore da TWinControl.Parent; E questo non è assegnato.
Questo non è PERCHÉ il messaggio di errore sta spuntando. Puoi vedere quel messaggio di errore perché parte del codice che stai usando per configurare il frame richiede un handle di Window per alcune operazioni. Potrebbe essere qualsiasi cosa, come impostare la didascalia di alcuni componenti (che internamente richiede un handle di finestra per alcuni calcoli). Personalmente lo odio davvero quando ciò accade.Quando creo le GUI dal codice, cerco di ritardare il più possibile l'assegnazione di Parent, nel tentativo di ritardare la creazione della finestra, così sono stato morso da molte altre volte.
specifico per l'utilizzo DLL, possibile correzione
ho intenzione di mettere il mio cappello psico lettore di mente su. Dal momento che è necessario restituire un FRAME dalla DLL e non è possibile restituire il Frame effettivo perché si tratta di un oggetto specifico di Delphi e non è possibile restituire oggetti specifici di Delphi oltre i limiti della DLL, la mia ipotesi è che si sta tornando una maniglia della finestra, così come tutte la bella API, utilizzando una definizione di funzione come questa:
function GiveMeTheNiceFrame:HWND;
il guaio è, che di routine richiede la creazione di l'handle di finestra reale, da una chiamata a TWinControl.CreateWnd
, e, a sua volta, che la chiamata richiede un handle della finestra genitore per impostare la chiamata a Windows.CreateWindowEx
e la routine non può ottenere un handle della finestra genitore, quindi si verifica un errore.
provare a sostituire la vostra funzione con qualcosa allong le linee di:
function GiveMeTheNiceFrame(OwnerWindow:HWND):HWND;
begin
Result := TMyNiceFrame.CreateParanted(OwnerWindow).Handle;
end;
... cioè: utilizzare il CreateParented(AParentWindow:HWND)
costruttore, non il solito Create(AOwner:TComponent)
e superare un HWND proprietario alla DLL.
Perché si utilizzano DLL e non pacchetti? Le DLL sono un incubo per avere ragione. –