إذا كنت تقوم بتطوير تطبيقات الرسومات أو الوسائط المتعددة، فقد تتساءل عن كيفية نقل النموذج دون استخدام شريط العنوان الخاص به. في الواقع، ما عليك سوى سحب منطقة العميل الخاصة بالنموذج باستخدام الماوس.
الطريقة الأولى
ما يلي هو الطريقة الأكثر شيوعًا لإنجاز الوظيفة المذكورة أعلاه: قم بإضافة بيان الإجراء التالي في قسم البيان الخاص في النموذج:
الإجراء WMNCHitTest(var Msg:TWMNCHitTest);message WM_NCHITTEST;
ثم أضف الكود التالي في قسم التنفيذ:
الإجراء TForm1{أو اسم النموذج الذي حددته}.WMNCHitTest(var Msg:TWMNCHitTest);
يبدأ
DefaultHandler(Msg);
إذا Msg.Result = HTCLIENT ثم
Msg.Result:= HTCAPTION;
نهاية؛
هذه الطريقة تجعل Windows يعتقد أنه تم النقر على شريط العنوان عند النقر بالماوس على منطقة العميل في النموذج.
الطريقة الثانية
إليك طريقة أخرى لتحريك نموذج عادي باستخدام الماوس.
الإجراء TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
يبدأ
إذا (ssLeft في Shift) ثم ابدأ
ReleaseCapture;
SendMessage(Form1.Handle,WM_SYSCOMMAND,SC_MOVE+1,0);
نهاية؛
نهاية؛
عيوب الأساليب المذكورة أعلاه
دعونا نرى ما يحدث عند إيقاف تشغيل خيار "إظهار محتويات النافذة أثناء السحب". هذا الإعداد مخصص لنوافذ Windows. يمكنك العثور على هذه الخاصية في "قائمة ابدأ -> الإعدادات -> خيارات المجلد -> عرض -> الإعدادات المتقدمة". في Windows95، تحتاج إلى تعديل التسجيل. عند تعيين هذه الخاصية إلى غير صالحة، سيتغير النموذج إلى مخطط تفصيلي مربع عند سحبه. ربما تستخدم نموذجًا غير منتظم، لكنه لا يزال يظهر الخطوط العريضة.
عندما تريد إرساء النموذج الخاص بك على حافة الشاشة (على سبيل المثال: WinAmp، عندما تقوم بسحب النموذج إلى موضع معين في أعلى الشاشة، سيكون النموذج قريبًا من أعلى الشاشة)، إذا تستخدم الخطوة الثانية أعلاه بهذه الطريقة، لن تتمكن من التعامل مع موضع النموذج حتى يتم تحرير زر الماوس، ولن تتمكن من التعامل مع مشكلات الإرساء.
فيما يلي سأستخدم طرقًا بسيطة لحل مشكلتين:
أولاً، بغض النظر عن الإعداد، لن يتم عرض المخطط التفصيلي عند سحب النموذج؛
ثانيًا، يتم إجراء الكشف عن الموضع عند نقل النموذج، ويتم إرساءه في موقع محدد عندما يكون الموضع مناسبًا.
ربما قام العديد من الأشخاص بحل هذه المشكلات، ولكن ربما يساعدك الكود أدناه.
الطريقة الثالثة
يمكن نسخ التعليمة البرمجية التالية مباشرة إلى دلفي، بشرط أن تقوم بحفظ Form1 باسم uMain.pas وForm2 باسم uDock.pas. الأحداث المستخدمة هي: OnMouseDown، OnMouseMove، OnMouseUp، OnShow (Form1).
يعد هذا أسلوبًا لنقل نموذج استنادًا إلى حركة الماوس، بما في ذلك النموذجين uMain وuDock (Form1 وForm2). يتم فتح Form2 من خلال Form1 ويمكن إرساءه في الجزء السفلي من Form1. بمجرد الإرساء، سيتحرك Form2 مع Form1 حتى تقوم بنقل Form2 بعيدًا.
النموذج 1
وحدة uMain؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار؛
يكتب
TForm1 = الفئة (TForm)
الإجراء FormMouseDown(Sender:TObject; Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
الإجراء FormMouseMove(Sender: TObject; Shift: TShiftState;X,Y: Integer);
الإجراء FormMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
الإجراء FormShow(Sender: TObject);
خاص
{تصريحات خاصة}
عام
DocktoForm: منطقية؛
{التصريحات العامة}
نهاية؛
فار
Form1: TForm1؛
CanMove، CanMoveX، CanMoveY: منطقية؛
OldX، OldY: عدد صحيح؛
F1X، F1Y، F2X، F2Y: عدد صحيح؛
منطقة العمل: TRect؛
تطبيق
يستخدم uDock؛
{$R *.DFM}
الإجراء TForm1.FormMouseDown(Sender: TObject; الزر: TMouseButton;Shift: TShiftState; X, Y: Integer);
يبدأ
CanMoveX := true;
CanMoveY := true;
CanMove := true;
OldX := X;
OldY := Y;
إذاDocktoForm ثم
يبدأ
F1X := Form1.Left;
F1Y := Form1.Top;
F2X := Form2.Left;
F2Y := Form2.Top;
نهاية؛
نهاية؛
الإجراء TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
يبدأ
إذا (CanMove) ثم
يبدأ
إذا كان CanMoveX بعد ذلك
Form1.Left := Form1.Left + (X - OldX)؛
إذا كان CanMoveY ثم
Form1.Top := Form1.Top + (Y - OldY)؛
// يُثبت هذا القسم في الأعلى
إذا (Form1.Top < WorkArea.Top + 10) و (Form1.Top > WorkArea.Top-10) ثم
يبدأ
Form1.Top := WorkArea.Top;
إذا كان (Y-OldY > 10) أو (Y-OldY <-10) إذن
CanMoveY := صحيح
آخر
CanMoveY := False;
نهاية؛
// يتم تثبيت هذا القسم على الجانب الأيسر
إذا (Form1.Left < WorkArea.Left+10) و (Form1.Left > WoskArea.Left-10) ثم
يبدأ
Form1.Left := WorkArea.Left;
إذا كان (X-OldX > 10) أو (X-OldX < -10) إذن
CanMoveX := صحيح
آخر
CanMoveX := خطأ؛
نهاية؛
// يتم تثبيت هذا القسم على الجانب الأيمن
إذا (Form1.Left > WorkArea.Right-Form1.Width-10) و(Form1.Left < WorkArea.Right-Form1.Width+10) ثم
يبدأ
Form1.Left := WorkArea.Right-Form1.Width;
إذا كان (X-OldX > 10) أو (X-OldX < -10) إذن
CanMoveX := صحيح
آخر
CanMoveX := خطأ؛
نهاية؛
// يتم تثبيت هذا القسم على شريط المهام
إذاDocktoForm ثم
يبدأ
إذا (Form1.Top > WorkArea.Bottom-Form1.Height-Form2.Height-10) و (Form1.Top < WorkArea.Bottom-Form1.Height-Form2.Height+10) ثم
يبدأ
Form1.Top := WorkArea.Bottom-Form1.Height-Form2.Height;
إذا كان (Y-OldY > 10) أو (Y-OldY <-10) إذن
CanMoveY := صحيح
آخر
CanMoveY := False;
نهاية؛
نهاية
آخر تبدأ
إذا (Form1.Top > WorkArea.Bottom-Form1.Height-10) و (Form1.Top < WorkArea.Bottom-Form1.Height+10) ثم
يبدأ
Form1.Top := WorkArea.Bottom-Form1.Height;
إذا كان (Y-OldY > 10) أو (Y-OldY <-10) إذن
CanMoveY := صحيح
آخر
CanMoveY := False;
نهاية؛
نهاية؛
إذاDocktoForm ثم
يبدأ
Form2.Left := Form1.Left - (F1X-F2X);// + (X-OldX);
Form2.Top := Form1.Top+Form1.Height;
مخرج؛
نهاية؛
// هذا القسم يغلق قائمة التشغيل في وسط Form1
إذا (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) و (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) و
(Form2.Top > Form1.Top+Form1.Height-10) و (Form2.Top < Form1.Top+Form1.Height+10) ثم
يبدأ
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
DocktoForm := True;
F1X := Form1.Left;
F1Y := Form1.Top;
F2X := Form2.Left;
F2Y := Form2.Top;
نهاية؛
نهاية؛
نهاية؛
الإجراء TForm1.FormMouseUp(Sender: TObject; الزر: TMouseButton; Shift: TShiftState; X, Y: Integer);
يبدأ
CanMove := false;
نهاية؛
الإجراء TForm1.FormShow(Sender: TObject);
يبدأ
// احصل على معلمات منطقة العمل
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
Form2.Show؛
نهاية؛
نهاية.
النموذج 2
وحدة uDock؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار؛
يكتب
TForm2 = الفئة(TForm)
الإجراء FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
الإجراء FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
الإجراء FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
خاص
{تصريحات خاصة}
عام
{التصريحات العامة}
نهاية؛
فار
Form2: TForm2؛
CanMove، CanMoveX، CanMoveY، DocktoForm: Boolean؛
OldX، OldY: عدد صحيح؛
تطبيق
يستخدم uMain؛
{$R *.DFM}
الإجراء TForm2.FormMouseDown(Sender: TObject; الزر: TMouseButton;Shift: TShiftState; X, Y: Integer);
يبدأ
CanMoveX := true;
CanMoveY := true;
CanMove := true;
OldX := X;
OldY := Y;
نهاية؛
الإجراء TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
يبدأ
إذا (CanMove) ثم
يبدأ
إذا كان CanMoveX بعد ذلك
Form2.Left := Form2.Left + (X - OldX)؛
إذا كان CanMoveY ثم
Form2.Top := Form2.Top + (Y - OldY)؛
// يُثبت هذا القسم في الأعلى
إذا (Form2.Top < WorkArea.Top + 10) و (Form2.Top > WorkArea.Top-10) ثم
يبدأ
Form2.Top := WorkArea.Top;
إذا كان (Y-OldY > 10) أو (Y-OldY <-10) إذن
CanMoveY := صحيح
آخر
CanMoveY := False;
نهاية؛
// يتم تثبيت هذا القسم على الجانب الأيسر
إذا (Form2.Left < WorkArea.Left+10) و (Form2.Left > WorkArea.Left-10) ثم
يبدأ
Form2.Left := WorkArea.Left;
إذا كان (X-OldX > 10) أو (X-OldX < -10) إذن
CanMoveX := صحيح
آخر
CanMoveX := خطأ؛
نهاية؛
// يتم تثبيت هذا القسم على الجانب الأيمن
إذا (Form2.Left > WorkArea.Right-Form2.Width-10) و(Form2.Left < WorkArea.Right-Form2.Width+10) ثم
يبدأ
Form2.Left := WorkArea.Right-Form2.Width;
إذا كان (X-OldX > 10) أو (X-OldX < -10) إذن
CanMoveX := صحيح
آخر
CanMoveX := خطأ؛
نهاية؛
// يتم تثبيت هذا القسم على شريط المهام
إذا (Form2.Top > WorkArea.Bottom-Form2.Height-10) و (Form2.Top < WorkArea.Bottom-Form2.Height+10) ثم
يبدأ
Form2.Top := WorkArea.Bottom-Form2.Height;
إذا كان (Y-OldY > 10) أو (Y-OldY <-10) إذن
CanMoveY := صحيح
آخر
CanMoveY := False;
مخرج؛
نهاية؛
// يتم تثبيت هذا القسم بأسفل المشغل
إذا (Form2.Top > Form1.Top+Form1.Height-10) و (Form2.Top < Form1.Top+Form1.Height+10) و (Form2.Left > Form1.Left-Form2.Width) و (Form2. اليسار <Form1.Left + Form1.Width) ثم
يبدأ
Form2.Top := Form1.Top+Form1.Height;
إذا كان (Y-OldY > 10) أو (Y-OldY < -10) فابدأ
CanMoveY := true;
Form1.DockToForm := خطأ؛
نهاية
آخر تبدأ
CanMoveY := False;
Form1.DockToForm := صحيح؛
نهاية؛
نهاية؛
// هذا القسم يغلق قائمة التشغيل في وسط Form1
إذا (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) و (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) و
(Form2.Top > Form1.Top+Form1.Height-10) و (Form2.Top < Form1.Top+Form1.Height+10) ثم
يبدأ
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
إذا كان (X-OldX > 10) أو (X-OldX < -10) أو (Y-OldY > 10) أو (Y-OldY < -10) إذن
CanMoveX := صحيح
آخر
CanMoveX := خطأ؛
نهاية؛
نهاية؛
نهاية؛
الإجراء TForm2.FormMouseUp(Sender: TObject; الزر: TMouseButton;Shift: TShiftState; X, Y: Integer);
يبدأ
CanMove := false;
نهاية؛
نهاية.
آمل أن يكون ما ورد أعلاه مفيدًا لأولئك الذين يعانون من محتوى مماثل.