Sobre el error
Ese mensaje de error se eleva desde la unidad Controls.pas, a partir del método TWinControl.CreateWnd
. Esencialmente, ese código se usa para crear el identificador de Ventana para su descendiente TWinControl (TFrame, TButton, TEdit ... si puede tener el foco del teclado es un descendiente de TWinControl), y en realidad es un mensaje de error muy sensible: No puede tener un Ventana sin WindowParent, y como estamos hablando del VCL aquí, tiene mucho sentido intentar obtener el manejador de la ventana principal desde TWinControl.Parent; Y eso no está asignado.
No es POR QUÉ el mensaje de error está apareciendo. Puede ver ese mensaje de error porque parte del código que está utilizando para configurar el marco requiere un control de Ventana para alguna operación. Podría ser cualquier cosa, como establecer el título de algún componente (que internamente requiere un manejador de ventana para algunos cálculos). Yo personalmente realmente odio cuando eso sucede.Cuando creo GUI desde el código trato de retrasar la asignación de Parent tanto como sea posible, en un intento de retrasar la creación de la ventana, por lo que me picaron muchas veces.
específica para su uso DLL, arreglo posible
voy a poner mi sombrero psico lector de la mente sobre. Como necesita devolver un FRAME desde su DLL, y no puede devolver el Frame porque ese es un objeto específico de Delphi y no tiene permitido devolver objetos específicos de Delph sobre los límites de DLL, supongo que está volviendo. un identificador de ventana, al igual que toda la buena de API, utilizando una definición de función como esta:
function GiveMeTheNiceFrame:HWND;
el problema es que la rutina requiere la creación del identificador de ventana real, mediante una llamada a TWinControl.CreateWnd
, ya su vez que la llamada requiere un identificador de ventana padre para configurar la llamada al Windows.CreateWindowEx
, y la rutina no puede obtener un identificador de ventana principal, por lo que se produce un error.
intente reemplazar su función con algo allong las líneas de:
function GiveMeTheNiceFrame(OwnerWindow:HWND):HWND;
begin
Result := TMyNiceFrame.CreateParanted(OwnerWindow).Handle;
end;
... es decir: utilizar el constructor CreateParented(AParentWindow:HWND)
, no es el típico Create(AOwner:TComponent)
y aprobar un HWND propietario para su DLL.
¿Por qué usa archivos DLL y no paquetes? Los archivos DLL son una pesadilla para hacer las cosas bien. –