السلام عليكم...
شكراً للأخ AL_BRNS الذي سبق بالإجابة.
إذا كنت تعرف مسبقاً ما هي المكونات التي تريد إنشاء نسخ منها أثناء التشغيل (أي بالكود) فإن أسهل طريقة هي استعمال مصفوفة المكونات (Control Array) أي مجموعة مكونات من نوع واحد (مثلاً CommandButton أو TextBox) و تنتمي لمصفوفة تحمل نفس الاسم و يميزها رقم المؤشر (Index).
لإنشاء مصفوفة مكونات استعمل إحدى طريقتين:
أ. بضط الخاصية Index:
1. ضع أول عنصر (مثلاً CommandButton) على الـ Form (نفرض أن اسمه سيكون Command1).
2. في الخاصية Index لـ Command1 اكتب 0 (صفر).
ستقوم VB تلقائياً بإنشاء مصفوفة مكونات اسمها Command1 و يصبح اسم أول عنصر فيها هو:
ب. بالنسخ:
1. بعد وضع الـ Command1 على الـ Form انقر عليه بالزر الأيمن و انسخه (Copy أو اضغ Ctrl+C).
2. انقر على الـ Form بالزر الأيمن و ألصق (Paste أو اضغط Ctrl+V). ستسألك VB ما إذا كنت تريد إنشاء مصفوفة مكونات (Control Array) فأجب بنعم.
ستقوم VB تلقائياً بإنشاء مصفوفة مكونات اسمها Command1 و يصبح اسما أول عنصرين فيها هما:
كود :
Command1(0)
Command1(1)
* المفهوم من سؤالك أنك لا تريد وجود المكونات مسبقاً. استعمل الطريقة الأولى. أي بعد وضع مكون واحد اضبط الخاصية Index التابعة له على 0. و لكي لا يكون مرئياً بشكل مبدئي أثناء التشغيل اضبط الخاصية Visible التابعة له على False.
* في بداية الكود (في قسم التصريحات العام) عرف متغيراً كعداد، و اكتب إجراءاً لتحميل زر جديد:
كود :
Private ButtonCount As Integer
Private Sub CreateNewButton(ACaption As String, ALeft As Single, ATop As Single, AWidth As Single, AHeight As Single, ATag As String)
ButtonCount = ButtonCount + 1
Load Command1(ButtonCount)
With Command1(ButtonCount)
.Caption = ACaption
.Move ALeft, ATop, AWidth, AHeight
.Tag = ATag
.Visible = True
End With
End Sub
* عندما تريد إنشاء مكون جديد (CommandButton في هذا المثال) قم باستدعاء الإجراء السابق (في زر آخر أو في أمر قائمة أو حيثما تريد):
كود :
CreateNewButton "new_caption", new_left, new_top, new_width, new_height, "new_tag"
* استعملنا الخاصية Tag لنضع بها قيمة تميز الأزرار عن بعضها لغرض الكود.
مثلاً لنفرض أننا نريد إنشاء 3 أزرار تحرير (قص، نسخ، لصق):
كود :
CreateNewButton "Cut", 50, 50, Command1(0).Width, Command1(0).Height, "cut"
CreateNewButton "Copy", 50, 120, Command1(0).Width, Command1(0).Height, "copy"
CreateNewButton "Paste", 50, 190, Command1(0).Width, Command1(0).Height, "paste"
* كيف نجعل هذه الأزرار تنفذ عملاً ما؟
ننقر نقراً مزدوجاً على الزر الأصلي لفتح الكود على إجراء الحدث Click ستلاحظ أن له بارامتراً اسمه Index يشير إلى رقم الزر في مصفوفة المكونات (إذا لم يكن الزر عنصراً في مصفوفة مكونات فلن يكون لإجراء الحدث Click أية بارامترات). إذا كنا نعرف رقم مؤشر المكون الذي نتعامل معه فيمكننا استعمال البارامتر Index و لكننا - في هذا المثال - لا نعرف، و بالتالي سنستعمل الخاصية Tag كما ذكرنا سابقاً:
كود :
Private Sub Command1_Click(Index As Integer)
Select Case Command1(Index).Tag
Case "cut"
' كود القص
Case "copy"
' كود النسخ
Case "paste"
' كود اللصق
End Select
End Sub
* الطريقة الثانية طويلة بعض الشيء و تحتاج إلى استعمال الـ Class Modules.
نرجو الاستفادة و السلام.