Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1192167883
kyn66
2007-10-12 09:44
2007.11.04
TRxDBLookupCombo вместе с MSSQL


2-1191573113
SCL
2007-10-05 12:31
2007.11.04
Поиск файлов


3-1182878418
Kley
2007-06-26 21:20
2007.11.04
из Excel в Access


2-1192435330
Quart
2007-10-15 12:02
2007.11.04
CachedUpdates


15-1191197823
Andy BitOff
2007-10-01 04:17
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский