Главная страница
    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.48 MB
Время: 0.031 c
1-1187367895
badevlad
2007-08-17 20:24
2007.11.04
Проверка орфографии в Internet Explorer


2-1192294034
БатоноКидатель
2007-10-13 20:47
2007.11.04
Поиск в двух мерном массиве


15-1190989765
ProgRAMmer Dimonych
2007-09-28 18:29
2007.11.04
Версии DirectX


2-1192001656
Александр
2007-10-10 11:34
2007.11.04
Убегающий курсор... (необходима помощь в решении проблемы)


1-1187684815
ehhhh
2007-08-21 12:26
2007.11.04
наложение изображения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский