السلام عليكم يا شباب ار يد ان أسالكم
الم يخطر ببال احدكم السؤال التالي بما ان دلفي برنامج في النهاية كيف تتمكن من تحريك
العناصر عليها بواسطة السحب و الافلات هذا التقنية نافعة جدا وخصوصا لبرامج الحرافيكس وبرامج الهندسة والدواير المنطقية حتى في معالجات النصوص الشهيرة مثل الورد
في هذا المقال الصغير احب ان اضع درسا صغيرا جدا في هذا الموضوع
خذا عنصرا وليكن Image1 من الخاصية picture حمل الصورة التي تريدها
من اجل Image1 قم بالاتي :
ضع القيمة dkdock للخاصية DragKind ضع القيمة dmAutomatic للخاصية DargMode
من اجل الفورم قم بالاتي:
في الفورم ضع القيمة true للخاصية dockSite
في الحدث OnCreate في الفورم ضع الكود التالي
Image1.ManualFloat(Rect(Form1.Left+Image1.Left, Form1.Top+Image1.Top, Form1.Left+Image1.Left+Image1.Width, Form1.Top+Image1.Top+Image1.Height)); Image1.ManualDock(Form1,nil,alLeft);
والان يا صديقي قم بتشغيل البرنامج نعم ... ماذا تقول مبروك لقد فعلتها حاول ان تخرج الصورة من الفورم
والان قم بتكرير الخطوات السابقة لعنصر من النوع Button1 إ ضافة لذلك اذهب الى الحدث onClick من اجل ال Button1 و اكتب بداخله اي شيء ShowMessage(‘hi’); مثلا
ماذا هل تواجه بعض المشاكل اذا كانت اجابتك بنعم فانت محق يبدو انك لا ترى الرسالة رغم ضغطك على الزر مرارا وتكرار حسنا سوف احاول مساعدتك
والان مع الButton1 قم بما يلي
اولا : ضع القيمة dmManual للخاصية DargMode
ثم اذهب الى الحدث onKeyDown و اكتب ما يلي
if (Key = VK_MENU) then (Sender as TButton).DragMode := dmAutomatic;
ثم اذهب الى الحدث onKeyUp و اكتب ما يلي:
if (Key = VK_MENU) then (Sender as TButton).DragMode := dmManual;
بالنسبة نوافذ الادخال النصي ك Edit1 مثلا او الmemo1 عاملها معاملة ال Button1
والان يا صديقي قم بتشغيل البرنامج حرك الزر هل استطعت ان تفعل ذلك والان حاول سحب الزر ضاغطا اثناء ذلك على الِAlt هل تمكنت من تحريكه ممتاز
اعرف انك اخرجت الصورة والزر من الفورم وتفكر الان ماذا لو ان مستخدما ذكيا مثلا قام باغلاق الصورة من الاطار الذي يتكون حولها بعد اخراجها خارج حدود الفورم كيف اضمن عدم حدوث هذا انت ذكي جدا اخي ولكن كأي مبرمح ذكي لابد ان تدفع ثمن ذكائك
الطريقة الثانية:
قم بإغلاق التطبيق الحالي وافتح تطبيقا جديدا
وقم بالخطوات التالية
خذا عنصرا وليكن Image1 من الخاصية picture حمل الصورة التي تريدها
قم بتعريف متغيرات عامة او داخل الكلاس كالاتي
………
public
{ Public declarations }
move:boolean;
X0,Y0:integer;
rec:TRect;
end;
…………من اجل Image1 قم بالاتي :
أذهب الى الحدث onMouseDown واكتب الكود الاتي
if Button<>mbLeft then exit; x0:=X; y0:=y; move:=true; rec:=(Sender as TControl).BoundsRect;
ثم أذهب الى الحدث onMouseUp واكتب الكود الاتي
Canvas.DrawFocusRect(rec); With (Sender as TControl) do begin SetBounds(rec.Left+X-X0,rec.Top+Y-Y0,Width,Height); BringToFront; end; move:=false;
ثم أذهب الى الحدث onMouseMove واكتب الكود الاتي
if not move then exit; Canvas.DrawFocusRect(rec); with rec do begin left:=left+X-X0; Right:=Right+X-X0; top:=Top+Y-Y0; bottom:=Bottom+Y-Y0; X0:=X; Y0:=Y; end; Canvas.DrawFocusRect(rec);
انا شخصيا افضل الطريقة الثانية
اعتقد ان الكود واضح جدا جدا
اذا كان عدد المكونات كبيرا استخدم ActionList عفوا على الاطالة وا عذرونا على التقصير
