PDA

View Full Version : سوال: توضیح کد drag کردن از explorer



soft-c
دوشنبه 05 دی 1390, 21:19 عصر
این کد مربوط است به drag کردن از explorer داخل یک memo .

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure wmp(var mess:TWMDropFiles);
message WM_DROPFILES;
public
{ Public declarations }
end;


var
Form1: TForm1;


implementation

{$R *.dfm}
uses ShellAPI;

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

procedure TForm1.wmp(var mess: TWMDropFiles);
const max=255;
var cnt,fcount:integer;
fname:array [0..max] of char;
begin
fcount:=DragQueryFile(mess.Drop,$ffffffff,fname,ma x);
for cnt := 0 to -1+fcount do
begin
DragQueryFile(mess.Drop,cnt,fname,max);
Memo1.Lines.Insert(0,fname);
end;
DragFinish(mess.Drop);
end;

end.
حالا سوال من این است که :
1- این message که نوشته کارش چیه؟
2- چرا در حلقه ی for از 1- شروع کرده .
3- من که تابع wmp را صدا نزدم . پس چطوری اجرا میشه ؟

Felony
دوشنبه 05 دی 1390, 22:16 عصر
1- این message که نوشته کارش چیه؟
اون ادامه تعریف همون تابع wmp هست که یک Message Handler هست و با ذکر message WM_DropFiles گفته که به پیغام گوش کنه و هندلش کنه .


2- چرا در حلقه ی for از 1- شروع کرده .
چون ایندکسش از ۰ شروع شده .


3- من که تابع wmp را صدا نزدم . پس چطوری اجرا میشه ؟
نیاز به صدا زدن شما نیست , اون یک Message Handler برای پیغام های ویندوز ( در این مورد WM_DropFiles ) هست و نسبت به رسیدن این پیغام عکس العمل نشون میده , این پیغام هم همونطور که از اسمش پیداست وقتی به برنامه میرسه که یک فایل رو برنامه رها بشه , پس وقتی فایلی رو میکشید و روی برنامه رها میکنید , برنامه پیغام WM_DropFiles رو دریافت میکنه و MessageHandler ی که برای این پیغام نوشتی اجرا میشه .

برای اینکه با این مکانیزم سیستم عامل ( پیغام ها ) آشنا بشی عبارت Windows Messages رو گوگل کن .