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

Вниз

Загрузить файл с помощью перетаскивания его курсором   Найти похожие ветки 

 
AIK ©   (2007-10-11 12:36) [0]

Добрый день.
Хотелось бы узнать можно ли загрузить файл с помощью перетаскивания его курсором
К примеру размешаю на форму какой-нибудь компонент который может загружать файлы  (memo, mediaplayer …) и при перетаскивания файл с помощью курсором они загружаются в программу
Если да то подскажите как это осуществить или оставьте ссылку заранее спасибо.


 
Призраки   (2007-10-11 12:46) [1]

Копай в сторону WM_DROPFILE. Через несколько минут будет пример.


 
Dib@zol ©   (2007-10-11 12:46) [2]

Тфу. [1] - эт я.


 
MOO   (2007-10-11 12:56) [3]

Drag&Drop


 
Dib@zol ©   (2007-10-11 13:18) [4]

Все вопросы - в эту ветку и в F1.

program Test;

{$Warnings off}
{$Hints off}

uses
 Windows, Messages, ShellAPI;

type
 StringArr = array of string;

const
  WW = 300;
  WH = 170;
  CN = "DRAG_DROP_WND";
  WN = "Drag&Drop test";

var
 M : MSG;
 W : HWND;
 WC : WNDCLASS;
 Names : StringArr;

function EnumDroppedFiles(Drop:HDROP):StringArr;
var
 I, N, L : Cardinal;
 P : PChar;
begin
 N:=DragQueryFile(Drop, INVALID_HANDLE_VALUE, nil, 0);
 if N=0 then exit;
 SetLength(Result, N);
 dec(N);
 for I:=0 to N do begin
   L:=DragQueryFile(Drop, I, nil, 0);
   inc(L);
   GetMem(P, L);
   DragQueryFile(Drop, I, P, L);
   Result[I]:=P;
   FreeMem(P);
 end;
 DragFinish(Drop);
end;

function IntToStr(n:Cardinal):string;
begin
 str(n, Result);
end;

function WindowProc(hWnd: HWND; Msg, WParam, LParam: LongInt): LongInt; stdcall;
var
 i : DWORD;
 s : string;
begin
 Result:=0;
 case Msg of
   // Здесь обрабатывается приём группы файлов (или единичного файла
   // ессно). Используется самопальная функция EnumDroppedFiles.
   WM_DROPFILES:
     begin
       Names:=EnumDroppedFiles(WParam);
       for i:=0 to length(Names)-1 do
         s:=s+Names[i]+#13;
       MessageBox(hWnd, PChar(s), PChar("Принято "+intToStr(length(Names))+" файлов"), 0);
     end;

   WM_CLOSE: DestroyWindow(hWnd);

   WM_DESTROY:
     begin
       Finalize(Names);
       PostQuitMessage(0);
     end;
   
   else Result:=DefWindowProc(hWnd, Msg, WParam, LParam);
 end;
end;

begin
 with WC do begin
   Style := CS_HREDRAW or CS_VREDRAW;
   lpfnWndProc := @WindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := sysInit.HInstance;
   hCursor := LoadCursor(0, IDC_ARROW);
   hbrBackground := GetSysColorBrush(COLOR_BTNFACE);
   lpszClassName := CN;
 end;
 RegisterClass(WC);
 // Здесь проставляется дополнительный флаг WS_EX_ACCEPTFILES для того, чтоб окну приходило сообщение   // WM_DROPFILES. В VCL его если не ошибаюсь можно проставить в процедуре CreateParams в поле Params.ExStyle
 W := CreateWindowEx(WS_EX_ACCEPTFILES, CN, WN, WS_VISIBLE
 or WS_SYSMENU, round((GetSystemMetrics(SM_CXSCREEN)-WW)/2),
 round((GetSystemMetrics(SM_CYSCREEN)-WH)/2), WW, WH,
 0, 0, HInstance, nil);
 ShowWindow(W, SW_SHOWNORMAL);
 UpdateWindow(W);

 while GetMessage(M, 0, 0, 0) do begin
   TranslateMessage(M);
   DispatchMessage(M);
 end;
 Halt(M.wParam);
end.


 
AIK ©   (2007-10-11 13:30) [5]


> Dib@zol ©


Спасибо


 
MOO   (2007-10-11 13:31) [6]

unit Drop;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ShellApi;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   procedure FormCreate(Sender: TObject);
 private
   procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES; //получение сообщения о том, что файл тасчут на форму
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
 FileName: array[0..MAX_PATH] of Char; // путь к файлу
begin
 try
   If DragQueryFile(Msg.Drop, 0, FileName, MAX_PATH)>0 then
     begin
 form1.Edit1.Text:= filename;
          end;
 finally
   DragFinish(Msg.Drop); // отпустить файл
 end;
  end;
 end.


Вот мой простой пример


 
Dib@zol ©   (2007-10-11 13:33) [7]

Короче алгоритм такой:

- До создания формы ей присваивается дополнительное свойство - WS_EX_ACCEPTFILES, чтобы форма могла эти файлы принимать.
- Форме пишется свой обработчик сообщения WM_DROPFILES (см. F1), в к-ром используется самопальная функция EnumDroppedFiles.
- Она работает так:
  - Определяется (с помощью DragQueryFile, опять же см. F1) общее кол-во файлов.
  - Если файлов 0 (скажем неправильная структура попалась %) ) то выход.
  - Массив имён инициализируется, ему проставляется длина равная длине списка имён.
  - Далее идёт цикл перебора имён:
    - Определяется (с помощью DragQueryFile) объём памяти в байтах для размещения очередного имени (F1 !!!).
    - Выделяется под него(имя) память.
    - В память (в виде ASCIIZ-строки) пишется имя.
    - ASCIIZ-строка (то есть PChar-строка) перегоняется в массив.
    - Память из-под PChar - освобождается.
    - Всё это безобразие повторяется [длина_списка_имён] раз.
  - Структура HDROP освобождается.

В итоге в массиве имён оказываются полные пути к "принятым" файлам. Их можно оттуда брать и запускать.


 
Dib@zol ©   (2007-10-11 13:34) [8]

> [6] MOO   (11.10.07 13:31)

А если передано 2 (или больше) файлов?


 
MOO   (2007-10-11 13:36) [9]


> Dib@zol ©   (11.10.07 13:34) [8]


Ну я ж сказал-"простой" и понятный


 
AIK ©   (2007-10-11 13:51) [10]


> Dib@zol ©  

Спасибо за комментарии тоже


> MOO

А тебе просто спасибо :)


 
MOO   (2007-10-11 14:08) [11]


> AIK ©   (11.10.07 13:51) [10]

Могу дать такую же дребедень только для нескольких файлов. Нужно или сам дойдешь?


 
Denis__ ©   (2007-10-11 14:14) [12]

Медвежья услуга! Дай человеку самому додумать!


 
AIK ©   (2007-10-11 14:18) [13]

Сам разберусь



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

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

Наверх




Память: 0.5 MB
Время: 0.026 c
2-1191572966
Scarllett
2007-10-05 12:29
2007.11.04
URL/HTML открытого окна MS IE


10-1139914636
Andy BitOff
2006-02-14 13:57
2007.11.04
Ворд. Макрос. При ворд=visible работает, а в фоне нет.


2-1192101763
xayam
2007-10-11 15:22
2007.11.04
Как добавить символ перед


11-1175002147
ElectriC
2007-03-27 17:29
2007.11.04
Липкие окна


2-1190792821
zzzz
2007-09-26 11:47
2007.11.04
Значение null