![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузить файл с помощью перетаскивания его курсором
AIK © (2007-10-11 12:36:00)Добрый день.
Хотелось бы узнать можно ли загрузить файл с помощью перетаскивания его курсором
К примеру размешаю на форму какой-нибудь компонент который может загружать файлы (memo, mediaplayer …) и при перетаскивания файл с помощью курсором они загружаются в программу
Если да то подскажите как это осуществить или оставьте ссылку заранее спасибо.
AIK (2007-10-11 14:18:00) [1]Сам разберусь
Denis__ (2007-10-11 14:14:00) [2]Медвежья услуга! Дай человеку самому додумать!
MOO (2007-10-11 14:08:00) [3]
> AIK © (11.10.07 13:51) [10]
Могу дать такую же дребедень только для нескольких файлов. Нужно или сам дойдешь?
AIK (2007-10-11 13:51:00) [4]
> Dib@zol ©
Спасибо за комментарии тоже
> MOO
А тебе просто спасибо :)
MOO (2007-10-11 13:36:00) [5]
> Dib@zol © (11.10.07 13:34) [8]
Ну я ж сказал-"простой" и понятный
Dib@zol (2007-10-11 13:34:00) [6]> [6] MOO (11.10.07 13:31)
А если передано 2 (или больше) файлов?
Dib@zol (2007-10-11 13:33:00) [7]Короче алгоритм такой:
- До создания формы ей присваивается дополнительное свойство - WS_EX_ACCEPTFILES, чтобы форма могла эти файлы принимать.
- Форме пишется свой обработчик сообщения WM_DROPFILES (см. F1), в к-ром используется самопальная функция EnumDroppedFiles.
- Она работает так:
- Определяется (с помощью DragQueryFile, опять же см. F1) общее кол-во файлов.
- Если файлов 0 (скажем неправильная структура попалась %) ) то выход.
- Массив имён инициализируется, ему проставляется длина равная длине списка имён.
- Далее идёт цикл перебора имён:
- Определяется (с помощью DragQueryFile) объём памяти в байтах для размещения очередного имени (F1 !!!).
- Выделяется под него(имя) память.
- В память (в виде ASCIIZ-строки) пишется имя.
- ASCIIZ-строка (то есть PChar-строка) перегоняется в массив.
- Память из-под PChar - освобождается.
- Всё это безобразие повторяется [длина_списка_имён] раз.
- Структура HDROP освобождается.
В итоге в массиве имён оказываются полные пути к "принятым" файлам. Их можно оттуда брать и запускать.
MOO (2007-10-11 13:31:00) [8]
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.
Вот мой простой пример
AIK (2007-10-11 13:30:00) [9]
> Dib@zol ©
Спасибо
Dib@zol (2007-10-11 13:18:00) [10]Все вопросы - в эту ветку и в 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.
MOO (2007-10-11 12:56:00) [11]Drag&Drop
Призраки (2007-10-11 12:46:00) [12]Копай в сторону WM_DROPFILE. Через несколько минут будет пример.
Dib@zol (2007-10-11 12:46:00) [13]Тфу. [1] - эт я.