تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس العاشر - تصميم شاشة عرض البضائع - العرض والتحديد
#1
كاتب الموضوع : أحمد جمال

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



تصميم شاشة عرض البضائع .

ملحوظة هامة للغاية : هذا الدرس هو الدرس الأكبر والأهم في هذه السلسلة وباقي الدروس سوف تعتمد بنسبة كبيرة على ما فهمناه سوية هنا ، لذا لا تستصعب الأمر وخذ وقتك في فهم الدرس .



في هذا الدرس سوف نبدأ بعمل شاشة عرض البضائع ، وكما هي العادة عند التصميم فإن كل منا يصمم كما يحلو له ... لكن لا تنس أننا لا بد أن نشترك في المحتويات الرئيسية وهي :


قائمة في الأعلى لاختيار البضائع .
جدول لعرض جميع البضائع الموجودة .
مربعات نص لعرض البضاعة المختارة حالياً .


أزرار أوامر للتعديل والحذف ، وزرين لعملية بيع أو شراء تتصل بالشاشة الخاصة بها والتي سنقوم بعملها عندما يأتي دورها .
وأخيراً تتعين كأحد أبناء Children للفورم MDIForm وذلك عن طريق ضبط خاصية MDIChild = True .

لاضافة الجدول اضغط Ctrl+T واختر Microsoft Flex Grid 6.0 واخترنا هذا الجدول لامكانية التحكم المطلق به ، حيث نقوم بعمل كل شيء فيه ، وحتى لو أردنا عمل DBGrid متطور باستخدامه فسيمكننا ذلك .

لاظهار الشاشة من خلال القائمة نكتب الأمر التالي :



كود :
[align=right]Case 0
If T1.RecordCount = 0 Then
MsgBox " لا توجد أي بضائع لعرضها ، لاضافة بضاعة جديدة اختر اضافة - اضافة بضاعة ", vbExclamation + arabic, "عرض البضائع"
Exit Sub
End If
Frm_Show.Show[/align]

لو ظل الفورم على تصميمه القديم من حيث
BorderStyle=2 فستلاحظ تغير حجم الشاشة - ولكن لو ضبطت الخاصية إلى 1 فلن تحدث هذه المشكلة .

لن ننسى اضافة السطرين التاليين ، حيث يقومان بتوسيط الفورم كما فعلنا مع Frm_Info ، لذلك سنضيفهما في حدث Load للفورم :



كود :
[align=right]Frm_Show.Left = ((MDIForm1.Width - Frm_Show.Width) / 2)
Frm_Show.Top = ((MDIForm1.Height - Frm_Show.Height) / 2) - 800[/align]
لنبدأ الآن سوية في تصميم اجراء Refresh_Me والذي ينطلق عند تشغيل الفورم Form_Load ، وعند كل عملية حذف أو تعديل .

بما أن لدينا كائن T1 يحتوي على معلومات البضائع ، فلم لا نقوم بالدوران على هذا الكائن من البداية إلى النهاية ووضع الاسماء فيه إلى القائمة :



كود :
[align=right]Sub Refresh_Me()
Combo1.Clear
If T1.RecordCount <> 0 Then
T1.MoveFirst
For i = 0 To T1.RecordCount - 1
Combo1.AddItem T1!Name
T1.MoveNext
Next i
End If[/align]

هذا ولكي تعرض البضائع في هذه القائمة مرتبة أبجدياً فإننا نضبط خاصية Sorted للقائمة لتساوي True .

والآن فإننا وبنفس طريقة عرض البيانات في القائمة نريد لكامل البيانات أن تعرض في الجدول ، ولذا سوف نضعهم جميعاً داخل حلقة تكرار واحدة تقليلاً للجهد على الذاكرة . ولكنني أريد أن أشرح كيفية اضافة بيانات في MSFlexGrid .



واجمالاً: توجد خاصيتين على قدر كبير من الأهمية هما Col و Row واللتان تحددان في نقطة التقاءهما خلية Cell لها خصائص أشهرها Text لعرض النص فيها .

هناك أيضاً خاصيتي Rows و Cols واللتان تحددان عدد الصفوف والأعمدة في الجدول ، ووظيفة Clear والتي تقوم بمسح كافة محتويات الجدول .

سوف نقوم بعمل اجراء نسمية Create_Flex وذلك لتهيئة الجدول لنتعامل معه ، يحتوي هذا الأجراء على وضع عدد الأعمدة = 7 ، الصفوف = عدد السجلات + 1 ، ونضيف التعبيرات المناسبة على رأس كل جدول .
لعمل المهمتين الأولتين :



كود :
[align=right]MSFlexGrid1.Clear
MSFlexGrid1.Cols = 7
MSFlexGrid1.Rows = T1.RecordCount + 1[/align]
أما للمهمة الثانية فسوف نتنقل بين الأعمدة ، ونضع على رأس كل عمود القيمة المناسبة له :



كود :
[align=right]MSFlexGrid1.Row = 0
MSFlexGrid1.Col = 0
MSFlexGrid1.Text = "ت"
MSFlexGrid1.Col = 1
MSFlexGrid1.Text = "رقم"
MSFlexGrid1.Col = 2
MSFlexGrid1.Text = " اسم البضاعة"
MSFlexGrid1.Col = 3
MSFlexGrid1.Text = "النوع"
MSFlexGrid1.Col = 4
MSFlexGrid1.Text = "المصنع"
MSFlexGrid1.Col = 5
MSFlexGrid1.Text = "السعر"
MSFlexGrid1.Col = 6
MSFlexGrid1.Text = "العدد"
MSFlexGrid1.Col = 7
MSFlexGrid1.Text = "وحدة/صندوق"[/align]

ولكن ماذا عن توسيط الأعمدة ... نستطيع ذلك من خلال كود كالتالي :



كود :
[align=right]MSFlexGrid1.ColAlignment(0) = 5
MSFlexGrid1.ColAlignment(1) = 3
MSFlexGrid1.ColAlignment(2) = 5
MSFlexGrid1.ColAlignment(3) = 5
MSFlexGrid1.ColAlignment(4) = 5
MSFlexGrid1.ColAlignment(5) = 5
MSFlexGrid1.ColAlignment(6) = 5[/align]
حيث أن 5 ترمز للمنتصف ، أما 3 فترمز إلى المحاذاة إلى اليمين .
نفس الأمر بالنسبة لعرض كل عمود ... ولن نغير سوى في عرض الأعمدة التي لا يناسبنا حجمها الافتراضي وهي الأول ( تسلسل ) والثاني ( اسم البضاعة ) والثالث والرابع ( النوع - المصنع ) :



كود :
[align=right]MSFlexGrid1.ColWidth(0) = 500
MSFlexGrid1.ColWidth(1) = 1500
MSFlexGrid1.ColWidth(2) = 1500
MSFlexGrid1.ColWidth(3) = 1500[/align]
وسوف نستدعي هذا الإجراء في بداية Refresh_Me .
ولكن ماذا عن تعبئة الجدول داخل حلقة التكرار ، في الواقع بنفس الطريقة التي كتبنا بها رؤوس الأعمدة سوف نكتب القيم الأخرى ، إلا أن رقم الصف سوف يصبح قيمة المتغير i+1 .
ومن ذلك نستطيع أن نحصل على كود اجمالي لدالة Refresh_Me - مؤقتاً - .



كود :
[align=right]Sub Refresh_Me()
Combo1.Clear
Create_Flex
If T1.RecordCount <> 0 Then
T1.MoveFirst
For i = 0 To T1.RecordCount - 1
MSFlexGrid1.Row = i + 1
MSFlexGrid1.Col = 0
MSFlexGrid1.Text = T1!Number
MSFlexGrid1.Col = 1
MSFlexGrid1.Text = T1!Name
MSFlexGrid1.Col = 2
MSFlexGrid1.Text = T1!Category
MSFlexGrid1.Col = 3
MSFlexGrid1.Text = T1!Factory
MSFlexGrid1.Col = 4
MSFlexGrid1.Text = T1!price
MSFlexGrid1.Col = 5
MSFlexGrid1.Text = T1.Fields("Count")
MSFlexGrid1.Col = 6
MSFlexGrid1.Text = T1!Box_Count

Combo1.AddItem T1!Name
T1.MoveNext
Next i
End If
End Sub[/align]

لاحظ أنني استخدمت طريقة ثانية في القراءة مع الحقل Count ذلك أنه ينبغي أن يوضع بين علامتي تنصيص لأنها كلمة محجوزة في الفيجوال بيسك .



يتبع ...
}}}
تم الشكر بواسطة:
#2
ترتيب البضائع في الجدول .

بالتأكيد قد مر بك هذان الأمران خلال الدروس سابقاً :



كود :
[align=right]MSFlexGrid1.ColAlignment(0) = 5

MSFlexGrid1.Col = 6
MSFlexGrid1.Text = T1!Box_Count[/align]
ذكرت بهذين الامرين فقط لتدرك أننا حينما نريد تطبيق جميع خصائص التنسيق على هذه الأداة فإننا نستخدم أحد طريقتين - حسب الخاصية فإما إن نذكر اسم الأداة MSFlexGrid1 ثم الخاصية ، وأخيراً نضع رقم هذا العمود بين قوسين ، أو نذكر رقم العمود أو الصف - أو كليهما - ثم نطبق عليه هذه الخاصية وهو مثل خاصية Sort والتي تقوم بالترتيب ، لذا فلترتيب الحقول حسب عمود الاسم فإننا نكتب الكود التالي :



كود :
[align=right]MSFlexGrid1.Col = 1
MSFlexGrid1.Sort = 7[/align]
ومعنى الرقم 7 واضح لمن اطلع على الدرس على الرابط السابق ...

ولكن ربما تكون قد لاحظت ان الأرقام لم تعد مرتبة ، هل هذا صحيح ؟
حل هذه المشكلة أن نضع عداداً جديداً كلياً وصفاً جديداً آخراً يحتوي على التسلسل غير الرقم ، فلنر كيف نقوم بذلك .
أولاً قم بزيادة عدد الأعمدة بمقدار عمود واحد ... أيضاً قم بتحويل رقم كل عمود إلى الرقم + 1 .
قم بذلك وشاهد النتيجة ، ستجد ظهور صف فارغ على اليمين من الجدول .
سنغير الآن من اسم عمود الرقم ليصبح ( الرقم ) فيما يصبح العمود الجديد ( ت ) .

لاحظ أننا لن نقوم خلال الدوران بعملية تعبئه هذا العمود بالأرقام ، بل إن ذلك سوف يتم بعد الانتهاء من ترتيبها ، وإلا فلن نستفيد شيئاً - جرب وضعهما سوية وراقب ما يحدث - .


ولذلك نضع الكود التالي بعد الترتيب :



كود :
[align=right]MSFlexGrid1.Col = 0
For i = 0 To T1.RecordCount - 1
MSFlexGrid1.Row = i + 1
MSFlexGrid1.Text = i + 1
Next i[/align]
وضع أسماء الموردين والأنواع بدلاً من أرقامها .

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



كود :
[align=right]MSFlexGrid1.Col = 3
MSFlexGrid1.Text = T1!Category
MSFlexGrid1.Col = 4
MSFlexGrid1.Text = T1!Factory[/align]
وسنرى الآن كيف نقوم بهذه المهمة .
هل تتذكر كيف قمنا بفتح قاعدة T1 في البداية :



كود :
[align=right]Set T1 = D1.OpenRecordset("Tb_Product", dbOpenTable)[/align]
لكننا لا نحتاج إلى فتحها بهذه الطريقة ، بل إننا نريد أن نقوم بفتح قاعدة بجملة استعلام للعلاقات التي بين الجداول ، لهذا الغرض سوف نستخدم T4 وذلك بالشكل التالي :



كود :
[align=right]SQL = "select tb_product.*,tb_category.*,tb_factory.* from tb_product,tb_factory,tb_category where tb_product.category=tb_category.number and tb_product.factory=tb_factory.number"
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)[/align]

تقوم جملة الاستعلام هذه باستخراج جميع المعلومات من الجداول الثلاثة مع دمج كل معلومات المصانع والأنواع جنباً إلى جنب مع معلومات البضائع ، ولتتكون لديك نظرة أكثر تركيزاً قم بتجربة هذه الجملة في Access .

وإذا كنت تود معرفة المزيدعن مثل هذه الجمل ، وكيف تمت كتابتها ، فبامكانك مراجعة الدروس الخاصة بجمل الاستعلام على هذا الرابط :

http://vb4arb.com/vb/forumdisplay.php?31


وسيوضع هذا الأمر في حدث Refresh_Me .

الآن لا تنس أن تقوم بتحويل كل T1 إلى T4 في جميع هذه النافذة .
والآن لنر أسماء لحقول مثل Number و Name فإننا عندما نضعها فأيهما نقصد ، هل تلك التي في جدول البضائع أم التي في جدول المصانع أم الأنواع ، لذا فإننا لا بد أن نذكر مكان الحقل قبل اسمه ، ومن أجل ذلك أيضاً فإننا نغير أسلوب العرض من T1!Name إلى



كود :
[align=right]T1.Fields("Tb_Product.name")[/align]
وكذا الأمر بالنسبة لحقل Number .

الهدف الأول من هذه العمليةهو عرض اسم المصنع والنوع بدلاً من رقمه ولذا سنحول أول كود ذكرناه في هذا الدرس إلى الشكل التالي :



كود :
[align=right]MSFlexGrid1.Col = 3
MSFlexGrid1.Text = T4.Fields("tb_category.name")
MSFlexGrid1.Col = 4
MSFlexGrid1.Text = T4.Fields("tb_factory.name")[/align]
أيضاً لا تنس أن تغلق T4 بنهاية هذه الدالة .


يتبع ...
}}}
تم الشكر بواسطة:
#3
عرض السجل الذي تم النقر عليه في مربع النص والقائمة .


بما أننا نريد أن نعرض بيانات أي حقل بمجرد النقر عليه ، فإننا نحتاج بمجرد النقر عليه للحصول على رقمه ، ولنر سوية هذا الامر .
عندما انقر على أي خلية فإن خاصيتي Col و Row يتم ضبطهما طبقاً للوضع الجديد ، وبهذه الطريقة تستطيع الحصول على رقم الصف والعمود بعد أي نقرة باضافة الأمر التالي في حدث Click للجدول :

MsgBox "Row : " & MSFlexGrid1.Row & " Col : " & MSFlexGrid1.Col

وبنفس الطريقة يمكننا الحصول على محتويات الخلية التي قمنا بالنقر عليها بواسطة أمر كهذا :



كود :
[align=right]MsgBox MSFlexGrid1.Text[/align]
ولكننا لا نريد محتويات هذه الخلية ، بل إننا نحتاج محتويات خلية الرقم في نفس الصف للبحث عنها وعرضها ... لذا فإننا نقوم بالتحول إلى خلية الرقم :



كود :
[align=right]MSFlexGrid1.Col = 1
MsgBox MSFlexGrid1.Text[/align]

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


سنبدأ الآن بكتابة جملة استعلام نبحث من خلالها عن السجل الذي له هذا الرقم ، تذكر أننا سوف نقوم بذلك من خلال استعلام مزدوج لأننا نريد معرفة اسم المصنع والنوع وليس أرقامهما ، لذلك سوف يكون مثل الاستعلام في الدرس السابق لكن مع اضافة شرط آخر ل Where بحيث يصبح and Number = MSFlexGrid1.Text حيث أننا لا نريد سوى سجل واحد فقط .



كود :
[align=right]SQL = "select tb_product.*,tb_category.*,tb_factory.* from tb_product,tb_factory,tb_category where tb_product.category=tb_category.number and tb_product.factory=tb_factory.number and tb_product.number =" & MSFlexGrid1.Text & ""[/align]

وبنفس طريقة الجدول سوف نضع البيانات المناسبة في مربعات النص :



كود :
[align=right]If T4.RecordCount <> 0 Then
T4.MoveFirst

Text7.Text = T4.Fields("tb_product.Number")
Text1.Text = T4.Fields("tb_product.name")
Text2.Text = T4.Fields("tb_category.name")
Text3.Text = T4.Fields("tb_factory.name")
Text4.Text = T4!price
Text5.Text = T4.Fields("Count")
Text6.Text = T4!Box_Count[/align]


وماذا أيضاً ... نحتاج لأن تشير القائمة إلى البضاعة الحالية ، وبما أننا نتعامل في القائمة مع Tb_Product.name فسيصبح الأمر بالشكل التالي :



كود :
[align=right]Combo1.Text = T4!.Fields("tb_product.name")[/align]
ولكن بما أننا سنستخدم هذا الأمر لاحقاً فسوف نضعه في اجراء جديد ونسميه ShowData ... وبذلك يصبح الأمر بالشكل التالي :



كود :
[align=right]Private Sub ShowData()
Text7.Text = T4.Fields("tb_product.Number")
Text1.Text = T4.Fields("tb_product.name")
Text2.Text = T4.Fields("tb_category.name")
Text3.Text = T4.Fields("tb_factory.name")
Text4.Text = T4!price
Text5.Text = T4.Fields("Count")
Text6.Text = T4!Box_Count
End Sub[/align]
أخيراً لا تنس أن تغلق قاعدة البيانات T4 .


ثمة أمر آخر ، وهو أننا نريد أيضاً عند اختيار اسم من القائمة أن يظهر في مربعات النصوص ، لذلك بنفس الطريقة السابقة في الاستعلام سوى أننا لن نبحث بدلالة الرقم بل بدلالة الاسم ، ولذا سنضع الاسم بين علامتي تنصيص مفردة ' ' .



كود :
[align=right]Private Sub Combo1_Click()
SQL = "select tb_product.*,tb_category.*,tb_factory.* from tb_product,tb_factory,tb_category where tb_product.category=tb_category.number and tb_product.factory=tb_factory.number and tb_product.name ='" & Combo1.Text & "'"
Set T4 = D1.OpenRecordset(SQL, dbOpenDynaset)

If T4.RecordCount <> 0 Then
T4.MoveFirst
Call ShowData
End If

T4.Close
End Sub[/align]

ما زالت أمامنا خطوة واحدة ، وهو عند حدث البداية للفورم ، فما هي المحتويات التي ستظهر في مربعات النصوص ... مثلاً سوف تكون عن أول بضاعة ، لذا فسوف نضع الأمر التالي :



كود :
[align=right]Combo1.ListIndex = 0[/align]
وبالتالي سوف ينفذ حدث Click للقائمة تلقائياً .


حل آخر لنقل المعلومات إلى مربعات النص عند النقر على الجدول .

بالتأكيد أنت لا زلت تتذكر الطريقة التي عرضنا فيها البيانات عند النقر على الجدول ، وكانت اجمالاً بالشكل التالي :

ولو لاحظت أننا نضع البيانات الموجودة في الجدول ... أليس كذلك ؟
إذاً فلماذا نقوم بعملية استعلام رغم أن بإمكاننا قراءة المعلومات من الجدول .
في الطريقة السابقة كنا نقرأ الرقم فقط بالكود التالي :



كود :
[align=right]MSFlexGrid1.Col = 1[/align]
لكننا في نفس الوقت نستطيع الانتقال إلى العمود الثاني والثالث والرابع وحتى الأخير ووضع المعلومات بهم في مربعات النصوص ... انظر الكود التالي :



كود :
[align=right]MSFlexGrid1.Col = 1
Text7.Text = MSFlexGrid1.Text
MSFlexGrid1.Col = 2
Text1.Text = MSFlexGrid1.Text
MSFlexGrid1.Col = 3
Text2.Text = MSFlexGrid1.Text
MSFlexGrid1.Col = 4
Text3.Text = MSFlexGrid1.Text
MSFlexGrid1.Col = 5
Text4.Text = MSFlexGrid1.Text
MSFlexGrid1.Col = 6
Text5.Text = MSFlexGrid1.Text
MSFlexGrid1.Col = 7
Text6.Text = MSFlexGrid1.Text[/align]
هل يبدو الأمر سهلاً ؟ عموماً لك مطلق الحرية في استخدام ما تراه مناسباً وقد أرفقت الكودين في البرنامج لاختيار ما تريد .

وماذا بعد ؟ تخيل أن مربعات النصوص لدينا بها خاصية

Index تبدأ من 0 وتنتهي بـ 6 ولهم جميعاً اسم Text1 .

هل تستطيع تخيل مدى بساطة الكود السابق في هذه الحالة :



كود :
[align=right]For i = 0 To 7
MSFlexGrid1.Col = i + 1
Text1.Text(i) = MSFlexGrid1.Text
Next i[/align]
لكن هذا الأمر لن يناسبنا في هذه الشاشة لأننا قمنا بعمل مربعات النصوص Text1,Text2,......,Text7 . ولكننا سوف نتذكر ذلك في تصميم الشاشات القادمة .


سيتم ارفاق الملف بعد الدرس المقبل ...

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

}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الدرس الرابع والثلاثون والأخير - نبذة عن العملية العكسية + تجهيز البرنامج على Cd RaggiTech 0 11,110 15-10-12, 09:10 AM
آخر رد: RaggiTech
  الدرس الثالث والثلاثون - كيفية عمل اعداد Setup للبرنامج RaggiTech 0 3,979 15-10-12, 09:08 AM
آخر رد: RaggiTech
  الدرس الثاني والثلاثون - التحويل إلى exe RaggiTech 0 4,065 15-10-12, 09:07 AM
آخر رد: RaggiTech
  الدرس الحادي والثلاثون - تعددية المستخدمين - البحث وطباعة الفواتير - التعليمات ... RaggiTech 2 4,951 15-10-12, 09:05 AM
آخر رد: RaggiTech
  الدرس الثلاثون - التعامل مع شريط الأدوات ToolBar RaggiTech 0 3,822 15-10-12, 08:59 AM
آخر رد: RaggiTech
  الدرس التاسع والعشرون - التعامل مع أشرطة الحالة Statues Bar RaggiTech 0 3,602 15-10-12, 08:57 AM
آخر رد: RaggiTech
  الدرس الثامن والعشرون -الطباعة في البرنامج . RaggiTech 4 5,293 15-10-12, 08:56 AM
آخر رد: RaggiTech
  الدرس السابع والعشرون - مقدمة إلى التعامل مع التقارير من خلال DataReport RaggiTech 2 6,106 15-10-12, 08:45 AM
آخر رد: RaggiTech
  الدرس السادس والعشرون - التقارير اليومية ، والتقارير بين تاريخين RaggiTech 1 4,347 15-10-12, 08:39 AM
آخر رد: RaggiTech
  الدرس الخامس والعشرون - الإحصائيات والرسوم البيانية RaggiTech 0 3,766 15-10-12, 08:37 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم