Текущий архив: 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