اذهب الي المحتوي
أوفيسنا

سلسلة علمنى كيف اصطاد ( الفورم ) Forms


الردود الموصى بها

سادساً :- التعامل مع العناصر الموجوده داخل الــ  Frame بطرق احترافيه

فى البدايه يبدو ان العنوان غريب وغير مفهوم  خليك معايا خطوه خطوه هتفم يعنى ايه الكلام ده

شاهد الصوره التاليه 

large.300.png.66ceffc8ed389232586153c11c

 

دا فورم فى مرحلة التصميم وزى ما انتم شايفين يوجد زر اخضر اسمه Test  وهو عباره عن Label

ويوجد ايضا عدد 2 تكست بوكس وعدد 2 كمبو بوكس

المطلوب انا عايز اعمل كود عند الضغط على الزر الاخضر اثناء عمل الفورم  يقوم الكود بعمل اختبار للعناصراللى من النوع تكست بوكس هل هى فارغه ام بها بيانات 

اذا كانت فارغه يعطينى رساله باسم التكست وكمان يجعل لون التكست احمر

ازاى ننفذ الكلام ده 

اولا هو عايز الكود يتم تنفيذه عند الضغط على الزر الاخضر حلو اوى طيب الزر الاخضر ده عباره عن ايه ؟ شوف الصوره هتلاقى ان الخاصيه Name  هى Label1

اذن الكود هيكون كالتالى

Private Sub Label1_Click()
'مكان وضع الكود المراد تنفيذه
End Sub

ما هو الكود المراد تنفيذه ؟ هو اختبار العناصر هل هى من النوع تكست بوكس أم لا

واذا كانت من النوع تكست بوكس هل هى بها بيانات ام لا  

واذا تبين ان العنصر من نوع التكست بوكس ولا يوجد به بيانات اظهرلى رساله باسم العنصر وكمان اجعل العنصر لونه احمر 

أول شئ علشان اختبر كل العناصر اللى على الفورم واشوف نوعها اذن لازم اعرف متغير من نوع  Control لان انا هتعامل مع العناصر

Dim a As Control

هنا سميت المتغير اسم a  ( وطبعا يمكن تسمية اى اسم كيفا شئت )

وقلت اى المتغير  a  ده عباره عن عنصر تحكم ( قد يكون لليبل او تكست بوكس او كمبوبوكس او ليست بوكس او فريم او تشيك بوكس وغيرها من العناصر )

فعلشان الف على كل العناصر اللى موجوده على الفورم يبقى لازم الحلقه التكراريه  For Each

Private Sub Label1_Click()
Dim a As Control
For Each a In Me.Controls
' مكان اختبار العنصر اذا كان من النوع تكست بوكس وايضا هل هو فارغ من البيانات
Next a
End Sub

عملت حلقه  For Each للمتغير  a  وقلت ان a  ده هو عباره عن عنصر تحكم موجود على الفورم 

Me.Controls     

Me  هنا عايده على عناصر الفورم

ازاى بقى اعمل اختبار للعناصر هل هى من النوع تكست بوكس و هل هى بها بيانات ام لا 

اذن هستخدم     if    Then 

If TypeOf a Is msForms.TextBox And a = "" Then

End If

if   تعنى لو

الاختبار الاول هل العنصر من نوع التكست بوكس TypeOf a Is msForms.TextBox

TypeOf   تعنى نوع الــ

a   هو عنصر التحكم اللى بيتغير كل مره مع الحلقه For Each

is   يكون

msForms.TextBox    تكست بوكس 

الاختبار الثانى a = ""

and  تعنى (  و )  لعمل شرط ثانى

a = ""   عنصر التحكم فارغ 

Then  تعنى نفذ التالى   ( وطبعا قفلنا if  بــ  End if )

طيب لما الكود يختبر نوع العنصر ويلاقيه تكست بوكس وكمان يلاقيه فارغ ماذا ينفذ يجعل التكست بوكس لون الخلفيه احمر ويظهر لى رساله باسم العنصر 

If TypeOf a Is msForms.TextBox And a = "" Then
a.BackColor = 10200
MsgBox "فارغ يرجى تعبئة التكست" & a.Name
End If

 

شاهد الكود بشكله النهائى

Private Sub Label1_Click()
Dim a As Control
For Each a In Me.Controls
If TypeOf a Is msForms.TextBox And a = "" Then
a.BackColor = 10200
MsgBox "فارغ يرجى تعبئة التكست" & a.Name
End If
Next a
End Sub

هعملك مشهد تمثيلى لعمل الكود جوا دراما يعنى جايز الاقى فيكم مخرج يكتشفنى :wink2:

عند عمل الكود فى اول سطر هيخزن فى ذاكرته ان المتغير a  هو عنصر تحكم

ثم ياتى للسطر الثانى وهو For Each a In Me.Controls 

الحلقه هتجعل ان a   هى Label1 

هيروح للسطر اللى بعده يعمل اختبار بالــ if   فهيلاقى ان a اللى هى دلوقتى ( Label1)  مش من النوع تكست بوكس اذن متحققش الشرط الاول فهينتقل           الى End if  بدون ما ينفذ اى شئ

ثم ينتقل الى Next  وتعنى ارجع الى الحلقه For Each مره تانية

لما يرجع للحلقه سيكون a  فى هذه المره هى TextBox1  ثم ينتقل الى السطر التالى اختبار if

طبعا هيختبر نوع  TextBox1   هيلاقيه بالفعل من النوع TextBox تحقق اول شرط طيب هيشوف الشرط التانى هل التكست فارغ ام به بيانات اذا كان فارغ هيجعل لون خلفيته حمراء ويعطنى رساله باسمه 

ثم ينتقل الى Next  وتعنى ارجع الى الحلقه For Each مره تانية

لما يرجع للحلقه سيكون a  فى هذه المره هى ComboBox1 ثم ينتقل الى السطر التالى اختبار if

طبعا هيختبر نوع  ComboBox1 هيلاقيه مش من النوع ComboBox فلم يتحقق الشرط الاول  فهينتقل الى End if  بدون ما ينفذ اى شئ

ثم ينتقل الى Next  وتعنى ارجع الى الحلقه For Each مره تانية

وهكذا الى ان تنتهى الحلقه بعد ما تجعل a بكل العناصر اللى على الفورم  وينتهى الكود

شاهد هذه الصوره عند عمل الفورم والضغط على الزر الاخضر

large.301.png.193cbb29b171d7eee1a1ddef53

دى كانت مقدمه للمثال التالى وهو الاهم واللى اكيد هيقابلك لو انت هتصمم برامج اكيد هيقابلك المثال التالى

مثال 2 :-

شاهد الصوره التالية

large.302.png.387b6774f1ff5f144288a074c2

 

طبعا علشان اعمل كود فى حدث الليبل " الحفظ " هيكون الاعلان عن الكود كالتالى

Private Sub Label1_Click()
'اولا اختبار صحة الادخالات
'ثانيا ترحيل البيانات التى تم تعبئتها من قبل المستخدم الى الشيت
End Sub

 

انا موضوعى اليوم هو اولا اختبار صحة البيانات  المدخله 

أما الجزء الخاص بترحيل البيانات الى الشيت مش موضوعى اليوم سنتناوله لاحقا باذن الله

اولا اختبار صحة البيانات  المدخله 

لو رجعت للصوره السابقه هتلاقى ان المطلوب اختبار كل عناصر التكست بوكس هل تم ملئ الدرجات بها ام لا

وزى ما عرفنا قبل كدا ممكن تكون كالتالى

Private Sub Label1_Click()
If TextBox1 = "" Then
TextBox1 .BackColor = 10200
End If
If TextBox2 = "" Then
TextBox2 .BackColor = 10200
End If
End Sub

يعنى هختبر كل عنصر بالشكل ده طبعا مستحيل طيب هتعمل ايه لو كان عندك مثلا 100 تكست بوكس او اكتر ؟؟؟؟؟؟

طبعا لو عملت كدا محتاج 100 صفحه علشان تكتب الكود  مش منطق طبعا اذن لازم من حل احترافى 

شاهد  الكود بشكل احترافى فى بضعه اسطر وبعدين نشرحه

Private Sub Label1_Click()

Dim a As Control
For Each a In Frame1.Controls

If TypeOf a Is msForms.TextBox And a = "" Then
a.BackColor = 10200
End If

If TypeOf a Is msForms.ComboBox Then
If a.MatchFound = False Then
a.BackColor = 10200
End If
End If

Next a

'ثانيا كود ترحيل البيانات التى تم تعبئتها من قبل المستخدم الى الشيت

End Sub

 

الكود فى المثال السابق كانت حلقة  For Each عباره عن  For Each a In Me.Controls ( هنا كان المتغير a  يمثل كل العناصر على الفورم لذالك استخدمت  Me.Controls  وقلت ان Me  عائده على الفورم النشط 

لكن فى الكود الحالى انا عايز اتعامل مع العناصر اللى داخل الــ  Frame1   فقط  فتم كتابة الحلقه  كالتالى

 عباره عن For Each a In Frame1.Controls  فهنا a  هتكون كل عنصر من العناصر اللى داخل الفريم فقط

واحد صاحى معايا هيلاحظ ان لما استخدمت If لاختبار ان العنصر من النوع تكست بوكس 

تم استخدام شرط التحقق من نوع العنصر انه تكست بوكس وشرط ان العنصر فارغ فى سطر واحد من خلال And  شاهد الكود

If TypeOf a Is msForms.TextBox And a = "" Then
a.BackColor = 10200
End If

 

ولكن

عند استخدام if  لاختبار ان العنصر من النوع كمبوبوكس وان الاختيار تم من القائمه 

تم استخدام if  لاختبار شرط التحقق من نوع العنصر اذا كان  كمبوبوكس يتم تنفيذ if اخرى وكتابة الشرط الثانى ان الاختيار تم من القائمه شاهد الكود

If TypeOf a Is msForms.ComboBox Then
If a.MatchFound = False Then
a.BackColor = 10200
End If
End If

فى حد عنده تفسير لذالك ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

ليه مكتبناش اختبار ان نوع العنصر كمبوبوكس وان الاختيار تم من القائمة فى سطر واحد من خلال And مثل التكست بوكس يعنى يكون كدا

If TypeOf a Is msForms.ComboBox And a.MatchFound = False Then
a.BackColor = 10200
End If

هقولك انا ما هو السبب

الحلقه For Each لما تشتغل هيكون اول مره a كل مره تمثل عنصر من عناصر التحكم داخل الفريم

فهيكون أما ليبل أو تكست بوكس أو كمبوبوكس كما هو بمثالنا فى الصوره السابقه موضوع الشرح

لما تشتغل If الاولى 

If TypeOf a Is msForms.TextBox And a = "" Then
a.BackColor = 10200
End If

فعندما يكون a عباره عن Label 

                                            " " = a

                                            " " =Label1

فلا يوجد مشكله لان Label  ممكن = فارغ

--------------------------------------

فعندما يكون a عباره عن TextBox

                                            " " = a

                                            " " =TextBox1

فلا يوجد مشكله لان TextBoxممكن = فارغ

--------------------------------------

فعندما يكون a عباره عن ComboBox

                                            " " = a

                                            " " =ComboBox1

فلا يوجد مشكله لان ComboBox ممكن = فارغ

--------------------------------------

لما تشتغل If الثانيه

If TypeOf a Is msForms.ComboBox And a.MatchFound = False Then
a.BackColor = 10200
End If

فعندما يكون a عباره عن Label 

                                               a.MatchFound = False 

                                               Label.MatchFound = False

فهنا يوجد مشكله لان Label  ليس من خواصه MatchFound وكذالك TextBox

لان MatchFound  هى من خواص ComboBox  فقط وهى لعمل اختبار هل الاختيار تم من القائمه ام لا

لذالك مينفعش نعمل الكود بالشكل ده هيحدث Error ولتجنب  Error  لازم يكون الكود بالشكل التالى

If TypeOf a Is msForms.ComboBox Then
If a.MatchFound = False Then
a.BackColor = 10200
End If
End If

يعنى اختبر العنصر هل هو ComboBox أولا أم لا اذا كان من النوع ComboBox  اعمل اختبار عليه وهو هل تم الاختيار من القائمه أم لا 

واذا كان العنصر من النوع Label أو TextBox متعملش اختبار MatchFound  

ارجوا ان يكون الشرح واضح هو بس محتاج تركيز شويه

شاهد الكود مره تانية بشكله النهائى كالتالى

Private Sub Label1_Click()

Dim a As Control
For Each a In Frame1.Controls

If TypeOf a Is msForms.TextBox And a = "" Then
a.BackColor = 10200
End If

If TypeOf a Is msForms.ComboBox Then
If a.MatchFound = False Then
a.BackColor = 10200
End If
End If

Next a

'ثانيا كود ترحيل البيانات التى تم تعبئتها من قبل المستخدم الى الشيت

End Sub

 

شاهد الصوره التاليه عند تشغل الفورم والضغط على زر الحفظ

large.303.png.441345763b3778e4dca9d9c987

 

طبعا انت ممكن تغير فى الكود بدل ما ينفذ بجعل الخلفيه لونها احمر a.BackColor = 10200 

ممكن تغير اى شئ تريد تنفيذه يعنى مثلا يعطى للمستخدم رساله باسم العنصر اللى فيه خطأ زى كدا

Private Sub Label1_Click()

Dim a As Control

For Each a In Frame1.Controls

If TypeOf a Is msForms.TextBox And a = "" Then
MsgBox a.Name & " برجاء تعبئة بيانات"
End If

If TypeOf a Is msForms.ComboBox Then
If a.MatchFound = False Then
MsgBox a.Name & " برجاء تعبئة بيانات"
End If
End If

Next a

'ثانيا كود ترحيل البيانات التى تم تعبئتها من قبل المستخدم الى الشيت

End Sub

شاهد الصوره التاليه عند تشغل الفورم والضغط على زر الحفظ

 

large.304.png.b88a85a769ea8389d000e854c3

 

------------------------------------------------------------------------------------------------------------------------------------

الى لقاء اخر من حلقات سلسلة علمنى كيف اصطاد

 انتظرونا

:fff::fff:تقبلوا تحياتى :fff::fff:

 

تم تعديل بواسطه الصـقر
  • Like 14
رابط هذا التعليق
شارك

  • 3 months later...

اريد برنامج محاسبي ضخم 
يحتوي علي فهرس حسابات , فواتير بيع , فواتير شراء , فواتير مصاريف , عمل قيد محاسبي 
حيث ان معظم الفواتير نسبة الضريبة عليها 17% والضريبة الفعلية 16 % وسوف يتم تحويلها تلقائي 
حيث تعتمد القيمة المضافة علي فواتير المصاريف وفواتير البيع 
ارجو مساعدتي 

رابط هذا التعليق
شارك

في ٢٠‏/٣‏/٢٠١٦ at 19:10, ام ليا said:

اريد برنامج محاسبي ضخم 
يحتوي علي فهرس حسابات , فواتير بيع , فواتير شراء , فواتير مصاريف , عمل قيد محاسبي 
حيث ان معظم الفواتير نسبة الضريبة عليها 17% والضريبة الفعلية 16 % وسوف يتم تحويلها تلقائي 
حيث تعتمد القيمة المضافة علي فواتير المصاريف وفواتير البيع 
ارجو مساعدتي 

الاخت الكريمه ام ليا

نورتى منتدانا الغالى اوفيسنا

بس برجاء فتح موضوع جديد باستفسارك لان هذا الموضوع شرح اساسيات للتعامل مع اليوزر فورم

يوجد هنا برنامج لاخينا الصقر ابحثى عنه سيفيدك ان شاء الله  اسمه تقريبا MME

اذا لاقيته هبعتهولك

 تقبلى التحيه والتقدير تمنياتى لكى بالتوفيق

رابط هذا التعليق
شارك

  • 2 weeks later...
في ٢٠‏/٣‏/٢٠١٦ at 19:10, ام ليا said:

اريد برنامج محاسبي ضخم 
يحتوي علي فهرس حسابات , فواتير بيع , فواتير شراء , فواتير مصاريف , عمل قيد محاسبي 
حيث ان معظم الفواتير نسبة الضريبة عليها 17% والضريبة الفعلية 16 % وسوف يتم تحويلها تلقائي 
حيث تعتمد القيمة المضافة علي فواتير المصاريف وفواتير البيع 
ارجو مساعدتي 

اتفضلى الرابط اللى اشرت اليكى به

http://www.officena.net/ib/topic/55858-برنامج-ema-أهداء-الى-كل-أساتذتى-واخوانى-واخواتى-بالمنتدى/

بالتوفيق

رابط هذا التعليق
شارك

  • 6 months later...

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

جزيت الجنة اخي الكريم و ادخلنا معك ان شاء الله تعالى

لدي سؤال

كيف اجعل الفورم يضيف تكست بوكس او ليبل بعد امتلاء الي قبلو متل لو عندي فاتورة و كل ما ضفت عميل يضيف ليبل لعميل اخر متل اللي يصير ببرنامج الاكسس  اتمنى يكون سؤالي واضح

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

رابط هذا التعليق
شارك

  • 1 year later...
  • 3 weeks later...
  • 4 months later...
زائر
هذا الموضوع مغلق.
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information