Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Drag n Drop   Найти похожие ветки 

 
_aLF ©   (2004-09-09 13:16) [0]

Вопрос горит! Как заставить прилагу кидать файлы в другие проложения? То бишь, выбираю из списка, потом тащю, в фотошоп, например, а тот, че хошь, с ним, то и делает...


 
DVM ©   (2004-09-09 13:19) [1]

Есть два пути:
Первый трудный - через OLE - реализовать интерфейсы IDataObject, IDataSource и иже с ними.
Второй попроще - послать самому WM_DROPFILES со списком файлов.


 
_aLF ©   (2004-09-09 13:31) [2]

Ага, а как это на практике реализовать, ен подскажешь (второй вариант). Принимать - то как я понял, а вот посылать...


 
_aLF ©   (2004-09-09 13:33) [3]

У TMessage куча параметров, и что из них - что, быстро не сообразишь.


 
DVM ©   (2004-09-09 13:37) [4]


> У TMessage куча параметров, и что из них - что, быстро не
> сообразишь.

я думаю рановато это тебе пока, но да ладно вот пример:

uses
 ShellAPI;

function MakeDrop(const FileNames: array of string): THandle;
var
 I, Size: Integer;
 Data: PDragInfoA;
 P: PChar;
begin
 Size := SizeOf(TDragInfoA) + 1;
 for I := 0 to High(FileNames) do
   Inc(Size, Length(FileNames[I]) + 1);
 Result := GlobalAlloc(GHND or GMEM_SHARE, Size);
 if Result <> 0 then
 begin
   Data := GlobalLock(Result);
   if Data <> nil then
     try
       Data.uSize := SizeOf(TDragInfoA);
       P  := PChar(@Data.grfKeyState) + 4;
       Data.lpFileList := P;
       for I := 0 to High(FileNames) do
       begin
         Size := Length(FileNames[I]);
         Move(Pointer(FileNames[I])^, P^, Size);
         Inc(P, Size + 1);
       end;
     finally
       GlobalUnlock(Result);
     end
   else
   begin
     GlobalFree(Result);
     Result := 0;
   end;
 end;
end;

function MyEnum(Wnd: hWnd; Res: PInteger): Bool; stdcall;
var
 N: string;
begin
 SetLength(N, MAX_PATH);
 SetLength(N, GetClassName(Wnd, Pointer(N), Length(N)));
 Result := AnsiCompareText("TEditControl", N) <> 0;
 if not Result then Res^ := Wnd;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Wnd: HWnd;
 Drop: hDrop;
begin
 EnumChildWindows(FindWindow("TEditWindow", nil), @MyEnum, Integer(@Wnd));
 if IsWindow(Wnd) then
 begin
   Drop := MakeDrop(["c:\msdos.sys"]);
   if Drop <> 0 then PostMessage(Wnd, wm_DropFiles, Drop, 0);
   GlobalFree(Drop);
 end;
end;


 
_aLF ©   (2004-09-09 13:43) [5]

DVM, Оперативность - на высшем уровне! Спасибо!


 
_aLF ©   (2004-09-09 14:12) [6]

DVM, у тебя Wnd - дескриптор некоего окна, так вот, мне нужно получить именно то окно, на какое я тащу, а не как в примере. Согласен заренее, что это просто и я туплю, но время поджимает и думать некогда. И еще - когда я тащу что - либо во внешнюю прогу, прилага говорит, что я не могу этого сделать (вид курсора). Как мне это включить? На прилагу таскается нормально, DragAcceptFiles включил.


 
DVM ©   (2004-09-09 14:19) [7]


> _aLF ©   (09.09.04 14:12) [6]

В начале перетаскивания захвати мышь (SetCapture) и отслеживай ее координаты. По координатам получаешь hWnd того окна над которым мышь (WindowFromPoint) и в момент отпускания мыши посылаешь ему это сообщение со списком файлов.

> прилага говорит, что я не могу этого сделать (вид курсора).
>

И не будет. Хотя файлы проглотит нормально. Чтобы вид курсора менялся надо OLE использовать.
На сайте Подгорецкого есть книжка по Делфи (не помню название), и там в 4-5 главах об этом подробно рассказывается "Перетаскивание как это делается в OLE".
Вот.



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
14-1095100742
Knight
2004-09-13 22:39
2004.10.10
Банк идей...


14-1095937517
Nikolay M.
2004-09-23 15:05
2004.10.10
Авторам вопросов "Что лучше делать: ролбэк или комит" посвящается


14-1095877438
_silver
2004-09-22 22:23
2004.10.10
Дальнеёшее развитие процессоров.


6-1091083739
MakNik
2004-07-29 10:48
2004.10.10
Workstation ID


14-1095437436
olookin
2004-09-17 20:10
2004.10.10
коли делать нечего...