![]() |
|
الدرس العاشر - تصميم شاشة عرض البضائع - العرض والتحديد - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : الأقسام التعليمية - المنتدى القديم (http://vb4arb.com/vb/forumdisplay.php?fid=90) +--- قسم : قسم دورات المنتدى (http://vb4arb.com/vb/forumdisplay.php?fid=113) +---- قسم : دورة بناء برنامج لإدارة السوبر ماركت من الألف إلى الياء (http://vb4arb.com/vb/forumdisplay.php?fid=128) +---- الموضوع : الدرس العاشر - تصميم شاشة عرض البضائع - العرض والتحديد (/showthread.php?tid=5698) |
الدرس العاشر - تصميم شاشة عرض البضائع - العرض والتحديد - RaggiTech - 15-10-12 كاتب الموضوع : أحمد جمال
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته . تصميم شاشة عرض البضائع . ملحوظة هامة للغاية : هذا الدرس هو الدرس الأكبر والأهم في هذه السلسلة وباقي الدروس سوف تعتمد بنسبة كبيرة على ما فهمناه سوية هنا ، لذا لا تستصعب الأمر وخذ وقتك في فهم الدرس . في هذا الدرس سوف نبدأ بعمل شاشة عرض البضائع ، وكما هي العادة عند التصميم فإن كل منا يصمم كما يحلو له ... لكن لا تنس أننا لا بد أن نشترك في المحتويات الرئيسية وهي :
قائمة في الأعلى لاختيار البضائع . جدول لعرض جميع البضائع الموجودة . مربعات نص لعرض البضاعة المختارة حالياً . أزرار أوامر للتعديل والحذف ، وزرين لعملية بيع أو شراء تتصل بالشاشة الخاصة بها والتي سنقوم بعملها عندما يأتي دورها . وأخيراً تتعين كأحد أبناء Children للفورم MDIForm وذلك عن طريق ضبط خاصية MDIChild = True . لاضافة الجدول اضغط Ctrl+T واختر Microsoft Flex Grid 6.0 واخترنا هذا الجدول لامكانية التحكم المطلق به ، حيث نقوم بعمل كل شيء فيه ، وحتى لو أردنا عمل DBGrid متطور باستخدامه فسيمكننا ذلك . لاظهار الشاشة من خلال القائمة نكتب الأمر التالي : كود : [align=right]Case 0لو ظل الفورم على تصميمه القديم من حيث BorderStyle=2 فستلاحظ تغير حجم الشاشة - ولكن لو ضبطت الخاصية إلى 1 فلن تحدث هذه المشكلة .
لن ننسى اضافة السطرين التاليين ، حيث يقومان بتوسيط الفورم كما فعلنا مع Frm_Info ، لذلك سنضيفهما في حدث Load للفورم :
كود : [align=right]Frm_Show.Left = ((MDIForm1.Width - Frm_Show.Width) / 2)لنبدأ الآن سوية في تصميم اجراء Refresh_Me والذي ينطلق عند تشغيل الفورم Form_Load ، وعند كل عملية حذف أو تعديل .
بما أن لدينا كائن T1 يحتوي على معلومات البضائع ، فلم لا نقوم بالدوران على هذا الكائن من البداية إلى النهاية ووضع الاسماء فيه إلى القائمة : كود : [align=right]Sub Refresh_Me()هذا ولكي تعرض البضائع في هذه القائمة مرتبة أبجدياً فإننا نضبط خاصية Sorted للقائمة لتساوي True .
والآن فإننا وبنفس طريقة عرض البيانات في القائمة نريد لكامل البيانات أن تعرض في الجدول ، ولذا سوف نضعهم جميعاً داخل حلقة تكرار واحدة تقليلاً للجهد على الذاكرة . ولكنني أريد أن أشرح كيفية اضافة بيانات في MSFlexGrid . واجمالاً: توجد خاصيتين على قدر كبير من الأهمية هما Col و Row واللتان تحددان في نقطة التقاءهما خلية Cell لها خصائص أشهرها Text لعرض النص فيها . هناك أيضاً خاصيتي Rows و Cols واللتان تحددان عدد الصفوف والأعمدة في الجدول ، ووظيفة Clear والتي تقوم بمسح كافة محتويات الجدول . سوف نقوم بعمل اجراء نسمية Create_Flex وذلك لتهيئة الجدول لنتعامل معه ، يحتوي هذا الأجراء على وضع عدد الأعمدة = 7 ، الصفوف = عدد السجلات + 1 ، ونضيف التعبيرات المناسبة على رأس كل جدول . لعمل المهمتين الأولتين : كود : [align=right]MSFlexGrid1.Clearأما للمهمة الثانية فسوف نتنقل بين الأعمدة ، ونضع على رأس كل عمود القيمة المناسبة له :
كود : [align=right]MSFlexGrid1.Row = 0ولكن ماذا عن توسيط الأعمدة ... نستطيع ذلك من خلال كود كالتالي :
كود : [align=right]MSFlexGrid1.ColAlignment(0) = 5حيث أن 5 ترمز للمنتصف ، أما 3 فترمز إلى المحاذاة إلى اليمين .
نفس الأمر بالنسبة لعرض كل عمود ... ولن نغير سوى في عرض الأعمدة التي لا يناسبنا حجمها الافتراضي وهي الأول ( تسلسل ) والثاني ( اسم البضاعة ) والثالث والرابع ( النوع - المصنع ) : كود : [align=right]MSFlexGrid1.ColWidth(0) = 500وسوف نستدعي هذا الإجراء في بداية Refresh_Me .
ولكن ماذا عن تعبئة الجدول داخل حلقة التكرار ، في الواقع بنفس الطريقة التي كتبنا بها رؤوس الأعمدة سوف نكتب القيم الأخرى ، إلا أن رقم الصف سوف يصبح قيمة المتغير i+1 . ومن ذلك نستطيع أن نحصل على كود اجمالي لدالة Refresh_Me - مؤقتاً - . كود : [align=right]Sub Refresh_Me()لاحظ أنني استخدمت طريقة ثانية في القراءة مع الحقل Count ذلك أنه ينبغي أن يوضع بين علامتي تنصيص لأنها كلمة محجوزة في الفيجوال بيسك .
يتبع ... الدرس العاشر - تصميم شاشة عرض البضائع - العرض والتحديد - RaggiTech - 15-10-12 ترتيب البضائع في الجدول .
بالتأكيد قد مر بك هذان الأمران خلال الدروس سابقاً : كود : [align=right]MSFlexGrid1.ColAlignment(0) = 5ذكرت بهذين الامرين فقط لتدرك أننا حينما نريد تطبيق جميع خصائص التنسيق على هذه الأداة فإننا نستخدم أحد طريقتين - حسب الخاصية فإما إن نذكر اسم الأداة MSFlexGrid1 ثم الخاصية ، وأخيراً نضع رقم هذا العمود بين قوسين ، أو نذكر رقم العمود أو الصف - أو كليهما - ثم نطبق عليه هذه الخاصية وهو مثل خاصية Sort والتي تقوم بالترتيب ، لذا فلترتيب الحقول حسب عمود الاسم فإننا نكتب الكود التالي :
كود : [align=right]MSFlexGrid1.Col = 1ومعنى الرقم 7 واضح لمن اطلع على الدرس على الرابط السابق ...
ولكن ربما تكون قد لاحظت ان الأرقام لم تعد مرتبة ، هل هذا صحيح ؟ حل هذه المشكلة أن نضع عداداً جديداً كلياً وصفاً جديداً آخراً يحتوي على التسلسل غير الرقم ، فلنر كيف نقوم بذلك . أولاً قم بزيادة عدد الأعمدة بمقدار عمود واحد ... أيضاً قم بتحويل رقم كل عمود إلى الرقم + 1 . قم بذلك وشاهد النتيجة ، ستجد ظهور صف فارغ على اليمين من الجدول . سنغير الآن من اسم عمود الرقم ليصبح ( الرقم ) فيما يصبح العمود الجديد ( ت ) . لاحظ أننا لن نقوم خلال الدوران بعملية تعبئه هذا العمود بالأرقام ، بل إن ذلك سوف يتم بعد الانتهاء من ترتيبها ، وإلا فلن نستفيد شيئاً - جرب وضعهما سوية وراقب ما يحدث - . ولذلك نضع الكود التالي بعد الترتيب : كود : [align=right]MSFlexGrid1.Col = 0وضع أسماء الموردين والأنواع بدلاً من أرقامها .
لو لاحظت أننا نقوم بوضع الأرقام لأن هذا هو المخزن في قاعدة البيانات أو تحديداً في الجدول الذي نقوم بالقراءة منه . ولذا فإننا نحتاج إلى البحث في جدولي الأنواع والموردين قبل وضع الناتج وذلك في الأسطر التالي من الكود : كود : [align=right]MSFlexGrid1.Col = 3وسنرى الآن كيف نقوم بهذه المهمة .
هل تتذكر كيف قمنا بفتح قاعدة 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"تقوم جملة الاستعلام هذه باستخراج جميع المعلومات من الجداول الثلاثة مع دمج كل معلومات المصانع والأنواع جنباً إلى جنب مع معلومات البضائع ، ولتتكون لديك نظرة أكثر تركيزاً قم بتجربة هذه الجملة في 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أيضاً لا تنس أن تغلق T4 بنهاية هذه الدالة .
يتبع ... الدرس العاشر - تصميم شاشة عرض البضائع - العرض والتحديد - RaggiTech - 15-10-12 عرض السجل الذي تم النقر عليه في مربع النص والقائمة .
بما أننا نريد أن نعرض بيانات أي حقل بمجرد النقر عليه ، فإننا نحتاج بمجرد النقر عليه للحصول على رقمه ، ولنر سوية هذا الامر . عندما انقر على أي خلية فإن خاصيتي Col و Row يتم ضبطهما طبقاً للوضع الجديد ، وبهذه الطريقة تستطيع الحصول على رقم الصف والعمود بعد أي نقرة باضافة الأمر التالي في حدث Click للجدول : MsgBox "Row : " & MSFlexGrid1.Row & " Col : " & MSFlexGrid1.Col وبنفس الطريقة يمكننا الحصول على محتويات الخلية التي قمنا بالنقر عليها بواسطة أمر كهذا : كود : [align=right]MsgBox MSFlexGrid1.Text[/align]ولكننا لا نريد محتويات هذه الخلية ، بل إننا نحتاج محتويات خلية الرقم في نفس الصف للبحث عنها وعرضها ... لذا فإننا نقوم بالتحول إلى خلية الرقم :
كود : [align=right]MSFlexGrid1.Col = 1ستجد أن الأمر السابق يعطيك رقم الصف بغض النظر عن مكان النقر .
وهذا الرقم هو ما سوف نستخدمه في البحث . سنبدأ الآن بكتابة جملة استعلام نبحث من خلالها عن السجل الذي له هذا الرقم ، تذكر أننا سوف نقوم بذلك من خلال استعلام مزدوج لأننا نريد معرفة اسم المصنع والنوع وليس أرقامهما ، لذلك سوف يكون مثل الاستعلام في الدرس السابق لكن مع اضافة شرط آخر ل 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وماذا أيضاً ... نحتاج لأن تشير القائمة إلى البضاعة الحالية ، وبما أننا نتعامل في القائمة مع Tb_Product.name فسيصبح الأمر بالشكل التالي :
كود : [align=right]Combo1.Text = T4!.Fields("tb_product.name")[/align]ولكن بما أننا سنستخدم هذا الأمر لاحقاً فسوف نضعه في اجراء جديد ونسميه ShowData ... وبذلك يصبح الأمر بالشكل التالي :
كود : [align=right]Private Sub ShowData()أخيراً لا تنس أن تغلق قاعدة البيانات T4 .
ثمة أمر آخر ، وهو أننا نريد أيضاً عند اختيار اسم من القائمة أن يظهر في مربعات النصوص ، لذلك بنفس الطريقة السابقة في الاستعلام سوى أننا لن نبحث بدلالة الرقم بل بدلالة الاسم ، ولذا سنضع الاسم بين علامتي تنصيص مفردة ' ' . كود : [align=right]Private Sub Combo1_Click()ما زالت أمامنا خطوة واحدة ، وهو عند حدث البداية للفورم ، فما هي المحتويات التي ستظهر في مربعات النصوص ... مثلاً سوف تكون عن أول بضاعة ، لذا فسوف نضع الأمر التالي :
كود : [align=right]Combo1.ListIndex = 0[/align]وبالتالي سوف ينفذ حدث Click للقائمة تلقائياً .
حل آخر لنقل المعلومات إلى مربعات النص عند النقر على الجدول . بالتأكيد أنت لا زلت تتذكر الطريقة التي عرضنا فيها البيانات عند النقر على الجدول ، وكانت اجمالاً بالشكل التالي : ولو لاحظت أننا نضع البيانات الموجودة في الجدول ... أليس كذلك ؟ إذاً فلماذا نقوم بعملية استعلام رغم أن بإمكاننا قراءة المعلومات من الجدول . في الطريقة السابقة كنا نقرأ الرقم فقط بالكود التالي : كود : [align=right]MSFlexGrid1.Col = 1[/align]لكننا في نفس الوقت نستطيع الانتقال إلى العمود الثاني والثالث والرابع وحتى الأخير ووضع المعلومات بهم في مربعات النصوص ... انظر الكود التالي :
كود : [align=right]MSFlexGrid1.Col = 1هل يبدو الأمر سهلاً ؟ عموماً لك مطلق الحرية في استخدام ما تراه مناسباً وقد أرفقت الكودين في البرنامج لاختيار ما تريد .
وماذا بعد ؟ تخيل أن مربعات النصوص لدينا بها خاصية Index تبدأ من 0 وتنتهي بـ 6 ولهم جميعاً اسم Text1 .
هل تستطيع تخيل مدى بساطة الكود السابق في هذه الحالة :
كود : [align=right]For i = 0 To 7لكن هذا الأمر لن يناسبنا في هذه الشاشة لأننا قمنا بعمل مربعات النصوص Text1,Text2,......,Text7 . ولكننا سوف نتذكر ذلك في تصميم الشاشات القادمة .
سيتم ارفاق الملف بعد الدرس المقبل ... والله الموفق ... والسلام عليكم ورحمة الله وبركاته . |