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

Вниз

Как использовать 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.029 c
9-1111128588
Twister^^
2005-03-18 09:49
2005.06.14
cgShaders in GLS


1-1117471717
Karlson
2005-05-30 20:48
2005.06.14
Значение параметра Sender в ComboBoxChange(Sender: TObject)


1-1116949359
NightStranger
2005-05-24 19:42
2005.06.14
Как добавить подпункт в TreeView?


3-1115112808
jiny
2005-05-03 13:33
2005.06.14
Куда делся QrDbChart ?


8-1109668309
Ivolg
2005-03-01 12:11
2005.06.14
Инфо о видео файле