Přetahování souborů do vaší aplikace - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Přetahování souborů do vaší aplikace

drag&drop

24. dubna 2001, 00.00 | Značná část programů ve Windows podporuje přetahování souborů ze složek přímo do svého okna. V článku si ukážeme, jak tuto možnost začlenit i do vaší aplikace.

Jedna z užitečných věcí ve Windows je beze sporu možnost přetahovat soubory ze složek do oken různých aplikací, ve kterých se následně otevřou. Toto chování podporuje většina aplikací pracujících se soubory a pokud obdobnou aplikaci tvoříte, určitě vám přijde vhod návod, jak do ní možnost přetahování souborů začlenit.

Ukázková aplikaceCelý postup si vysvětlíme na jednoduchém prográmku, který bude obsahovat pouze jediný formulář s ListBoxem (viz obrázek). Když na tento formulář přetáhneme soubor nebo skupinu souborů, jejich názvy se zobrazí právě v ListBoxu. Ve skutečné aplikaci je samozřejmě nějak zpracujete, ale nám tu jde především o princip, takže se spokojíme s přidáváním jejich názvů do onoho ListBoxu.

Inicializace

První, co budeme muset udělat, je informovat Windows, že do okna naší aplikace můžou být přetaženy soubory. Tato informace slouží mimo jiné k tomu, aby systém mohl nad oknem zobrazit při přetahování správný kurzor. Funkce, kterou Windows sdělíme naše záměry, se jmenuje DragAceptFiles. Její první parametr je handle okna, na které mají jít přetahovat soubory. Druhý parametr je typu Boolean a určuje, zda okno přihlašujeme (True) nebo odhlašujeme (False) z  přetahování.

Funkce DragAcceptFiles je (stejně jako ostatní, které budeme využívat) deklarována v unitě ShellAPI, kterou je tím pádem nutné přidat do úvodní klauzule uses v našem programu.

Na základě předchozích odstavců vás už zajisté napadá, jak by měla vypadat obsluha události OnCreate a OnDestroy na hlavním formuláři. Například takhle:

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

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DragAcceptFiles(Handle, False);
end;

Vlastní detekce přetahování

Přihlášení bychom měli, teď ovšem zbývá vyřešit problém s vlastní detekcí, zda byl na aplikaci přetažen soubor. Mechanismus je následující: Když "upustíte" soubor na okno aplikace, Windows zašlou danému oknu zprávu WM_DROPFILES. Po zaslání této zprávy je možné pomocí funkce DragQueryFile zjistit počet souborů a jejich názvy. Tato funkce si bere za parametry handle přetažení (zjistíme z parametrů zprávy WM_DROPFILES), index souboru, jehož název chceme zjistit, a nakonec ukazatel na buffer, kam se jméno zapíše, a jeho délku. Pokud jako index souboru uvedeme hodnotu $FFFFFFFF, návratovou hodnotou funkce bude počet souborů, které jsou přetahovány.

Až soubory zpracujeme, je programátorskou slušností zavolat funkci DragFinish, čímž systému sdělíme, že přetahování je zpracováno a tím pádem systém může uvolnit paměť, kterou na něj alokoval (pro názvy souborů apod.).

Vlastní proceduru na zpracování zprávy WM_DROPFILES musíme nejdříve deklarovat v definici hlavního formuláře:

.
.
.
public
  { Public declarations }
  procedure WMDropFiles(var M:TWMDropFiles); message WM_DROPFILES;
end;
.
.
.

Všimněte si, že v unitě Messages je přímo struktura TWMDropFiles, která trochu usnadňuje zpracování této zprávy. No a teď už vlastní tělo procedury:

procedure TForm1.WMDropFiles(var M:TWMDropFiles);
var
  I, N: integer;
  Buf: array[0..MAX_PATH] of Char; // buffer na jména souborů
begin
  ListBox1.Items.Clear;
  // zjistíme počet souborů...
  N := DragQueryFile(M.Drop, $FFFFFFFF, Buf, SizeOf(Buf));
  for I := 0 to N-1 do
  begin
    // ... a pro každý z nich zjistíme jeho jméno a přidáme ho do ListBoxu
    DragQueryFile(M.Drop, I, Buf, SizeOf(Buf));
    ListBox1.Items.Add(Buf);
  end;
  // ukončení přetahování
  DragFinish(M.Drop);
end;

Závěr

Jak je snad z článku vidět, na přetahování souborů není nic těžkého. Se třemi funkcemi a zpracováním jedné zprávy tak můžete svojí aplikaci obohatit o zajímavou funkci, která navíc podstatně zvyšuje uživatelský komfort programu.

Stáhnout ukázku + zdrojový kód (Delphi 3)

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: