Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
ВнизЗагрузить файл с помощью перетаскивания его курсором Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.04 c