Delphi - 何时调用DragAcceptFiles

ros*_*mcm 5 forms delphi drag-and-drop oncreate

我有

procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles (Handle, True ) ; 
end ;
Run Code Online (Sandbox Code Playgroud)

但表单不接受拖动文件 - 没有删除游标,没有触发WM_DROPFILES消息.

我在FormShow事件中有以下构造(出于不同的原因 - 在创建表单后,我只想执行一次代码,并且FormShow在初始化期间多次触发):

procedure TMainForm.FormShow(Sender: TObject);

begin
if (not FRunOnce) then  // as FormShow can be called twice - if Form.Position assigned to
    begin
    DragAcceptFiles (Handle, True ) ; 
    FRunOnce := True ;
    end ;
end ;
Run Code Online (Sandbox Code Playgroud)

在显示的位置DragAcceptFiles(Handle,True)仍然不起作用.如果我将它移动到例程的顶部(因此它执行两次),它确实有效:

procedure TMainForm.FormShow(Sender: TObject);

begin
DragAcceptFiles (Handle, True ) ; 
if (not FRunOnce) then  // as FormShow can be called twice - if Form.Position assigned to
    begin
    FRunOnce := True ;
    end ;
end ;
Run Code Online (Sandbox Code Playgroud)

我发现的所有示例代码似乎都在OnCreate期间调用DragAccept.我的实验表明这太早了,OnShow的第一次火灾也是如此.我确定我的代码在其他地方有问题,但是可能导致这种情况的原因是什么?

Rem*_*eau 8

任何TWinControl的HWND都可以在其生命周期内多次创建和重新创建.调用DragAcceptFiles()的最佳位置是覆盖CreateWnd()和DestroyWnd()方法,以便您可以在所有(重新)创建期间(重新)注册并在所有析构期间取消注册,例如:

procedure TMainForm.CreateWnd;
begin 
  inherited;
  DragAcceptFiles(Handle, True);  
end;

procedure TMainForm.DestroyWnd;
begin 
  DragAcceptFiles(Handle, False);
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)