Question

I have the following procedure that allows droping files from windows, the dropping works just fine but when I change the style at runtime using (TStyleManager.TrySetStyle(styleName)), the form accept no more dropping! what is wrong here exactly?

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;
Was it helpful?

Solution

DragAcceptFiles(Handle, True); reports the currently used window handle for the form as accepting files. Some changes to the form cause the window handle to be destroyed and recreated, and changing the style is one of them. When this happens, FormCreate is not called again. When the window handle gets recreated, you need to also report the new handle as accepting files. You can simply move the code in your FormCreate to CreateWnd for that:

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;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top