Mega Code Archive

 
Categories / Delphi / OOP
 

Drag and Drop Thread

Title: Drag and Drop Thread Question: This demo shows how to perform a drag drop wich does not block the user interface during the copying of large files. Answer: { Drag & Drop Thread Copyright (c) 2000, 2001 by E.J.Molendijk This class is a part of: "Drag and Drop Component Suite" (http://www.melander.dk). Explained: When you create the thread, it will copy the filenames of the specified DropFileSource. These filenames will be used by thread to perform a drag&drop operation. The calling thread continues uninterupted. Usage is very simple: TDragDropThread.Create(DropFileSource1); Drag&Drop Thread info Q139408: http://support.microsoft.com/support/kb/articles/Q139/4/08.asp } unit DragDropThread; interface uses Classes, DropSource, ActiveX, Windows; type TDragDropThread = class(TThread) private { Private declarations } FFiles : String; protected procedure Execute; override; public constructor Create(DropFileSource : TDropFileSource); end; implementation { TDragDropThread } constructor TDragDropThread.Create(DropFileSource : TDropFileSource); begin // Thread will start immediately after creation inherited Create(False); // Copy filenames from supplied DropFileSource FFiles := DropFileSource.Files.Text; // This thread disappeard when it finishes FreeOnTerminate := True; end; procedure TDragDropThread.Execute; var DropFileSource : TDropFileSource; pt : TPoint; hwndAttach : HWND; dwAttachThreadID, dwCurrentThreadID : DWORD; begin // Get handle of window under mouse-cursor GetCursorPos(pt); hwndAttach := WindowFromPoint(pt); Assert(hwndAttach 0, 'Unable to find window with drag-object'); // Get thread ID's dwAttachThreadID := GetWindowThreadProcessId(hwndAttach, nil); dwCurrentThreadID := GetCurrentThreadId(); // Attach input queues if necessary if (dwAttachThreadID dwCurrentThreadID) then AttachThreadInput(dwAttachThreadID, dwCurrentThreadID, True); // Initialize Ole for this thread OleInitialize(nil); try // create dropsource DropFileSource := TDropFileSource.Create(nil); try DropFileSource.Files.Text := FFiles; // start drag&drop DropFileSource.Execute; finally // cleanup dropsource DropFilesource.Free; end; finally // cleanup Ole OleUninitialize; end; // Restore input queues settings if (dwAttachThreadID dwCurrentThreadID) then AttachThreadInput(dwAttachThreadID, dwCurrentThreadID, False); end; end.