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

إني ذكرتك والذكرى مؤرقة (تركي العسيري )

رائج
بدأه المبرمج أحمد في 30 أكتوبر 2005 · 53 رد · 17,737 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

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

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

سلسلة من المقالات، احاول فيها تحفيز مبرمجي Visual Basic x.0 العرب الى مواكبة التيار والهجرة بلا عودة الى احد لغات اطار عمل NET Framework.

بعد التحية والسلام،

تمر على الانسان لحظات الاشتياق الى الماضي والابحار بالنفس الجياشة الى عكس اتجاه المجاديف، والحنين الى شواطئ الطفولة حيث تبنى فيها قلاع الطين، مع الاستماع الى الحان القواقع.

ان كان الاغلب منا ينظر الى الورد في ماضيه، فانا افضل رؤية الشوك مع لغات البرمجة، ومن منطلق خصالي البرمجية فأفضل ان اكون خائنا لها واحاول اظهار الوجه الآخر عندما اهاجرها. (لقد هاجرت الكثير منها في حياتي، فلم يعد القلب يخفق لاحد)

وبما اني هجرت الى Visual Basic .NET، فسأحاول ما بوسعي توزيع الجوازات والتأشيرات الى اخواني اعضاء وزوار vb4arab.com حتى يسيروا مع الركب وينطلقوا الى ماهو الافضل لهم ولأعمالهم، حيث ان استمرار نشاط المنتدى تحت راية Visual Basic 6 الذي يطغى على نشاط منتدى –احم احم- اقصد قسم Visual Basic .NET امر لا ارى فيه مصلحة –لا للمنتدى ولا لزواره.

من هنا سنحاول (بعد اذن ادارة المنتدى) شن حملة ضد Visual Basic 6 واظهار عيوبه لتكون حافز الى المبرمجين العرب للانتقال الى Visual Basic .NET، ومن بعد ما كنت من اشد عشاق Visual Basic، سأريكم الوجه الاخر لاصبح عدوه اللدود. فالاخوان الذين لا يزالون يرفضون الانتقال الى Visual Basic .NET، لابد من محاولة تغيير قناعاتهم. اعلم انه يعز عليكم فراق الحبيبة Visual Basic، ولكن لما لا تحاولوا اضافة الحروف NET. عليها؟

هذا مقال من ملايين المقالات في الانترنت التي تظهر قصور وغباء لغة البرمجة Visual Basic، قمت بترجمته بتصرف، والقادم في الطريق.

ملاحظة: لا اعتقد بانه سيفهم محتويات هذا المقال الا مبرمجي Visual Basic المتمرسين.

=== نص المقال: ترجمة خاصة بتصرف ==================

شاركت المبرمجة "فيرتي ستوب" في احد المشاريع بلغة Visual Basic. ومن أجل الفئات والأجيال القادمة من مبرمجي Visual Basic، قررت كتابة ملخص لتجربتها –الغير سارة- كفائدة لهم.

1. استعداء الإجراءات والدوال Procedure and function calls:

مع بدايات ظهور لغة الـ BASIC، واجهنا الكلمة المحجوزة GOSUB لاستدعاء جزء معين من الشيفرة (يرمز له برقم او اسم)، ولكن مع Visual Basic فقد اظهر لنا نوعين من الاجراءات هما الـ Subs (والتي لا تعود بقيمة)، والـ Functions (التي تعود بقيمة):

 ' Sub لاستدعاء إجراء
Subname Param1, Param2

' Function لاستدعاء دالة
Result = FuncName(Param1, Param2)

لاحظوا الفرق الجبار في كلا الاستدعائين، فاستدعاء الاجراءات من النوع Sub لا يمكنك استخدام الاقواس معها:

 ' ستظهر رسالة خطا
Subname(Param1, Param2)

ولكنك تستطيع استخدام الاقواس مع الاجراءات من النوع Function –حتى لو لم تستفد من القيمة التي تعود بها الدالة:

FuncName(Param1, Param2)

ان قمت باستدعاء دالة بالطريقة السابقة ( باضافة الاقواس ودون الاستفادة من القيمة التي تعود بها)، فسيتم التعامل مع الوسيطات المرسلة Param1 و Param2 كما لو انها ارسلت بالقيمة ByVal حتى لو تم تعريفها على انها بالمرجع ByRef!

ولكن عند استخدام الكلمة المحجوزة Call (لم ارى أي مبرمج Visual Basic يستخدمها في حياتي) فسيتم ارسال الوسيطات بالمرجع ByRef:

 Call FuncName(Param1, Param2)

2. التصريح عن المتغيرات Variable Declaration

يمكنك ان تصرح عن متغير –كما هو معلوم- باستخدام الكلمة المحجوزة Dim:

 Dim I As Integer

المبرمجون المتمرسون يفضلون تعريف الانواع المتشابهة في سطر واحد:

 Dim I, J, K, L As Integer

ههههه (نلت منك هذه المرة!)، فجميع المتغيرات السابقة من النوع Variant ما عدا الأخير L فهو الوحيد من النوع Integer.

3. استدعاء دالة او استخدام مصفوفة Call a function or access an array؟

في اغلب لغات البرمجة، يمكنك التفريق بين عملية استدعاء الدالة F التي ترسل لها القيمة 3، وبين الوصول الى المصفوفة F برقم الفهرس 3، فالأولى قد تكتب (3)F والثانية [3]F، ولكن مع Visual Basic فكلا الحالتين تكتب (3)F!!

" ملاحظة: حتى Visual Basic .NET لم يغير هذه العادة "

4. شيء آخر حول المصفوفات Another thing about arrays؟

يبدأ ترقيم عناصر المصفوفة بـ 0 دائما، ولكن عند نقل الشيفرة المصدرية الى جهاز او ملف اخر يستخدم الموجه Option Base 1، فسيكون 1 .

5. ولكن توجد هناك المجموعات ايضا But there are also collections

التصميم الكائني التوجه OOP لايخلو من المجموعات والتي يبدأ ترقيمها في العادة من 1، رغم انه في حالات قد تبدأ ترقيم عناصرها بـ 0 ايضا، وذلك يعتمد على المكان التي عرفت في المجموعة. تحتاج الى ضربة الحظ هذه المرة!

6. هل لمحت الى البرمجة كائنية التوجه Did I mention OOP؟

ههههههههههههههههههههههههههه، لا تخدع نفسك! فأنت مبرمج Visual Basic طيب القلب (على النية).

7. اسناد القيم لحظة التصريح Initialization

في العصور الوسطى للغة الـ BASIC، حاول مصمموها ايجاد حل لمشكلة اسناد القيم لحظة التصريح ( Dim x As Integer = 10)، وكان كل ما استطاعوا فعله اسلوب غبي يعتمد على الكلمات المحجوزة DATA و READ، الا ان مصممي Visual Basic اخترعوا اسلوب اكثر حداثة والذي يكون شيئا مثل:

 Dim A(20) As Double
A(0) = 4.5 ' قد يبدأ الترقيم بواحد !
A(1) = 4.71
A(2) = 4.82
A(3) = 4.92
...

ونعم التطور!!!!

8. مصفوفة الثوابت Arrays of constants

لايوجد شئ في Visual Basic اسمه مصفوفة الثوابت. على اية حال، ماذا ستفعل بها حتى لو كانت موجودة؟ --- مبرمج Visual Basic تفكيرك محدود!!

9. النوع Integer حجمه 16 بت The type Integer declares a 16-bit integer

قد تكون العبارة السابقة مقبولة بكل رحابة، ولكن عند الحديث عن نظم 32 بت (والتي بدأها نظام التشغيل Windows 95) فلغات البرمجة الاخرى قد لاحظت التغيير!

10. المنطق Logic

هذا الجزء الهام من اللغة الذي يفترض ان يكون سهل وبديهي، هذا اختبار سريع لك: افترض ان Check1 اداة من النوع CheckBox على نافذة النموذج، وقمت بتنفيذ هذه الشيفرة:

Dim b As Boolean, c As Boolean
b = Check1.Value
c = Not Check1.Value

فالمتغير b السابق ستكون قيمته True اذا قام المستخدم بتحديد الاداة (Value = Checked)، والقيمة False ان قام بالغاء التحديد (Value = Unchecked). ماذا تعتقد ستكون قيمة المتغير c؟ الاجابة المفاجئة: دائما True !!!!!! (مساعدة: تحويل القيم في فلسفة السيد Visual Basic تحتاج الى كتاب كامل !!!!)

11. كلمات محجوزة نفس المعاني مختلفة الاغراض

- Nothing تعني لا شيء

- Null تعني لا شيء

- أما Empty فتعني لا شيء

لتوضيح الفرق بينهم، تحتاج الى وقت!

12. محرر الشيفرة الغبي The stupid code editor

يظهر لك (بشكل افتراضي) الرسالة المزعجة عند ظهور خطأ نحوي وقت التصميم Design time syntax error. وقد تظهر عندما تترك السطر بعد كتابة كلمة وحدة بشكل مؤقت لتنسخ جزء من شيفرة مصدرية في سطر اخر.

13. المترجم الغبي The stupid compiler

والذي قد يجري عملية ترجمة Compiling رغم وجود بعض الاخطاء نحوية، ليظهر خطأ كتابة العبارة If دون End If كخطأ وقت التنفيذ Run time error !!!

14. عودة الى الاجراءات من النوع Sub

الاجراءات من النوع Sub يمكن ان تصرح بالكلمة المحجوزة Public، Private، او Static. أعطيك 100 دولار ان وجدت حالة حقيقية تستحق فعلا الاستفادة من تعريف الاجراء باستخدام Static!!

15. الفائدة في النهاية لك يا بيل جيتس

وأحاول بقصارى جهدي لايقاف ارباحه، رغم أني متأكد بأني أساعده ايضا!!

=== نهاية المقال ==================

لا تبتسم، فأنت مبرمج Visual Basic x.0 ؟

-- تركي

تم تعديل هذه المشاركة بواسطة المبرمج أحمد في 27 يونيو 2008 في 15:44

سبحان الله وبحمده ... سبحان الله العظيم

#2

عندما أذكر سمات اطار عمل NET. فلا تعتقد بأني سأتحدث عن مكتبة الفئات Class Library التي توفرها (رغم انها احد اعظم الاسباب التي تسيل لعاب المبرمجين للانتقال لها)، وذلك لاني اخاطب مبرمجي vb4arab.com وهم على قدر رفيع من الفهم واستيعاب الحقائق، فهم مبرمجين لا تخدعهم المظاهر، لانهم يعلمون علم اليقين انهم يستطيعون بناء عشرات –ان لم يكن مئات- الفئات التي تغلف Encapsulate إجراءات API، وبذلك يستطيعون تطبيق كل شيء تعجز عنه لغة VB6. لذلك، ان اردنا معرفة القصور الحقيقي لـ Visual Basic، فدعنا نركز حديثنا حول لغة البرمجة والإمكانيات الداخلية والخاصة بها.

السطور التالية كلفتني أكثر من 3 ساعات لكتابتها، حيث تعمدت عدم ترجمة أي مقال اجنبي لتأتيكم كلمات من مبرمج عربي منكم وفيكم:

أولا: لغة البرمجة:

1) لكل شيء ملف

من الأشياء التي تغيظني في VB6 هو اسلوبه الغبي في توزيع الشيفرات المصدرية على الملفات، فلكي تعرف وحدة برمجية Module ستحتاج الى ملف خاص بها (حتى لو كانت الوحدة تشمل سطر واحد فقط)، وان اردت تضمين شيفرات لمكتبة صممتها في مشروعك، وكانت إجراءات هذه المكتبة موزعة على وحدات برمجية، فلك ان تتخيل كثرة الملفات والتي ستكون في مشروعك. اما مع VB.NET فيمكنني تعريف ملف واحد فقط يشمل جميع الوحدات البرمجية:

 ** VB.NET **************

Module MathFunctions
	…
	…
End Module

Module ArabicLanguageFunctions
	…
	…
End Module

Module BusinessFunctions
	…
	…
End Module

لو كانت المسألة تقتضي على الوحدات البرمجية لهان الامر كثيرا، ولكن القضية تشمل كل شئ (نوافد النماذج Forms، فئات Classes، ادوات تحكم UserConstrols، ...الخ) ومما يزعجني اكثر ان كل ملف له امتداد خاص –رغم انها تكتب جميعها بلغة واحدة VB6، اما مع VB.NET فجميع الملفات (البرمجية) تنتهي بالامتداد vb، كما يمكن للملف ان يشمل وحدات برمجية Modules، فئات Classes، ادوات Controls وكل شئ يتبع للغة البرمجة.

ليس هذا فقط، بل حتى بعض محتويات الملف تكون مخفية (كمواصفات الفئات Classes Attributes، بيانات مصمم النماذج Form Designer). فلو اردت نسخ شيفرات مصدرية من فئة الى فئة اخرى، علي نسخ الملف الكامل للفئة. اما مع VB.NET فما اروع المفاتيح Ctrl+V <- Ctrl+C <- Ctrl+A وتنتهي الحكاية.

2) الإجراءات المفوضة Delegate Procedures

الاجراءات المفوضة هي إجراءات يتم استدعائها عن طريق متغيرات تكون بمثابة مؤشرات لها (ان كنت من مبرمجي C فهي تشابه مؤشرات الدوال Function Pointers الى حد كبير). من الانجازات التي كانت اختراعا عظيما لمبرمجي VB6 هو دعم الكلمة المحجوزة AddressOf والتي تعود بمؤشر الاجراء. هل تعرف كيف يمكنك الاستفادة منها؟ في الحقيقة لا يفضل مبرمجي VB6 استخدامها لسببين: الاول خوفهم من ممازحة المؤشرات (وهذا من حقهم)، والسبب الثاني امكانية استدعاء الاجراءات بشكل مباشر. ولكن الحقيقة –المرة- ان كل هذه الاسباب لا اساس لها من الصحة، حيث ان VB6 لا يمكنك من الاستفادة منها !!!!!!

عجبا على هذا الغباء! لماذا يدعم كلمة المحجوزة لا يمكنك استخدامها؟ والسبب انه (قد) تلجأ الى اجراءات API والتي تستخدم الردود CallBacks، التصنيف الفرعي SubClassing، أو خطف الرسائل Message Hooking، وهي مواضيع جعلتني اترك البرمجة بلغة C لصعوبتها. وكأن VB6 يقول لك: عد الى برمجة API الاجرائية المعقدة فقد وفرت لك كلمات محجوزة لها! وماهي فائدة VB6 اذا ان كان هذا هدفه، فالتعامل مع اجراءات API باستخدام لغة C اسهل بعشرات المرات من VB6 !!!

ولكن مع VB.NET فهو يقول لك: وفرت لك الكلمة المحجوزة AddressOf ليس فقط لاستدعاء الإجراءات المفوضة، بل ايضا يمكنك تطوير إجراءات مفوضة خاصة بك باستخدام لغتة برمجتك المفضلة VB.NET -كما تفعل اللغات المتقدمة الاخرى. وهذا امر بديهي، حيث عندما ادعم ميزة في لغتي علي ان اجعل المبرمج قادر لاستخدام هذه الميزة بنفس لغتي (وليس لاستخدامها مع لغة اخرى).

3) تعارضات وتوزيع اسماء المعرفات Identifiers

عندما تعرف فئة باسم Point فسيكون هذا الاسم محجوز لها دائما، ولن تتمكن من استخدامه ابدا. ولكن هب –مثلا- ان الغرض من الفئة Point هو تمثيل الاحداثي x و y لنقطة على سطح ثنائي الابعاد، واردت استخدام –نفس الاسم Point- لتمثيل نقطة على سطح ثلاثي الابعاد، فقد تسمي الفئة الجديدة بالاسم Point3d او PointEx او أي شئ اخر.

حسنا، ماذا لو وجدت مئات الفئات في برنامجك؟ فاعتقد ان موضوع التسمية سيكون مشكلة كبيرة، حيث تكثر اسماء الفئات بعد كتابة العبارة As New، وتصبح مسألة البحث عن الفئة كالبحث عن مسمار في محيط.

اما مع VB.NET، فهو يدعم فكرة مجالات الاسماء NameSpace، حيث يمكنك من توزيع فئات على شكل شجري يسهل عليك ترتيب وتقسيم اسماء المعرفات، لتتمكن من كتابة شيئا مثل:

 ** VB.NET **************

Dim X As New Animals.Mouse
Dim Y As New Hardware.Mouse

4) هل تود اضافة شيفرة بلهجة اخرى؟

في الحقيقة، كانت لغة C هي اللغة الوحيدة التي تمكنك من اضافة شيفرات بلغة Assembly مع برنامجك، ولكن مع اطار عمل NET. (بشكل عام)، فجميع لغات البرمجة موحدة في بنيتها التحتية، وذلك بسبب معايير Common Language Runtime – CLR. لتتمكن من دمج شيفرات مصدرية بلغات برمجة مختلفة في برنامج واحد.

لا تصدق هذه الحقيقة؟

اقرأ هذا المقال بقلم الاخ أيمن المدهون: http://www.dev4arabs.com/ar/csharp/articles.asp?s=2&id=26

5) اسناد القيم لحظة التصريح

قد لا يكون هذا قصور كبير في VB6 –هذا في حال المتغيرات البسيطة:

 ** VB6 **************

Dim X As Integer

X = 5

وقد لا يكون قصور كبير حتى لو كثرت المتغيرات:

 ** VB6 **************

Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim D As Integer

A = 5
B = 10
C = 15
D = 20

ولكن عند الحديث عند الحديث عن المصفوفات الديناميكية:

 ** VB6 **************

Dim X As String ()

Redim X (2)

X(0) = "عباس السريع"
X(1) = "برعي ابو جبهة"
X(2) = "زكريا زعتر"

فليس فقط تتطلب منك سطور اضافية، بل حتى لو اقمت علاقة صداقة جديدة واردت اضافتها مع الشلة السابقة، عليك اعادة تعديل الشيفرة والخاصة بـ Redim :

 ** VB6 **************

Dim X As String ()

Redim X (3) 

X(0) = "عباس السريع"
…
…
X(3) = "عبود اللوح"

ضع في عين الاعتبار، ان الشيفرة السابقة تستهلك وقت اضافي –سواء لكتابتها او تنفيذها- ولاتنسى انها تتطلب وضعها داخل اجراء Sub او Function (فهي شيفرات برمجية).

اما مع VB.NET فيمكنك بخطوة واحدة ومن أي مكان في برنامجك (حتى خارج الاجراءات) كتابة شيئا مثل:

 ** VB.NET **************

Dim X() As String = { "عباس السريع", "برعي ابو جبهة", "…", "…" }

6) انا اسمي "تركي العسيري" "تركي العسيري" "تركي العسيري" !!! لماذا التكرار؟

في العقود الاخيرة، اصبح التعامل مع النصوص الحرفية امر لا يكاد ان يخلو احد اجراءات برنامجك منه، فنحن في زمن التدفق او الانفجار المعلوماتي، وكل مزايا برامجك لابد ان تتعامل مع النصوص، صحيح ان VB6 كان يستعرض عضلاته في اعطائنا امكانية تعريف متغير حرفي حجمه يزيد عن 2 جيجابايت، ولكن طريقة ادارته لها فاشلة جدا، فاي عملية اسناد بين المتغيرات الحرفية تؤدي الى نسخ القيمة الحرفية وتكرارها في الذاكرة:

 ** VB6 **************

Dim X As String 
Dim Y As String

X = "تركي العسيري"

' الان لدينا نسختين من القيمة
' الحرفية في الذاكرة
Y = X

اخي العزيز، الامر ليس مقصور على القيمة "تركي العسيري" فهي لا تكلف سوى ( (12 * 2) * 2 = 48 بايت)، ولكن عند التعامل مع النصوص الطويلة جدا (كالموجودة في الملفات النصية، الحقول Memo في قواعد البيانات، او مستندات XML) فهي بحاجة الى تفكير جدي اكثر في الموضوع.

اما مع VB.NET فلديه من الذكاء الذي يستحق التقدير والاحترام، حيث ان القيم الحرفية تمثل كائنات من النوع المرجعي Reference Type، وفيه ميكانيكية فائقة الروعة بحيث لا تنسخ القيم الحرفية ان تساوت لاكثر من متغير (سواء لحظة الترجمة او التنفيذ):

 ** VB.NET **************

Dim X As String = "تركي العسيري"
Dim Y As String = "تركي العسيري"

' القيمة مكررة مرة واحدة فقط
Console.WriteLine ( X Is Y )  ' True

ذكاء VB.NET اكبر مما تتصور، حيث يشمل ويتحقق من كامل القيمة –حتى وان استخدمت معامل الدمج:

 ** VB.NET **************

Dim X As String = "العسيري" & " " & "تركي"
Dim Y As String = "تركي العسيري"

' القيمة مكررة مرة واحدة فقط
Console.WriteLine ( X Is Y )  'True

7) اضافة/حشر/حذف/تعديل القيم الحرفية

قد لا يعلم الجميع، ان كل عملية تعديل على متغير حرفي تستهلك وقت وجهد اضافي:

 ** VB6 **************

Dim X As String

X = "عباس"
' تتطلب حجز مساحة اضافية
' في الذاكرة قبل الاسناد
X = X & " " & "السريع"

ولا شك ان الامر يظهر عيبه وبطئه الكبير مع الحلقات التكرارية، قد يأتي احد الاشخاص ويخبرني باستخدام المتغيرات الحرفية ثابتة العدد Fixed-Leangth-Strings:

 ** VB6 **************

Dim X As String * 50

X = "عباس"
' هنا اسرع بكثير
X = X & " " & "السريع"

فكرته لابأس بها ولكن دعني اريك عيوب هذا النوع من المتغيرات:

* تضيف مسافات Spaces دائما في المناطق غير المستخدمة (مما يكلفك استخدام دوال حذف المسافات كـ Trim والتي تستغرق بدورها وقت اضافي).

* ليست متوافقة مع تقنية COM.

* ليست متوافقة مع إجراءات API.

* ليست متوافقة مع مجموعة كبيرة من دوال مكتبة VBA و VB (رغم انها تتبع وخاصة بلغة VB6!)، حيث تقوم اما بتحويلها الى المتغيرات Strings العادية او لا تقبلها.

* لا يمكن لهذا النوع من المتغيرات ان يعرف على مستوى Public في الفئة او نافذة النموذج. (أي لن تستطيع ان تصله الى العالم الخارجي)

* اقصى عدد من الحروف الذي يمكن ان يحملها هو 64 كيلوبايت ( اين الـ 2 جيجابايت يا VB6 ؟؟!!)

8) عرف هنا ولكن لا تعرف هناك، كما يمكنك هنا ولكن لا تستطيع هناك!!

من الامور التي لا اعلم كيف كنت اصبر عليها، قوانين قابلية الرؤية Visibility لمعرفات البرنامج، حيث لا توجد صيغة موحدة المعايير ومفهومة المنطق استطيع ان ابني برامجي على اساس سليم لها، فكل معرف له حالة خاصة، واسلوب خاص، الامر الذي يجعلني افتح نسخة ثانية من VB6 على سطح مكتبي حتى اجرب قبل ان اعتمد التصميم. خذ مثلا شروط قابلية الرؤية للتركيبات:

* يمكنك تعريفه كـ Private لحصره على الوحدة و Public ليشمل باقي انحاء المشروع.

* لا يمكنك استخدام Public ان كان في نافذة نموذج.

* يمكنك استخدام Public لتعريف تركيب في الفئة دون أي مشاكل.

* ان عرفت تركيب باستخدام Public في وحدة برمجية Module، فيمكنك استخدامه دون أي مشاكل، ولكنك لن تستطيع تعريف اجراءات Subs او Function تستقبل وسيطة Parameter من نفس نوع التركيب ان كان الاجراء على مستوى Public (يمكن ذلك ان كان الاجراء على مستوى Private او Friend)

افففففففففففففف! كيف يمكنني حفظ كل هذا؟ وماذا عن المصفوفات هل يمكن تعريفها Public ؟؟؟ والله لقد نسيت ولكني اعتقد ان المصفوفات الديناميكية ممكن اما الستاتيكية فلا – او العكس !!

اما مع VB.NET فكل هذه السخافات ليست في مستنداته، حيث يوفر لك الكلمات المحجوزة Private، Friend، و Public والتي تتبع قانون ومعييار موحد لكافة انواع المعرفات –دون أي حالات شاذة.

كانت هذه ملخص جولتي السريعة حول بعض –وليس كل- قصور لغة VB6 في ابسط اساسيات لغة البرمجة، قريبا سنتعرض الى تفاصيل اكثر حول تعريف الفئات Classes وسأريكم فضايح من تحملون رايته Visual Basic x.0 !!

-- تركي

تم تعديل هذه المشاركة بواسطة المبرمج أحمد في 31 أكتوبر 2005 في 06:29

سبحان الله وبحمده ... سبحان الله العظيم

#3

أردت هنا اكمال السلسلة والتحدث عن الفئات ‏Classes‏ والكائنات ‏Object‏ وطريقة ‏التعامل معها في ‏VB6‎‏:‏

‎‎ثانيا: تعريف الفئات واستخدام الكائنات:‏‎‎

‏1) لا يمكنك ارسال الخصائص بالمرجع ‏ByRef

عندما تعرف الخصائص ‏Properties‏ في فئاتك، فستقوم بكتابتها على شكل اجراءات ‏Property Get‏ و ‏Property Let، والهدق منها محاكاة المتغيرات التقليدية حتى تتمكن ‏من اسناد قيمها:‏

‎

 ‎
Dim X As New TestClass

X.TestProperty = 100‎
‎

‎

المشكلة ان ‏VB6‎‏ يطبق ما يسمى ‏‎‎التقليد الأعمى‎‎، حيث ان الخاصية ‏TestProperty‏ السابقة لايمكنك ارسالها بالمرجع ‏ByRef‏ الى الاجراءات –سواء ‏Subs‏ او ‏Functions‏.‏

قد يأتي احد مبرمجي المتمرسين ويقترح علي تعريف الخصائص على شكل متغيرات ‏في الفئات:‏

‎

 ‎
‎' TestClass ‎في الملف
Public TestProperty As Integer
‎

‎

لقد وقعت في الفخ يا صديقي العزيز! وذلك ان ‏VB6‎‏ لغة الحالات الشاذة، فالشيفرة ‏التالية قد قامت بتعريف إجراءات ‏Property Let‏ و ‏Property Set‏ مخفية (حتى يتم ‏التوافق مع ‏COM‏)، مما يعني انك لن تستطيع ارسال قيم الخصائص بالمرجع.‏

ولكن مع ‏VB.NET‏ فهو يقدم فكرة الحقول ‏Fields‏ التي تمكنك من ارسال القيم ‏بالمرجع، ليس هذا فقط بل حتى الخصائص يمكن ارسالها بالمرجع.‏

‏2) المشيدات لا تقبل وسيطات‏

اثبت ‏VB6‎‏ قوة تطبيق مبدأ التغليف ‏Encapsulation‏ في فئاته حيث يوفر امكانية تعريف ‏المشيدات ‏Constructors‏ في الفئات. ولكن مع الاسف الشديد لا يمكنك اضافة ‏الوسيطات الهامة ‏Parameters‏ في المشيدات حتى تحمي فئاتك من الاخطاء، فلو ‏وجدت خصائص ضرورية عليك كتابة معروض الى مستخدم الفئة وكتابة كافة قصائد ‏المدح والرجاء حتى يوافق ويتذكر اسناد قيم هذه الخصائص بعد انشاء الكائن.‏

اما مع ‏VB.NET‏ فكل ما هو مطلوب منك تعريف الوسطيات المطلوبة في مشيدها:‏

‎

 ‎
‎' *** VB.NET **********‎
Class TestClass
	Sub New (x As Integer, Y As String)‎
  ‎…‎
	End Sub
End Class
‎‎

‏3) اعادة التعريف‏

اعادة التعريف ‏Overloading‏ غير مدعومة في ‏VB6‎، مما يعني كتابة عشرات الجمل ‏الشرطية قبل استدعاء الطرق، وذلك حتى يتم التحقق من النوع المناسب لوسيطات ‏الطريقة:‏

‎

 ‎
‎' *** VB6 **********‎
If VarType(x) = 20 Then  ‎' String‎
	MyObject.OpenStringMethod(x)‎
ElseIf VarType(x) = 2 Then	‎' Integer‎
	MyObject.OpenIntegerMethod(x)‎
ElseIf … Then
ElseIf … Then
‎…‎
End IF
‎

الشيفرة السابقة تفترض ان الطريقة تستقبل وسيطة واحدة، ولكن تخيل انها تستقبل ‏اكثر من وسيطة:‏

 ‎
‎' *** VB6 **********‎
If VarType(x) = 20 And VarType(y) = 2 Then
	MyObject.StringIntegerMethod(x, y)‎
ElseIf VarType(x) = 20 And VarType(y) = 20‎	
	MyObject.StringStringMethod(x, y)‎
ElseIf VarType(x) = 2 And VarType(y) = 20‎
	MyObject.IntegerStringMethod(x, y)‎
ElseIf VarType(x) = 2 And VarType(y) = 2‎
	MyObject.IntegerIntegerMethod(x, y)‎
‎…‎
End IF
‎

لا تعليق !!!‏

‏4) إجراءات الاحداث تعرف وقت التصميم فقط

عندما تنوي تعريف اجراء ليقنص حدث ما، فهذا الاجراء سيتم تعريفه وقت التصميم ‏Design Time‏ فقط، ولايمكن اجراء عملية القنص وقت التنفيذ ‏Run Time، وذلك بسبب ‏الصيغة الغريبة التي يتبعها ‏VB6‎‏ لقنص الحدث:‏

‎

 ‎
‎' *** VB6 **********‎
Sub ObjectName_EventName ()‎
	‎…‎
End Sub
‎

‎

ولكن مع ‏VB.NET‏ فهو يمكنك من تحديد الاجراء وقت التنفيذ باستخدام الامر ‏AddHandler‏:‏

‎

 ‎
‎' *** VB.NET **********‎
AddHandler MyObject.Event, AddressOf (MySub)‎
‎‎

‏5) المتغيرات العامة ‏Public‏ لابد ان تكون متوافقة مع ‏COM

فالمتغيرات الحرفية ثابتة الطول ‏Fixed-Length Strings‏ والمصفوفات ‏Arrays‏ لايمكن ان ‏تكون ‏Public‏.‏

‏6) تحتاج الى ساحر لتطبيق حلقة ‏For Each‏ على فئات المجموعات‏

قمت بعد سهر وتعب بتطوير فئة مجموعة ‏Collection Class، واردت ان تكون متوافقة ‏مع مواصفات ومعايير ‏COM‏ وذلك بإعطائها قابلية استخدام الحلقة ‏For Each‏ معها. ‏للاسف الشديد ‏VB6‎‏ لا يمكنك من فعل ذلك، لذلك عليك التوغل في واجهات ‏COM‏ ‏وتعريف اجراء من الواجهة ‏IUnknown‏ ليعود بالواجهة ‏IEnumVariant‏ والتي لن تستطيع ‏الحصول عليها الا من كائن من النوع ‏Collection‏ (يدعم هذه الواجهة) وكتابة هذه ‏الشيفرة الغريبة:‏

‎

 ‎
‎' *** VB6 **********‎
Public Property Get NewEnum() As IUnknown
Set NewEnum = m_CollectionObject.[_NewEnum]‎
End Property
‎‎

‎

الم اقل لك انك تحتاج الى ساحر؟

ولكن مع ‏VB.NET‏ فهو يمكنك من تطبيقها دون اللجوء الى السحرة والمشعوذين، ‏فيكفي تضمين واجهات مقدمة من اطار عمل ‏‎.NET‏ (واضحة المعنى والمضمون) في ‏فئاتك لتدعم هذه الحلقة.‏

‏7) ماذا عن الوراثة؟

الوراثة ‏Inheritance‏ للاسف الشديد غير مدعومة، وعملية محاكاة الوراثة (باستخدام ‏التفويض ‏Delegation‏) اثبتت فشلها الذريع. لن اتحدث عن فائدة الوراثة وما تقدمه لك، ‏وسأكتفي بقول: إلي ما يعرف الصقر يشويه!‏

‏8) اسناد قيم الكائنات (ضرورة ‏Set‏)‏

من الاشياء التي اثمرت في نمو الشوائب ‏Bugs‏ في برامج ‏VB6‎‏ هي ضرورة استخدام ‏Set‏ عند الحديث عن عملية اسناد القيم بين الكائنات، اما ان تجاهلها المبرمج فلن ‏تظهر رسالة خطأ، وذلك بسبب الخصائص الافتراضية ‏Default Propeties‏ التي يدعمها ‏VB6‎، فالشيفرة التالية:‏

 ‎
‎' *** VB6 **********‎
MyObject = YourObject
‎‎

لا نعلم هل تسبب خطأ وقت التنفيذ او لا.‏

‏9) فئات الانعكاس ‏Reflection Classes

لاتوجد طريقة واضحة وسهلة في ‏VB6‎‏ تمكننا من معرفة جميع الفئات واعضائها التي ‏تحتويها مكونات ‏COM، وان اردت ذلك عليك اتقان لغة خاصة بـ ‏COM‏ (والتي تسمى ‏Interface Definition Language‏ – (‏IDL‏) تشبه الى حد كبير لغة ‏C‏.‏

ولكن مع ‏VB.NET‏ فيمكن معرفة كل شئ عن مكونات ‏‎.NET‏ عن طريقة مجموعة من ‏الفئات تسمى فئات الانعكاس ‏Reflection Classes‏ واستخدامها يتم بنفس لغة البرمجة ‏VB.NET‏ وليس لغة اخرى.‏

‏10) الاحداث تعتمد على المؤشرات وليس الكائنات.‏

من الاشياء المحزنة والمخزية في ‏VB6‎‏ هو فلسلفة تطبيقه لعملية قنص الاحداث، ‏حيث ان العبارة ‏WithEvents‏ تتبع المؤشر وليس الكائن:‏

‎

 ‎
‎' *** VB6 **********‎
Dim WithEvents X As TestClass

‎...‎
‎...‎

Sub X_EventName()‎
‎...‎
End Sub
‎‎

ان تم نسخ الكائن الى مؤشر اخر وتم قتل المؤشر الاصلي ‏X‏ فلن يتم تنفيذ الحدث ‏EventName‏:‏

‎

 ‎
‎' *** VB6 **********‎
Dim Y As TestClass
Y = X
X = Nothing
‎‎

ولكن مع ‏VB.NET‏ فيمكنك قنص الاحداث استنادا الى كائناتها عوضا عن مؤشراتها.‏

‏11) حفظ بيانات الكائنات او نسخها (تسلسل الكائنات)‏

لاتوجد ميكانيكية واضحة تمكن مبرمجي ‏VB6‎‏ من حفظ بيانات الكائنات الموجودة في ‏الذاكرة، ولا حتى نسخها من كائن الى كائن. وان قمت بعمل ذلك بشكل يدوي وكتابة ‏عشرات الشيفرات المصدرية، فعليك تعديل هذه الشيفرة في كل مرة تضيف خاصية ‏في الفئة. ليس هذا فقط، بل عليك اضافة شيفرات اضافية ايضا في كل مرة تعدل فيها ‏المتغيرات الستاتيكية ‏Static Variables‏ في اجراءات الفئة.‏

ولكن مع ‏VB.NET‏ فهو يمكنك من عمل هذا بفضل مجموعة من الفئات مقدمة من اطار ‏عمل ‏‎.NET‏ تمكنك من نسخ الكائنات وحفظها وهو ما يمسى تسلسل الكائنات ‏Object ‎Serialization‏.‏

‏12) ‏New‏ لا تنشئ الكائن حتى يتم استدعاء احد طرقه‏

الكلمة المحجوزة ‏New‏ تنشئ كائن جديد، في الحقيقة ليس دائما:‏

‎

 ‎
‎' *** VB6 **********‎
Dim obj As New TestClass
‎

‎

عند استخدام ‏New‏ لحظة تعريف المتغير –كما بالشيفرة السابقة- فلن يتم انشاء ‏الكائن حتى تستدعي احد اعضاءه.‏

هذه الخزعبلات لن تجدها مع ‏VB.NET‏.‏

‏13) المرجعية الدائرية ‏Circular Reference

من اكبر الصعاب التي واجهة المبرمجين مشكلة المرجعية الدائرية ‏Circular ‎Reference، والتي تبقي كائنين على قيد الحياة بسبب وجود مؤشر في كل كائن ‏يشير الى الكائن الاخر:‏

‎

 ‎
‎' *** VB6 **********‎
‎' Person.cls ‎في الملف
Public Name As String
Public Brother As Person
‎‎

عن انشاء كائنات من هذه الفئة، واحداث مرجعية دائرية بينهما (عن طريق الخاصية ‏Brother‏):‏

‎

 ‎
‎' *** VB6 **********‎
Dim X As New Person
Dim Y As New Person

X.Name = "‎عباس السريع‎"‎
Y.Name = "‎عبود اللوح‎"‎

Set X.Brother = Y
Set Y.Brother = X
‎‎

فان الكائنين سيبقيان في الذاكرة حتى وان اختف مؤشراتهما، لا تصدق جرب واكتب ‏شيئا مثل:‏

‎

 ‎
Set X = Nothing

Print Y.Brother.Name ' ‎عباس السريع
‎‎

ولكن مع ‏VB.NET‏ فلن تحدث مشكلة المرجعية الدائرية ابدا، وذلك بفضل المجموعة ‏Garbage Collection‏ (‏GC‏) والتي بها ميكانيكية ذكية تزيل كافة الكائنات من الذاكرة ‏والتي لا تشير لها مؤشرات في قابلة للوصول من الشيفرة المصدرية.‏

كان هذا كل ما وددت ذكره حول الفئات والكائنات مع ‏VB6‎، في المرة القادمة سنأخذ ‏جولة سريع حول النماذج ‏Forms‏ ونرى قصور رمز وسبب نجاح ‏VB6‎‏ (النماذج ‏Forms‏).‏

‏-- تركي‏

تم تعديل هذه المشاركة بواسطة المبرمج أحمد في 31 أكتوبر 2005 في 06:34

سبحان الله وبحمده ... سبحان الله العظيم

#4

بعد التحية،

‎‎ثالثا: النماذج والادوات:‏‎‎

قد يعارضني الكثير من المبرمجين حول فكرة تخصيص فقرة عن النماذج والأدوات ‏Forms ‎and Controls، وذلك لانهما لا تتبع (تقنيا) للغة البرمجة ‏VB6‎‏. هذا الكلام صحيح في اغلب ‏لغات البرمجة المرئية ‏Visual Languages، حيث تكون النماذج والادوات ماهي الى فئات ‏من مكتبات مرافقة للغة، ولكن مع ‏VB6‎‏ فالوضع يختلف قليلا، والدليل ان المجموعة ‏Forms‏ ‏ستكون في الذاكرة في (كل) برامجك المنجزة بـ ‏VB6‎‏ حتى لو لم تستخدم نافذة نموذج ‏واحدة، بالاضافة الى كائنات اخرى غير مستخدمة. ومن جانب اخر، دعونا نكون واقعيين قدر ‏الامكان ولنتجرد من عواطفنا واسألكم سؤال: ماهو ‏VB6‎‏ دون النماذج والأدوات؟‏

من هذا المنطلق، سأتحدث اليوم عن النماذج والأدوات ونرى رمز حضارة إمبراطورية ‏VB6‎‏ ‏من رؤية سلبية:‏

‏1) الادوات لا زالت تعتمد ‏ASCII

مع ‏Windows NT، كانت بداية لرؤية مستقبلية واستراتيجية تاريخية بدأتها ‏Microsoft، ‏وهي فلسفة ‏‎‎تدويل التطبيقات ‏Internationalizing Applications‎‏ ‏‎‎، حيث تقتضي ‏هذه الفلسفة، الفصل التام بين الشيفرات المصدرية، وبين الاعدادات الإقليمية ‏Regional ‎Settings‏ ولغة واجهة الاستخدام. ومن هذا المبدأ، بدأت نظم ‏Windows NT‏ هذا التوجه ‏باعتماد الترميز العالمي ‏UNICODE، ليكون حجر الاساس في تمثيل البيانات لجميع ‏المبرمجين.‏

VB6‎‏ قد ادرك (مشكورا) هذا التوجه، ولكنه (كما ذكرت) يطبق ما يسمى ‏‎‎التقليد ‏الأعمى‎‎‏ حيث ان جميع البيانات الحرفية (من النوع ‏String‏) تعتمد ترميز ‏UNICODE‏ ‏لتمثيل البيانات، ولكن النماذج والادوات لازلت تحت الاستعمار ‏ASCII‏. وأعتقد ان الكثير من ‏المبرمجين قد واجه الكثير من الصعوبات في عرض الحروف العربية على الأدوات ان تم ‏لصقها من تطبيقات اخرى، او استخلاصها من نظم قواعد بيانات، وذلك (بالتحديد) ان كان ‏نظام التشغيل لايدعم اللغة العربية مع تطبيقات ‏ASCII، فلكي اتمكن من استخدام برنامج ‏عربي يعتمد توزيع ‏ASCII، علي دائما اللجوء الى لوحة التحكم ‏Control Panel‏ وتغيير ‏الاعدادات لهذه النوعية من البرامج.‏

اما مع ‏Windows Forms .NET‏ (والتي تستخدمها بـ ‏VB.NET‏)، فلن تحمل أي هم حول ‏هذه القضية، اذ ان جميع النماذج والادوات تعتمد ترميز ‏UNICODE‏ بكل كفاءة.‏

‏2) الحاجة الملحة الى التصنيف الفرعي ‏Subclassing

الأحداث ‏Events‏ التي تدعهما نماذج ‏VB6‎‏ قليلة واصبحت غير كافية، السبب الذي حد من ‏مبرمجي ‏VB6‎‏ الى تقديم طلب اللجوء السياسي الى التصنيف الفرعي ‏SubClassing‏. ‏الغرض من هذا هو قنص الرسائل القادمة من نظام التشغيل لاتمام ‏المهام المطلوبة في الوقت المناسب، وبهذا تتمكن من قنص جميع الاحداث التي تريدها.‏

ولكن مع ‏Windows Forms .NET، فلست بحاجة الى التصنيف الفرعي وذلك لوجود جميع ‏الاحداث التي تقنص رسائل نظام التشغيل نيابة عنك.‏

‏3) تقنية المرآة ‏Mirroring

كان حلمي استخدام تقنية المرآة في ‏VB6‎‏ لتطوير واجهات استخدام عربية السمات ‏وخالصة المعاني، ولكن مع -الاسف الشديد- نهاية هذا الحلم اكتشفتها بعد الاستيقاظ من ‏منامي، حيث تتطلب هذه التقنية (حتى تعمل بشكل صحيح) تغيير نمط النافذة الموسع ‏Window Extended Style‏ لحظة انشاء النافذة ‏Create، و ‏VB6‎‏ لايدعم حدث الانشاء، حيث ‏ان اول احداثه هو ‏Load‏ والذي ‏‎‎يتم تفجيره بعد انشاء النافذة‎‎، اما ان حاولت ‏استخدام المشيد ‏Initialize‏ فلن يفيدك ذلك، اذ ان هذا المشيد يتبع لكائن النافذة ‏Form ‎Object‏ وسيتم تنفيذه ‏‎‎قبل الانشاء الفعلي للنافذة‎‎‏.‏

مرت الأيام، وقمت بمراسلة الكثير من المبرمجين طالبا من يعطف علي بكم شيفرة ‏مصدرية، ولكن كل الاجابات تقول لا يمكنك الا توديع النماذج والعودة الى الاجراء ‏CreateWindow‏ (وهو احد اشهر اجراءات ‏API‏).‏

قضيت اكثر من اسبوع، وكتبت برنامج يستخدم الاجراء ‏CreateWindow‏ حتى زاد عدد ‏الشيفرات المصدرية عن المئات، وبعد تفكير جدي في الموضوع اكبر، اكتشفت ان العودة ‏الى ‏نومي واكمال مشاهدة الحلم افضل بعشرات المرات!

لن اطيل الحديث عن معاناتي (الي ايده في المية مش زي الي ايده في النار)، ولكن ‏سأبشركم ببساطة ان لحظة انشاء النافذة يمكنك قنصها في ‏Windows Forms .NET‏ بـ ‏VB.NET‏ عن طريق الخاصية ‏CreateParams‏ وهي قابلة لاعادة القيادة ‏Overridable‏.‏

‏4) نماذج ‏MDI

عند الحديث عن نماذج ‏MDI، فأسلوب ‏VB6‎‏ -الغريب جدا- يعتمد على تحديد نافذة نموذج ‏‏(واحدة فقط) من النوع ‏MDI، وربط كافة النماذج الابنة ‏Child‏ وقت التصميم بها.‏

ولكن مع ‏Windows Forms .NET، فيمكنك ربط نماذج ‏MDI‏ بنماذج ابناء وقت التنفيذ ايضا. ‏ليس هذا فقط، بل يمكنك تغيير مليكة النماذج في أي وقت وفي أي مكان دون أي ‏مشاكل. ويمكن لاي نافذة ان تكون ‏MDI‏ في أي وقت وان تكون (نفس النافذة) ابنة ‏Child‏ ‏ايضا في وقت، كما تستطيع عرض اكثر من نافذة ‏MDI‏ في تطبيق واحد.‏

المزيد ايضا، لا يمكنك وضع الادوات على نماذج MDI، وقد تحتاج الى استخدام اداة PictureBox لعمل ذلك، اذا كان هذا الحل فكرته مرنة جدا، فتذكر متطلبات اشرطة التمرير الذي تتطلب منك كتابة عشرات الشفرات المصدرية ليتم وزنها بالشكل الصحيح، هذا ان علمت ان الاداة PictureBox سيتم محاذاتها ( اعلى او اسفل النافذة) بشكل تلقائي رغما عن انفك.

‏5) النماذج كفئات‏

تنصحك اغلب كتب البرمجة بالتعامل مع النماذج كفئات ‏Classes، فهي تمكنك من تغليف ‏Encapsulate‏ الشيفرات وانشاء كائنات منها. ان كانت النماذج –كما تزعمون- فئات تقليدية، ‏فهل يمكنني تعريف الواجهات ‏Interfaces‏ بها؟؟ وان كان يمكن فماذا عن ‏COM؟ هل ‏استطيع تبادل كائنات النماذج بين مكونات ‏COM؟ طبعا لا. فان قمت بتطوير نافذة نموذج ‏في مكتبة ‏DLL، لن تستطيع تضمينها في مشاريعك الخارجية، ويبقى الحل الوحيد الذي ‏يربطك بهذه النافذة هو استخدام ‏‎‎فئات الجسور ‏Bridge Classes‏ ‏‎‎‏ وهو اسلوب اثبت ‏فشله الذريع –خاصة مع الفئات الكبيرة.‏

ولكن مع ‏Windows Forms .NET‏ فالنماذج هي فئات حقيقية بكل ما تحمله كلمة فئة من ‏معنى، ويمكنك ربطها واستخدامها بين المشاريع المختلفة كما تتعامل مع الكائنات الاخرى ‏دون أي مشاكل.‏

‏6) وراثة النماذج

كما ذكرت في ردودي السابقة، الوراثة غير مدعومة في ‏VB6‎، مما يعني ان وراثة النماذج ‏Form Inheritance‏ ليست مدعومة ايضا. وكما ذكرت ايضا، انني لن اتحدث عن الوراثة وما ‏الذي تجنيه منها.‏

ان كنت تعتقد ان قوالب النماذج ‏Form Templates‏ قد تحاكي الوراثة، فيؤسفني اخبارك ان ‏اعتقادك ليس في محله، فقوالب النماذج ماهي الا ميكانيكة تقوم بتوليد الشيفرات نيابة ‏عنك وقت التصميم وليس التنفيذ، وان اكتشفت احد الأخطاء عليك اعادة تعديل هذه ‏الاخطأء في كافة النماذج المستخدمة.‏

اما مع ‏Windows Forms .NET‏ فالنماذج –كما ذكرت قبل قليل- هي فئات حقيقة، وبالتالي ‏يمكنك وراثتها كما ترث الاجيال من جذورها. وعند اكتشافك لاي خطأ في النافذية القاعدية ‏Base Form، فيكفي تعديل هذا الخطأ فيها وسيتم تطبيقه على كافة النماذج المشتقة ‏منها ‏Derived Forms‏.‏

وماذا عن وراثة الادوات ‏Controls؟؟ ايضا ‏VB6‎‏ لايمكنك من تطوير الاداة، لذلك قد تضطر الى ‏اللجوء الى اسلوب ‏‎‎القاء الاحداث ‏Event Casting‏ ‏‎‎‏ ولكنه محصور على الاحداث التي ‏توفرها وتدعهما الاداة فقط، كما انه يخالف قاعدة التغليف ‏Encapsulation‏ والذي يفصل ‏الشيفرات المصدرية على اكثر من فئة، مما يزيد تعقيد الشيفرة.‏

ولكن مع ‏VB.NET، فيكفي استخدام الكلمة المحجوزة ‏Inherits‏ وارفاقها باسم فئة الادوات ‏التي تود اشتقاقها وراثية.‏

‏7) النماذج المحلية ‏Localized Forms

في الفقرات السابقة ذكرت استراتيجية تدويل التطبيقات وطريقة انجازها، حيث تقتضي ‏الفصل التام بين الشيفرات المصدرية ولغة واجهة الاستخدام او الاعدادات الاقليمية ‏الاخرى. في ‏VB6‎‏ كان يعتمد على ما يسمى ملفات المصادر ‏Resource Files‏ والتي ‏اظهرت ضعفها الكبير، يكفي ان عملية تحريرها لا زالت تعتمد على الكتابة اليدوية في احد ‏جداول هذه المصادر، ونحن الان نتحدث عن البرمجة المرئية ‏Visual Programming‏.‏

ليس هذا فقط، بل ان اقصى ما تستطيع عمله هو تغيير القيم الحرفية على الادوات، حيث ‏تقوم (انت بنفسك) بقراءة النصوص في ملفات المصادر وبرمجتها ليتم عرضها على جبهة ‏الادوات، والتي –في اقصى الاحوال- استبدال قيم الخاصية ‏Caption‏.‏

ولكن مع ‏Windows Forms.NET‏ فحسبك اسناد القيمة ‏True‏ الى الخاصية ‏Localizable‏ ‏وستصبح نافذة النموذج محلية، حيث ان قيم خصائص الادوات ليست محصورة على ‏الخاصية ‏Text، بل تشمل اغلب الخصائص التي تتأثر بالاعدادات الاقليمية المحلية، ‏كخصائص الموقع والحجم. وضع في عين الاعتبار، انك لن تحتاج الى فتح ملفات المصادر ‏لتحرير النصوص ومن ثم كتابة الشيفرات، اذ ان كل ما ستفعله هو نفس الاسلوب المرئي ‏في تصميم النماذج بنافذة مصمم النماذج –دون كتابة حرف واحد من الشيفرة المصدرية، ‏ويمكنك اعداد التصاميم المختلفة لكافة الاعدادات الاقليمية المحلية في الخاصية ‏Language‏.‏

هذه (بعض) المقتطفات من نماذج وادوات ‏VB6‎‏. في المرة القادمة سنحاول عرض مجموعة ‏كبيرة من الشوائب ‏Bugs‏ الفاضحة في ‏VB6‎، والتي تزيد يوما بعد يوم.‏ وفي الختام، اطار عمل NET لن يجعلك مستخدما، بل على العكس من ذلك، سيجعلك مبرمج اكثر حرفية وسيفتح لك افاقا واسعة لم تكن تفكر بها يوما من الايام.

‏-- تركي‏

تم تعديل هذه المشاركة بواسطة المبرمج أحمد في 31 أكتوبر 2005 في 06:16

سبحان الله وبحمده ... سبحان الله العظيم

#5

وبهذا تكون المقالة قد انتهت بأجزاءها الأربعة ، أتمنى لكم الاستفادة منها .

سبحان الله وبحمده ... سبحان الله العظيم

#6

أقل شيء ممكن أقوله برافو

فعلا ممتاز ومتميز

في الحقيقة انا اعتقد انه مبرمجين في بي ما قبل دوت نت بدأو يعوا الحكاية، ليس فقط لأن اللغة الجديدة مبنية بالكامل علي أساس ال OOP او التغييرات الجذرية في اللغة و قوتها الظاهرة و الجالية أو حتي الدعم الهائل لها من قبل ال Framework.Net و لكن لأن شركات البرمجة بالفعل تطلب VB.NET Developers بشدة هذه الايام و السوق التكنولوجي كله يعرف ذلك و طبعا ولاد عمنا مبرمجين ال #C مطلوبين أيضا و لذلك من يتأخر و يعاند (ذنبه علي جنبه :D)

ألف شكر أخي أحمد علي المقالات الرائعات

Oracle 10G Certified Professional Developer.

عودة بعد 3 سنوات غياب، ان شاء الله سوف اتكلم معكم قريبا احبائي

#7

ليس شرطًا الهجرة إلى .Net وترك VB6 تمامًا ، ولكن تعلمها بالإضافة إلى VB6 .

سبحان الله وبحمده ... سبحان الله العظيم

#8

موضوع اكثر من رائع

بارك الله فيك اخى المبرمج احمد

Hany Saad Mostafa

ITI (Information Technology Institute) l

SD Dept.-Teaching Assistant

---

اسألكم الدعاء بظهر الغيب

#9
اقتباس
والتي أخذتها من موقع vb4arab.com ( الراحل )

سؤال جانبي...

متى رحل هذا الموقع وكيف؟؟

انا لله وانا اليه راجعون

طبتم واهتديتم :)

===================================

إقرأ معي

رابط متجدد لكتاب أقرؤه فشاركني فيه

======

فضائح الرافضة ومخازيهم حين يكتب عنها أحد خصومهم فهذا شيء متوقع ،فإن كتب عنها أحدهم فهو شيء غير مألوف ، وإن كان الكاتب أحد مراجعهم وأخص خواصهم فهذا شيء متناهي الغرابة ، وإن علمت أن الكاتب قد قتل بعد نشر الكتاب فقد حان وقت قراءة الكتاب

الكتاب :

حسين الموسوي - لله تم للتاريخ ، كشف الأسرار وتبرئة الأئمة الأطهار

اضغط على الصورة لتحميل الكتاب

%E1%E1%E5%20%CB%E3%20%E1%E1%CA%C7%D1%ED%CE.jpg

-----------

كتب سابقة

سعد الدين الشاذلي - مذكرات حرب أكنتوبر

#10

ههههههه

ايه ده انقلاب و ﻻ ايه ... مشرف قسم الفيجوال 6 يدفع الناس الى الانتقال عندنا

يا مرحبا يا مرحبا هههههههه

==========

شكرا لك أخي احمد على نقل هذه المقالات حتى تحفظ هنا بعدما ضاعت في المنتدى الجميل الذي و الله افتقده كثيرا

تم تعديل هذه المشاركة بواسطة crazy-man في 31 أكتوبر 2005 في 18:04

#11
ايهاب عثمان كتب:
سؤال جانبي...

متى رحل هذا الموقع وكيف؟؟

انا لله وانا اليه راجعون

اخى الفاضل لقد رحل الموقع منذ عام تقريبا

والسبب لا احد يعلمه

اخى احمد

لكل كل الشكر على هذه المقالة الرائعة

لقد قرءات جزء منها قديما واحمد الله انى وجدتها ثانيا

الف الف الف شكر اخى

الايمان +الحلم +العلم +العمل = النجاح

ما اسهل ان تنجح ... وما اصعب ان تحافظ على نجاحك

#12
اقتباس
ههههههه

ايه ده انقلاب و ﻻ ايه ... مشرف قسم الفيجوال 6 يدفع الناس الى الانتقال عندنا

يا مرحبا يا مرحبا هههههههه

الأسباب التي جعلتني أنشئ هذا الموضوع هي كالتالي :

1- أنا أرى أنه من واجبي كمشرف أن أوجه الأعضاء إلى ما ينفعهم في حياتهم العلمية والعملية .

ولهذا لا يسمى انقلاب بل نفع للأعضاء وتطوير قدراتهم إلى الأفضل .

2- ومن واجبي أيضًا المحافظة على تراث "vb4arab.com" الذي افتقدناه لسبب لا أعلمه ولكنني سأحاول معرفته بعد أن حصلت على رقم وعنوان المشرف "عبد الله" صاحب الموقع الراحل .

سبحان الله وبحمده ... سبحان الله العظيم

#13
اقتباس
ليس شرطًا الهجرة إلى .Net وترك VB6 تمامًا ، ولكن تعلمها بالإضافة إلى VB6 .

معظم مبرمجي VB.NET كانوا مبرمجي VB6 :D

Oracle 10G Certified Professional Developer.

عودة بعد 3 سنوات غياب، ان شاء الله سوف اتكلم معكم قريبا احبائي

#14

نداء إلى كل مبرمجي فيجوال بيسك 6 بأن يتعلموا .Net لمواكبة التطور ، ستجدون العديد من التسهيلات فيها مما لم تجدوه في VB6 !!!

سبحان الله وبحمده ... سبحان الله العظيم

#15

السلام عليكم

اقتراح عمل موضوع مثبت تبدأ فيه سلسلة دروس لتعريف مبرمجى فيجوال 6 بالدوت نت , وتسهيل نقلهم اليه

و يتم وضع سلسلة دروس لنقل مبرمجى فيجوال 6 الى دوت نت بالتدريج وشرح الفروق بين اللغتين لتسهيل عملية التحويل

ويشرف على مثل هذه الدروس الاعضاء الذين لهم خبرة باللغتين مثل : المبرمج احمد , crazy man, hazoom ,solo.net وباقى الاعضاء الذين لهم خبرة باللغتين

ايه رأيكم ؟؟؟ :)

Hany Saad Mostafa

ITI (Information Technology Institute) l

SD Dept.-Teaching Assistant

---

اسألكم الدعاء بظهر الغيب

#16

بارك الله فيك يأخى و زادك من علمة

و لكن نريد دروس حقيقية فى تعليم الفبيجوال بيسيك دوت نت

و تكون الدروس عبارة دورة عن كيفية الانتقال من البيسيك 6 الى البيسيك دوت نت

ثم دروس عن الجديد فى الفيجوال بيسي دوت نت و بعدها نبداء دروس مكثفة ..

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

أحمد خميس راشد

جمهورية مصر العربية

Bibo_spider@hotmail.com

#17

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

بصراحة أنا كنت من المتحيزين لVB6 و رافض ل VB.NET ولكن بعد أن علمت على VB.NET الرائع سحرني حتى تركتك الVB6 على الرغم من أني عزمت على التوفيق بينهما ..فعلا بيئة رائعة و مرنة أكثر بكثيرمن صديقنا القديم الذي لايزال أعز أصدقائنا VB6

ولكن نصيحتي للكل جربوا اللغة الجديدة كل العالم يتجه نحوها

#18

حــاولت تنزيل Visual Basic .net 2005

ولكنني فوجئت برسالة ان البرنامج لا يمكن تثبيته علي نظام تشغيل ملينيوم 98 أو أي نظام قبل ذلك

وطلب مني تغير نظام التشغيل الي ويندوز 2000 او أعلي من ذلك

فهل فعلا يجب علي ان اثبت بالجهاز نظام تشغيل 2000 أو xp

#19
اقتباس
فهل فعلا يجب علي ان اثبت بالجهاز نظام تشغيل 2000 أو xp

نعم

#20

افضل لغة شنهي ؟

السي بلس بلس ام السي شارب ام الفيجوال بيسك 6 ام الدوت نت ام بي اتش بي ام ماذا

#21

أقوى وأصعب لغة هي ++C

أبطأ وأسهل لغة هي VB6

#22

نقاش أكاديمي سبب لي شعور بالعجز بعتباري مبتداء كلهم كويسين بس المشكله نحن المبرمجين نركز على التفاصيل الدقيقة المعقدة وننسى المهام الرئيسية المشتركة وهذا يذكرني بحال برفسور في أستراليا قضى نصف عمره في دراسة حياته نبات لا ينمو الا على الشواطى الاسترالية وفي مواسم معينة وبكميات محدوه؟! لغات البرمجة كلها رائعة القديمة والجديدة وأنا أفضل اللغات الغير مرئية أو التصميم في بيئة غير مرئية فهو أشبه ما يكون بأفلام الرعب الامريكية. ها ها ها

شكرا للجميع

تم تعديل هذه المشاركة بواسطة أسير الحرمان2 في 7 ديسمبر 2005 في 18:15

#23

الله يوفق الجميع

يارب :rolleyes:

Mimo

040.gif

#24

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

اخي الكريم ارجو المساعدة والاجابة على سؤالي المعروض

باسم ابن الانبار

#25

هل تنصحونني بتعلم VB6 أم Delphi ؟

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