在我繼承並正在遷移到XE5的一些傳統D7代碼中,我找到了下面的代碼。用CreateParam的Params.WndParent強制子窗體?
該評論指出它欺騙Windows認爲它是一個子窗體,如果它是從非WinControl創建的。代碼庫中有一處將AOwner作爲nil調用Create。 (表格是在那次通話時可用,所以不知道他們爲什麼這麼做......)
對程序員的目標是什麼有什麼建議?
private
FParentWinControl: TWinControl; {Don't mess with! Used in CreateParams}
procedure TFormX.CreateParams(var params: TCreateParams); override;
public
constructor TFormX.Create(AOwner: TComponent); reintroduce;
end;
constructor TFormX.Create(AOwner: TComponent);
begin
if AOwner IS TWinControl then
FParentWinControl := TWinControl(AOwner)
else
FParentWinControl := NIL;
inherited Create(AOwner);
end; { Create }
procedure TFormX.CreateParams(var params: TCreateParams);
begin
inherited CreateParams(params);
if (NOT fCreateParamsHasBeenRun) then
begin
fCreateParamsHasBeenRun := TRUE;
if Assigned(FParentWinControl) then
Params.WndParent := FParentWinControl.Handle; {tricks windows into thinking it's a child form}
end;
end;
'Params.WndParent'是'hWndParent'到'CreateWindowEx',請參閱MSDN文檔以獲取完整說明。除非'TFormX'在樣式中指定了'WS_CHILD'(這似乎不是這種情況),窗口被創建爲擁有者(AOwner)所擁有,它不是孩子。我不知道程序員的想法。雖然他很可能不完全知道他在做什麼。 –