![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DragAcceptFiles
sia © (2007-02-21 18:23:00)Просветите, пожалуйста по функции.
Для того, что бы система позволила мне, к примеру, из проводника перетащить файл на мою форму, я у себя пишу DragAcceptFiles(Handle, True); , где Handle - это мое окно. При этом и курсор при перетаскивании рисуется как crDrag.
Можно ли воспользоваться этой функцией для отображения курсора как crDrag при перетаскивании обратно - из моего окна на чужое, например проводник? И как это сделать? Что передавать Handle?
DVM (2007-02-22 17:39:00) [1]там только вместо ParamStr(1) свои файлы.
DVM (2007-02-22 17:38:00) [2]
function MakeDrop(const FileNames: array of string): THandle;
// Creates a hDrop Object
// erzeugt ein hDrop Object
var
I, Size: Integer;
Data: PDragInfoA;
P: PChar;
begin
// Calculate memory size needed
// berechne notwendig Speichergro?e
Size := SizeOf(TDragInfoA) + 1;
for I := 0 to High(FileNames) do
Inc(Size, Length(FileNames[I]) + 1);
// allocate the memory
// alloziere den speicher
Result := GlobalAlloc(GHND or GMEM_SHARE, Size);
if Result <> 0 then
begin
Data := GlobalLock(Result);
if Data <> nil then
try
// fill up with data
// fulle daten
Data.uSize := SizeOf(TDragInfoA);
P := PChar(@Data.grfKeyState) + 4;
Data.lpFileList := P;
// filenames at the at of the header (separated with #0)
// am ende des headers nun die filenamen getrennt mit #0
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;
.....
Drop: hDrop;
....
Drop := MakeDrop([ParamStr(1)]);
if Drop <> 0 then PostMessage(hMainWin, wm_DropFiles, Drop, 0);
GlobalFree(Drop);
sia (2007-02-22 17:28:00) [3]
> DVM ©
как?
DVM (2007-02-22 15:57:00) [4]
> меня интересует обратное - из моей проги в проводник.
Можно послать WM_DROPFILES чужой программе.
MBo (2007-02-22 13:49:00) [5]>меня интересует обратное - из моей проги в проводник.
уже подсказали:
TRUNK © (22.02.07 10:22) [1]
sia (2007-02-22 13:48:00) [6]
> SlymRO
это все прекрасно работает для drag drop из проводника в свою программу.
меня интересует обратное - из моей проги в проводник.
SlymRO (2007-02-22 12:43:00) [7]Так кошернее:
begin
hDrop:=Message.WParam;
c:=DragQueryFile(hDrop,LongWord(-1),PChar(nil),0);
for i:=0 to c-1 do
begin
SetLength(s,DragQueryFile(hDrop,i,PChar(nil),0));
DragQueryFile(hDrop,i,PChar(s),Length(s));
Memo1.Lines.Add(s);
end;
DragFinish(hDrop);
end;
SlymRO (2007-02-22 12:39:00) [8]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, ShellApi, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure WMDROPFILES(var Message: TMessage); message WM_DROPFILES;
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMDROPFILES(var Message: TMessage);
var
hDrop:THandle;
i,c:LongWord;
s:string;
begin
hDrop:=Message.WParam;
c:=DragQueryFile(hDrop,LongWord(-1),PChar(nil),0);
for i:=0 to c-1 do
begin
SetLength(s,MAX_PATH);
SetLength(s,DragQueryFile(hDrop,i,PChar(s),MAX_PATH));
Memo1.Lines.Add(s);
end;
DragFinish(hDrop);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle,true);
end;
end.
TRUNK (2007-02-22 10:22:00) [9]
> Можно ли воспользоваться этой функцией для отображения курсора
> как crDrag при перетаскивании обратно
Нет. Смотри в сторону интерфейса IDropSource.