issamdnn
22-12-2009, 11:00 AM
1 - أنشئ تطبيق جديد.
2- ضع على الفورم عنصر TPanel
3- ضع ضمن البانيل عنصر Timage
5- ضع الكود التالي بدل كامل الكود في الوحدة:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
procedure FormCreate(Sender: TObject) ;
private
originalPanelWindowProc : TWndMethod;
procedure PanelWindowProc (var Msg : TMessage) ;
procedure PanelImageDrop (var Msg : TWMDROPFILES) ;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ShellApi;
procedure TForm1.FormCreate(Sender: TObject) ;
begin
originalPanelWindowProc := Panel1.WindowProc;
Panel1.WindowProc := PanelWindowProc;
DragAcceptFiles(Panel1.Handle,true) ;
//إعلام ويندوز بأن البانيل تقبل إفلات الملفات فوقها
end;
procedure TForm1.PanelWindowProc(var Msg: TMessage) ;
begin
// معالجة الرسالة
if Msg.Msg = WM_DROPFILES then
PanelImageDrop(TWMDROPFILES(Msg))
else
originalPanelWindowProc(Msg) ;
end;
procedure TForm1.PanelImageDrop(var Msg: TWMDROPFILES) ;
var
numFiles : longInt;
buffer : array[0..MAX_PATH] of char;
begin
numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ;
if numFiles > 1 then
begin
ShowMessage('يمكنك فقط إسقاط صورة واحدة على البانل ') ;
end
else
begin
DragQueryFile(Msg.Drop, 0, @buffer, sizeof(buffer)) ;
try
// تحميل الصورة من الملف
Image1.Picture.LoadFromFile(buffer) ;
except
on EInvalidGraphic do ShowMessage('ملف صورة غير مدعوم ') ;
end;
end;
end;
end.
الشرح:
لكي يكون تطبيقك متقبلاً للملفات المسحوبة من مستكشف ويندوز .يتوجب عليك أن تجعل ويندوز يعرف بأن تطبيقك يقبل الملفات المسحوبة وذلك بإستدعاء إجرائية DragAcceptFiles من الوحدة ShellApi
بعد ذلك ينبغي على تطبيقك الإستجابة لحدث الإفلات والسحب وذلك بإنشاء إجرائية تستجيب لرسالة WM_DROPFILES
إن إجرائية DragAcceptFiles تقبل مقبظ النافذة كأول بارمتر لها, وبإعتبار أن العنصر Timage لا يعطي مقبظ تم اللجوء إلى البانيل .
والله الموفق للجميع.
2- ضع على الفورم عنصر TPanel
3- ضع ضمن البانيل عنصر Timage
5- ضع الكود التالي بدل كامل الكود في الوحدة:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
procedure FormCreate(Sender: TObject) ;
private
originalPanelWindowProc : TWndMethod;
procedure PanelWindowProc (var Msg : TMessage) ;
procedure PanelImageDrop (var Msg : TWMDROPFILES) ;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ShellApi;
procedure TForm1.FormCreate(Sender: TObject) ;
begin
originalPanelWindowProc := Panel1.WindowProc;
Panel1.WindowProc := PanelWindowProc;
DragAcceptFiles(Panel1.Handle,true) ;
//إعلام ويندوز بأن البانيل تقبل إفلات الملفات فوقها
end;
procedure TForm1.PanelWindowProc(var Msg: TMessage) ;
begin
// معالجة الرسالة
if Msg.Msg = WM_DROPFILES then
PanelImageDrop(TWMDROPFILES(Msg))
else
originalPanelWindowProc(Msg) ;
end;
procedure TForm1.PanelImageDrop(var Msg: TWMDROPFILES) ;
var
numFiles : longInt;
buffer : array[0..MAX_PATH] of char;
begin
numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ;
if numFiles > 1 then
begin
ShowMessage('يمكنك فقط إسقاط صورة واحدة على البانل ') ;
end
else
begin
DragQueryFile(Msg.Drop, 0, @buffer, sizeof(buffer)) ;
try
// تحميل الصورة من الملف
Image1.Picture.LoadFromFile(buffer) ;
except
on EInvalidGraphic do ShowMessage('ملف صورة غير مدعوم ') ;
end;
end;
end;
end.
الشرح:
لكي يكون تطبيقك متقبلاً للملفات المسحوبة من مستكشف ويندوز .يتوجب عليك أن تجعل ويندوز يعرف بأن تطبيقك يقبل الملفات المسحوبة وذلك بإستدعاء إجرائية DragAcceptFiles من الوحدة ShellApi
بعد ذلك ينبغي على تطبيقك الإستجابة لحدث الإفلات والسحب وذلك بإنشاء إجرائية تستجيب لرسالة WM_DROPFILES
إن إجرائية DragAcceptFiles تقبل مقبظ النافذة كأول بارمتر لها, وبإعتبار أن العنصر Timage لا يعطي مقبظ تم اللجوء إلى البانيل .
والله الموفق للجميع.