8

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;
4

1 に答える 1

16

DragAcceptFiles(Handle, True);フォームで現在使用されているウィンドウ ハンドルを、ファイルを受け入れるものとして報告します。フォームを変更すると、ウィンドウ ハンドルが破棄されて再作成されます。スタイルの変更もその 1 つです。これが発生すると、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;
于 2013-02-27T11:00:43.857 に答える