Об ошибке
Это сообщение об ошибке выдается из блока Controls.pas из метода TWinControl.CreateWnd
. По сути, этот код используется для создания дескриптора Window для вашего потомка TWinControl (TFrame, TButton, TEdit ... если он может иметь фокус клавиатуры, то это потомок TWinControl), и на самом деле это очень разумное сообщение об ошибке: вы не можете иметь Window без WindowParent, и так как мы говорим о VCL здесь, имеет смысл попытаться получить дескриптор родительского окна из TWinControl.Parent; И это не назначено.
Это НЕ ПОЧЕМУ появляется сообщение об ошибке. Вы видите это сообщение об ошибке, потому что для некоторого кода, который вы используете для настройки фрейма, для какой-либо операции требуется дескриптор Window. Это может быть что угодно, например, установка Заголовка некоторого компонента (который внутренне требует, чтобы дескриптор окна выполнял некоторые вычисления). Лично я действительно ненавижу, когда это происходит. Когда я создаю GUI из кода, я стараюсь максимально задержать назначение Parent, чтобы задержать создание окна, поэтому меня это укусило много раз.
В зависимости от использования DLL, возможное исправление
Я надену шляпу для чтения психов. Так как вам нужно вернуть FRAME из вашей DLL, и вы не можете вернуть фактический Frame, потому что это специфичный для Delphi объект, и вам не разрешено возвращать специфичные для Delphi объекты через границы DLL, я предполагаю, что вы возвращаете дескриптор окна, как и все хорошие API, использует определение функции, например:
function GiveMeTheNiceFrame:HWND;
Проблема в том, что подпрограмма требует создания фактического дескриптора окна путем вызова TWinControl.CreateWnd
, и, в свою очередь, этот вызов требует дескриптора родительского окна для установки вызова на Windows.CreateWindowEx
, и подпрограмма может не получить дескриптор родительского окна, поэтому он выдает ошибки.
Попробуйте заменить вашу функцию на что-то вроде:
function GiveMeTheNiceFrame(OwnerWindow:HWND):HWND;
begin
Result := TMyNiceFrame.CreateParanted(OwnerWindow).Handle;
end;
... т.е.: используйте конструктор CreateParented(AParentWindow:HWND)
, а не обычный Create(AOwner:TComponent)
и передайте HWND владельца в свою DLL.