在运行时更改Delphi样式不允许将文件拖放到表单

时间:2013-02-27 10:48:16

标签: delphi vcl-styles

我有以下允许从Windows中删除文件的过程,删除工作正常,但是当我在运行时使用(TStyleManager.TrySetStyle(styleName))更改样式时,表单不再接受删除!这到底出了什么问题?

public //public section of the form
...
procedure AcceptFiles( var msg : TMessage ); message WM_DROPFILES;

...

procedure TMainFrm.AcceptFiles(var msg: TMessage);
 var
   i,
   fCount     : integer;
   aFileName : array [0..255] of char;
begin
   // find out how many files the form is accepting
   fCount := DragQueryFile( msg.WParam, {uses ShellApi is required...}
                            $FFFFFFFF,
                            acFileName,
                            255 );

  for I := 0 to fCount - 1 do
  begin
    DragQueryFile(msg.WParam, i, aFileName, 255);
    if UpperCase(ExtractFileExt(aFileName)) = '.MSG' then //accept only .msg files
    begin
       if not itemExists(aFileName, ListBox1) then// function checks whether the file was already added to the listbox
       begin
        ListBox1.Items.Add(aFileName);

       end
    end;
  end;
  DragFinish( msg.WParam );
end;

...

procedure TMainFrm.FormCreate(Sender: TObject);
begin
  DragAcceptFiles( Handle, True ); //Main form accepts the dropped files 
end;

1 个答案:

答案 0 :(得分:16)

DragAcceptFiles(Handle, True);将表单的当前使用的窗口句柄报告为接受文件。对表单进行一些更改会导致窗口句柄被销毁并重新创建,并且更改样式就是其中之一。发生这种情况时,不会再次调用FormCreate。重新创建窗口句柄时,您还需要将新句柄报告为接受文件。您只需将FormCreate中的代码移至CreateWnd即可:

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  protected
    procedure CreateWnd; override;
  public
    { Public declarations }
  end;

implementation

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