Article

From:
To:
All
Subject:
How to programmiclly drag and drop a file onto a window? [Edit]
Newsgroup:
embarcadero.public.delphi.nativeapi

How to programmiclly drag and drop a file onto a window? [Edit]

The following link and other code are as close as I could find however neither work.
I am only dragging 1 file if that will simplify any.
Errors?  
Improvements?
<EDIT: I am dragging to another application, not receiving a dragged file.

<http://groups.google.com/group/borland.public.delphi.nativeapi/browse_thread/thread/3807c98996c6dc4a/906ac37701139ab8?q=How+to+automatically+drag+and+drops+a+file+onto+any+window>
or
procedure DoDropFiles(Wnd: HWND; Files: TStringList);
var   Size: Cardinal;   DropFiles: PDropFiles;   Run: PChar;   MemHandle: THandle;   I: Integer;
begin   // first determine size of string buffer we have to allocate   Size := 0;   for I := 0 to Files.Count - 1 do   begin     // number of characters per string (as ANSI) plus one #0 terminator     Inc(Size, Length(Files[I]) + 1);   end;   if Size > 0 then   begin
// entire string list is terminated by another #0, add drop files structure size too
    Inc(Size, 1 + SizeOf(TDropFiles));
    // allocate globally accessible memory
    MemHandle := GlobalAlloc(GHND or GMEM_SHARE, Size);
    DropFiles := GlobalLock(MemHandle);
    // fill the header
    with DropFiles^ do
    begin
pFiles := SizeOf(TDropFiles); // offset of file list, it follows immediately the structure pt := Point(0, 0); // drop point (client coords), not important here fNC := False; // is it on NonClient area }, not important here fWide := False; // WIDE character switch, we pass ANSI string in this routine
    end;
    // and finally the file names
    Run := Pointer(DropFiles);
    Inc(Run, SizeOf(TDropFiles));
    for I := 0 to Files.Count - 1 do
    begin
      StrPCopy(Run, Files[I]);
//      Inc(Run, Length(Files[I]));
      Inc(Run, Length(Files[I])+1)
    end;
    // put a final #0 character at the end
    Run^ := #0;
    // release the lock we have to the memory,...
    GlobalUnlock(MemHandle);
    // ...do the message...
//    SendMessage(Wnd, WM_DROPFILES, MemHandle, 0);
    PostMessage(Wnd, WM_DROPFILES, MemHandle, 0);
 
    // ... and finally release the memory
    GlobalFree(MemHandle);
  end;
end;

procedure TMainForm.Button1Click(Sender: TObject); var   List: TStringList; begin   List := TStringList.Create;   try     List.Add('C:\Data\Test.txt');     DoDropFiles(Handle, List);   finally     List.Free;   end; end;


Norm
Edited by: Norm Carlberg on Sep 25, 2010 6:40 AM
FYI: Phrase searches are enclosed in either single or double quotes
 
 
Originally created by
Tamarack Associates
Tue, 19 Nov 2024 13:25:34 UTC
Copyright © 2009-2024
HREF Tools Corp.