Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизКак использовать Drag&Drop для разных объектов? Найти похожие ветки
← →
Destroyer © (2005-05-29 18:58) [0]На форме есть несколько Panel-ов. Хочу добавить Drag&Drop. Как сделать так, чтобы при перетаскивании файла на определенную панель вызывалась определенная функция. Т.е. не одна функция, а та, в зависимости от того на какую панель переносится фаил?
← →
jack128 © (2005-05-29 19:07) [1]для каждой панели вызываешь DragAcceptFiles и отлавливаешь WM_DROPFILES в оконных процедурах этих панелей..
← →
Destroyer © (2005-05-29 22:31) [2]Мысль ясна, но что-то в событиях панелей не вижу DragAcceptFiles. Может надо OnDragDrop? И если можно примерчик отлавливания сообщения dropfiles.
← →
vertal © (2005-05-30 00:13) [3]Вот пример для TStringGrid, для TPanel будет то же самое.
AddFilesToProcess - функция, обрабатываюшая добавление ряда имен файлов в данный StringGrid.
TfmMain = class(TForm)
...
sgFilesList: TStringGrid;
...
procedure OnDropFiles(var DropMsg: TMessage); message WM_DROPFILES;
private
...
FOldsgWndProc: TWndMethod;
...
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
...
shellapi.DragAcceptFiles(Self.sgFilesList.Handle, TRUE);
Self.FOldsgWndProc := Self.sgFilesList.WindowProc;
Self.sgFilesList.WindowProc := Self.OnDropFiles;
...
end;
procedure TfmMain.FormDestroy(Sender: TObject);
begin
...
if @Self.FOldsgWndProc <> nil then
Self.sgFilesList.WindowProc := Self.FOldsgWndProc;
shellapi.DragAcceptFiles(Self.sgFilesList.Handle, FALSE);
...
end;
procedure TfmMain.OnDropFiles(var DropMsg: TMessage);
var
CurFileName: PChar;
I, FilesCount, lngtmp: Integer;
NewFiles: TStringList;
begin
case DropMsg.Msg of
WM_DROPFILES:
try
FilesCount := DragQueryFile(TWMDropFiles(DropMsg).Drop, $FFFFFFFF, nil, 0);
NewFiles := TStringList.Create;
try
CurFileName := StrAlloc(MAX_PATH + 1);
try
NewFiles.Capacity := FilesCount;
for I := 0 to FilesCount - 1 do
begin
DragQueryFile(TWMDropFiles(DropMsg).Drop, I, CurFileName, MAX_PATH);
NewFiles.Add(CurFileName);
end;
AddFilesToProcess(NewFiles);
DragFinish(TWMDropFiles(DropMsg).Drop);
DropMsg.Result := 0;
finally
StrDispose(CurFileName);
end;
finally
NewFiles.Free;
end;
except
on E:Exception do
Application.ShowException(E);
// здесь возможна нехватка памяти при создании NewFiles
// если Windows вызовет оконную процедуру напрямую,
// то не хочу, чтобы из-за этого вылетело все приложение
end;
else
Self.FOldsgWndProc(DropMsg)
end;//case
end;
← →
Cobalt © (2005-05-30 14:41) [4]2 Destroyer © (29.05.05 22:31) [2]
Пишешь в программе DragAcceptFiles и нажимаешь F1.
Затем вдумчиво читаешь справку по этой фунции. Затем нажимаешь кнопочку "Overview" для этой статьи и опять читаешь.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c