الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ماهي طريقة اضافة زر بالكود مع تطبيق حدث عليه

بدأه أبورنه في 25 أكتوبر 2008 · 6 رد · 605 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته ..

هذا موضوع قديم وهو نفس ما أريد ولكن لم يكتمل ( الحلو ما يكمل )

/index.php?showtopic=123133

وسؤالي هو :

لو قمت بإضافة 10 ازرار Command بالكود

كيف أقوم بوضع حدث لكل العشر أزرار ..

وشكرا

وأرفقت مثال للتوضيح أكثر

crcom.rar

#2

السلام عليكم...

لقد رأينا في موضوعك السابق إضافة Label في Picture كيفية إنشاء عنصر جديد بالكود، و ذلك بالتصريح عن المتغير الذي يمثل العنصر مع استعمال كلمة WithEvents ثم استعمال Controls.Add. و هذه الطريقة سهلة جداً و عملية إذا كان عدد العناصر قليلاً (اثنين أو ثلاثة مثلاً). لكن إذا كنت تريد إضافة العديد من العناصر، 10 مثلاً كما ذكرت في سؤالك، فلا شك أن استعمال مصفوفة سيكون أسهل بكثير. لكن للأسف لا يمكن استعمال كلمة WithEvents عند التصريح عن مصفوفة، و بالتالي فإن أفضل و أسهل طريقة (و ربما الوحيدة) هي إنشاء مصفوفة مكونات (Control Array):

1. ضع زر (Command1 مثلاً) على الـ Form.

2. اضبط الخاصية Index للـ Command1 على 0. سيتم تلقائياً إنشاء مصفوفة اسمها Command1 تحتوي حالياً على عنصر واحد رقمه 0.

3. لإنشاء 10 أزرار إضافية اكتب في الحدث Form_Load كود كالتالي

  1. Private Sub Form_Load()
  2. Dim Idx As Long
  3.  
  4. For Idx = 1 To 10
  5. Load Command1(Idx)
  6. Command1(Idx).Caption = "Command" & Format(Idx, "00")
  7. Command1(Idx).Move 120 + ((Idx - 1) * (Command1(Idx).Width + 120)), 120
  8. Command1(Idx).Visible = True
  9. ' ضبط بقية الخصائص حسب الضرورة....
  10. Next Idx
  11. End Sub
  12.  

طبعاً يمكنك استعمال الحلقة فقط لتحميل الأزرار ثم ضبط بقية الخصائص لكل زر على حدة، مثلاً:

  1. Command1(1).Move 240, 360
  2. Command1(1).Caption = "جديد..."
  3. Command1(2).Move 240, 720
  4. Command1(2).Caption = "حفظ..."
  5.  

أما بالنسبة إلى تعيين معالجات الأحداث لتلك الأزرار فالمسألة محلولة أصلاً. إذا كان العنصر أو المكون جزءاً من مصفوفة مكونات فإن جميع الأحداث المتعلقة بذلك العنصر لها بارامتر إضافي اسمه Index و هو يشير إلى رقم العنصر الذي استدعى الإجراء.

إذن انقر نقراً مزدوجاً على الـ Command1 الذي وضعته على الـ Form و ستجد أن الإجراء Click كالتالي:

  1. Private Sub Command1_Click(Index As Integer)
  2. '
  3. End Sub
  4.  

لاحظ وجود البارامتر Index.

للاستجابة لزر معين من تلك الأزرار العشرة اختبر قيمة البارامتر Index باستعمال جملة Select Case كالتالي:

  1. Private Sub Command1_Click(Index As Integer)
  2. Select Case Index
  3. Case 1
  4. MsgBox "Item 1 Clicked"
  5. Case 2
  6. MsgBox "Item 2 Clicked"
  7. Case 3
  8. MsgBox "Item 3 Clicked"
  9. '...
  10. '...
  11. '...
  12. Case 10
  13. MsgBox "Item 10 Clicked"
  14. End Select
  15. End Sub
  16.  

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#3

أخي العزيز للأسف لا أريدها بالحدث load

أريدها كما هي سابقاً

Set lblName(n) = Me.Controls.Add("VB.CommandButton", "lblName" & n)

أي بمعنى

لا اريد إضافة أي زر على الفورم ...

لأن مشروعي يتطلب ذلك ..

وجزاك الله خير ...

#4

اتمنى عدم اهمال سؤالي ..

لأني محتاجه ضروري ..

وجزاكم الله خير

:happy: :wink: :wacko:

#5

أخي najy_zl

معليش أخي بس أنت تقوك

( بالتالي فإن أفضل و أسهل طريقة (و ربما الوحيدة) ) فالحقيقة ليست الوحيدة وهناك طريقة أنا متأكد منها ..

لدي كود شاهدته في أحد المواقع حل مشكلتي ولكن أريد إضافة أحداث مثل Clcik و dblClick و MouseMove وغيرها

شاهد الكود وأعطيني رأيك ولو تعدل عليه أكون لك من الشاكرين ...

تحملوني ولكني فعلاً محتاج الكود ...

هذا كود لا يوجد به كلمة ( load ) مطلقاً وفيه عدد لا نهائي من الكومند وفيه بكل زر حدث ...

addcomm.rar

#6

السلام عليكم...

و الله زمان على بعض التفاصيل في Visual Basic (منذ أن أخذتنا دلفي). شكراً على التذكير.

الفكرة الموجودة في البرنامج المرفق في مشاركتك السابقة ممتازة. فطالما أنه لا يمكننا استعمال WithEvents لإنشاء مصفوفة مكونات مع أحداثها، إذن يمكننا إنشاء صنف (Class) وظيفته الوحيدة الاحتفاظ بالمكون (بعد إنشائه) و معالجة الأحداث المرتبطة به.

البرنامج المرفق يستعمل نفس الفكرة مع إجراء عدة تعديلات بحيث يمكننا إنشاء عدة أزرار - سواء أكانت في مصفوفة أو منفردة - مع إمكانية تعيين أية معالجات أحداث نريد تعيينها لها. و أضفت إليها إجراءً لتغيير معالج حدث معين بمعالج آخر، بمعنى أن الزر الأول مثلاً نحدد له في البداية إجراءً معيناً لتنفيذه عند النقر، ثم نستطيع في مكان آخر في الكود أن نجعله ينفذ إجراءً آخر عند النقر.

و لتوضيح أنه يمكن تطبيق ذلك على أنواع أخرى من المكونات فقد أضفت Class Module أخرى لإنشاء مكونات TextBox و تعيين معالجات أحداث لها.

سنلاحظ التطابق شبه التام بين الـ Class Module الخاصة بالأزرار CButtonHolder.cls و تلك الخاصة بمربعات النص CTextBoxHolder.cls. الفرق فقط في نوع المكون الذي تنشئه و تحتفظ به الـ Class و في معالجات الأحداث التي نريد التعامل معها.

سنلاحظ كذلك التشابه التام بين جميع معالجات الأحداث في الـ Class Module، فجميعها تتكون من 5 أسطر لا غير.

أما معالجات الأحداث الفعلية (التي سنكتب فيها الكود المطلوب تنفيذه عند النقر على الزر مثلاً) فهي عبارة عن إجراءات مكتوبة في الـ Form نفسها، و يجب تعريفها على أنها Public، لكن الممتع في الأمر أنها جميعاً تأخذ نفس الشكل في تعريفها:

  1. Public Sub eventName(ParamArray Parameters())
  2. ' ...
  3. ' ...
  4. ' ...
  5. End Sub
  6.  

حيث eventName هو اسم الإجراء، مثلاً MyButtonClick أو MyTextBoxKeyPress أو ِAbcXyz أو أي اسم نريده.

لقد وضعت شرحاً مفصلاً - بالإنجليزي - ضمن الكود المرفق، و أنا على استعداد لأية توضيحات أخرى.

RunTimeControls.rar

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#7

والله يا أخوي يعجز اللسان عن شكرك ...

جزاك الله خير

:lol:

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…