Jak wygodnie odczytać nazwy plików upuszczanych na komponenty naszego programu z pulpitu

Dryobates

Działanie całości opiera się na idei subclassingu. Windows zapewnia nam procedury do obsługi komunikatu WM_DROPFILES: DragAcceptFiles, DragFinish, DragQueryFile, DragQueryPoint. Jednak poszczególne komponenty nie mają takich zdarzeń, które by to umożliwiały. Stosując subclassing wzbogacamy nasze komponenty o nowe zdarzenia (w naszym wypadku OnListBox1DD)

unit Unit1;

interface

{
Wrzućmy na formę Label oraz 2 ListBox. Dodajmy do projektu moduł DD.pas i wpiszmy u sekcji uses DD.
}
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, 
{Kliknij na moduł to go ściągniesz}

DD;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
{
Dopiszmy jeszcze te 3 procedurki obsługi upuszczania plików
}    
    procedure OnListBox1DD(DD: TDragDrop);
    procedure OnListBox2DD(DD: TDragDrop);
    procedure ProcessDroppedFiles(ListBox: TListBox;
     DD: TDragDrop);
  public
    { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  {Najpierw trzeba dodać nasze komponenty do listy komponentów przyjmujących opuszczanie plików}
  AcceptDroppedFiles(ListBox1, OnListBox1DD);
  AcceptDroppedFiles(ListBox2, OnListBox2DD);
end;

procedure TForm1.OnListBox1DD(DD: TDragDrop);
begin
  {Jak zostanie upuszczony plik to przetwórz go}
  ProcessDroppedFiles(ListBox1, DD);
end;

procedure TForm1.OnListBox2DD(DD: TDragDrop);
begin
  ProcessDroppedFiles(ListBox2, DD);
end;

procedure TForm1.ProcessDroppedFiles(ListBox: TListBox; DD: TDragDrop);
var
  i: Integer;
begin
  {Sprawdźmy najpierw, czy plik upadł na nasz komponent}
  if DD.InClientArea then
    Label1.Caption := 'Trafiony zatopiony'
  else
    Label1.Caption := 'Pudło';
  {A teraz dodajmy całą listę plików, jakie zostały upuszczone}
  for i := 0 to DD.NumFiles - 1 do
    ListBox.Items.Add(DD.Files[i]);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  {Na koniec usuwamy nasze komponenty z listy. Więcej nie muszą oczekiwać na pliki}
  UnacceptDroppedFiles(ListBox1);
  UnacceptDroppedFiles(ListBox2);
end;

end.

Na podstawie książki: Kick Ass Delphi Programming.

3 komentarzy

Brak załącznika DD.zip na serwerze

A jak sprawa powinna wygladac w przypadku d 'n' d dla RichEdit bo moje zamiany i kombinacje nie przynosza skutku ...

heh
thx to jest to o co mi chodziło:)