エラーについて
TWinControl.CreateWnd
このエラーメッセージは、Controls.pasユニットのメソッドから発生します。基本的に、そのコードはTWinControlの子孫(TFrame、TButton、TEdit ...キーボードフォーカスが可能な場合はTWinControlの子孫)のウィンドウハンドルを作成するために使用され、実際には非常に賢明なエラーメッセージです。 WindowParentのないウィンドウ。ここではVCLについて説明しているので、TWinControl.Parentから親ウィンドウハンドルを取得することは非常に理にかなっています。そして、それは割り当てられていません。
エラーメッセージが表示されるのはそのためではありません。フレームの設定に使用しているコードの一部は、操作のためにウィンドウハンドルを必要とするため、このエラーメッセージが表示されます。これは、コンポーネントのキャプションを設定するなど、何でもかまいません(内部的には、ウィンドウハンドルで計算を行う必要があります)。それが起こったとき、私は個人的にそれを本当に嫌います。コードからGUIを作成するときは、ウィンドウの作成を遅らせるために、親の割り当てをできるだけ遅らせようとしているので、これに何度も噛まれました。
DLLの使用法に固有、可能な修正
サイコマインドリーダーの帽子をかぶるつもりです。DLLからFRAMEを返す必要があり、実際のフレームを返すことはできません。これはDelphi固有のオブジェクトであり、DLLの境界を越えてDelphi固有のオブジェクトを返すことは許可されていないためです。すべての優れた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に渡します。