PDA

View Full Version : چطور یک فایل رو لیست باکس درگ(Drag) کنیم؟



hex161
چهارشنبه 16 فروردین 1385, 11:52 صبح
با سلام.
من میخواهم کاری کنم که وقتی کاربر یک فایل رو از داخل ویندوز به لیست باکس من کشید (درگ کرد) آدرس فایل تو لیست باکس یا Edit box نمایش داده بشه.مثلا تو برنامه مدیا پلیر ما میتونیم فایل های موسیقی یا فیلم ها رو از داخل ویندوز به لیست مدیاپلیر بندازیم.
خواستم ببینم چطور میشه این کار رو انجام داد؟
البته تو وی بی من براحتی این کار رو انجام میدادم .تو وی بی در رویداد OLEDragDropبا یک خط کد این کار انجام میشه.ولی تو دلفی نمیدونم چطوریه.
با تشکر.

vcldeveloper
دوشنبه 21 فروردین 1385, 08:49 صبح
می تونی با پردازش پیغام WM_DROPFILES این کار رو انجام بدی. باید اول برنامه ات را به عنوان برنامه ایی که فایل های درگ شده را قبول میکنه رجیستر کنی و یه Message Handler هم برای WM_DROPFILES بسازی و توش با استفاده از DragQueryFiles نام و تعداد فایلهای درگ شده را بدست بیاری. تمام توابع فوق در یونیت ShellAPI تعریف شدند و نحوه استفاده از اونها در Windows SDK توضیح داده شده.
نمونه ای از کدی که فایلهای درگ شده را به لیست باکس اضافه میکنه:


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
ShellAPI {ShellAPI is rquired};
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
//WM_DROPFILES is sent to any window that is registered to accept draged
//files from explorer.
procedure WMDROPFILES(var MSG : TMessage); message WM_DROPFILES;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
//Register the main window to accept draged files
DragAcceptFiles(Handle,True);
end;
procedure TForm1.WMDROPFILES(var MSG: TMessage);
var
hDrop : integer; //Drag data
FileCount : integer;
FileName : Array[ 0..Max_Path] of char; //Buffer
Index : integer; //Index of the file
begin
//WParam contains a pointer to the drag info. This data is created by Windows
//and must be freed by DragFinish.
hDrop := Msg.WParam;
//Passing $FFFFFFFF to DragQueryFile returns the numnber of files which are
//draged.
FileCount := DragQueryFile(hDrop,$FFFFFFFF,FileName,SizeOf(File Name));
//iterate in the draged files list and add each file to the listbox.
Index := 0;
repeat
//Get file name for each item.
//DragQueryFile returns the number of bytes returned as the file name. If
//is 0 then no data is returned and an error has been accured.
if DragQueryFile(hDrop,Index,FileName,SizeOf(FileName )) > 0 then
ListBox1.Items.Add(FileName)
else
raise Exception.Create('File Drag Error');
Inc(Index);
until Index = FileCount;
//Free the drag data
DragFinish(hDrop);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Sorted := True;
ListBox1.Sorted := False;
end;
end.

فرم بالا شامل یک لیست باکس و 2 دکمه هست که از دکمه ها برای پاک کردن محتوای لیست باکس و مرتب کردن محتوی اون استفاده میشه.