تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال - أفكار في الدوت نت OutAttribute Class
#1
كاتب الموضوع : silverlight


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

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

مقدمـــــــــــة:


يوجد في الدوت نت كلاسا اسمه OutAttribute وهو موجود تحديدا في System.Runtime.InteropServices NameSpace وفي موضوعنا هذا سنوضح كيفية استخدام هذا الكلاس ولمزيد من المعلومات عن هذا الكلاس يمكنكم زيارة هذا اللينك

المثال الأول:

لنفرض أننا لدينا String Array تم تعريفها كالتالي وكما ستلاحظون فهي تحتوي علي أرقام فقط


كود :
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}
الأن نحن نريد أن نحصل علي أعلي قيمة وأقل قيمة للأرقام الموجودة داخل هذه Array
غالبا هنا ما نقوم بكتابة دالتين للحصول علي اقل قيمة و أعلي قيمة وهاتان الدالتان سيكون الكود الخاص بهما كالأتي


كود :
Private Function GetMaximumValue(ByVal StringArr As String()) As Integer
Dim arr As New HashSet(Of Integer)
For i As Integer = 0 To StringArr.Count - 1
arr.Add(StringArr(i))
Next
Return arr.Max
End Function

Private Function GetMinimumValue(ByVal StringArr As String()) As Integer
Dim arr As New HashSet(Of Integer)
For i As Integer = 0 To StringArr.Count - 1
arr.Add(StringArr(i))
Next
Return arr.Min
End Function
والكود التالي يوضح كيفية استخدام هاتان الدالتان


كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}
Dim min As Integer = GetMinimumValue(arr)
Dim max As Integer = GetMaximumValue(arr)
Me.Text = min + max
End Sub
ملحوظة هامة علي المثال الأول : الكود الموجود بالمثال أعلاه يحتاج الفيجوال استوديو 2008 علي الأقل والسبب في ذلك هو أنني استخدمت الكلاس HashSet وهو موجود فقط في الدوت نت 3.5 فيما فوق

المثال الثاني:

الأن كيف نستخدم الكلاس OutAttribute للحصول علي نفس النتائج الموجودة بالمثال الأول ولكن يجب أن نتفهم أننا وعند استخدام الكلاس OutAttribute فإن البيانات المرتبطة به يتم تمريرها باستخدام ByRef فقط حيث أننا لو مررنا البيانات باستخدام ByVal فإننا لن نحصل علي شئ

ولمزيد من المعلومات عن الفرق بين ByVal و ByRef يوجد بالمنتدي موضوعا كتبه الأخ الفاضل مروان ويمكنكم الاطلاع عليه في هذا اللينك الفرق بين ByVal و ByRe

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


كود :
Private Sub GetMaximumMinimumValue(ByVal StringArr As String(), <Out()> ByRef max As Integer, <Out()> ByRef min As Integer)
Dim arr As New HashSet(Of Integer)
For i As Integer = 0 To StringArr.Count - 1
arr.Add(StringArr(i))
Next
max = arr.Max
min = arr.Min
End Sub
نلاحظ في الكود أعلاه كيفية استخدام الكلاس OutAttribute Class وستلاحظ عزيزي القارئ أننا مررنا القيمتان min و max باستخدام ByRef والهدف من استخدامنا الكلمة <Out()> قبل كل من المتغير min و المتغير max في الروتين أعلاه هو أننا نحتاج الي أن تكون النتائج المراد الحصول عليها هما هاتان المتغيران وكل ما فعلناه هو ربطهم بالمتغير StringArr فقط لا غير

ولكي نستخدم الروتين أو الكود أعلاه علينا أن نقوم بتعريف المدخلات كالأتي

تعريف متغير يعبر عن String Array كالتالي


كود :
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}

تعريف متغيران عبارة عن Integer ولا نعطي لهم اي قيمة


كود :
Dim min As Integer
Dim max As Integer
الأن نمرر هذان المتغيران الي الروتين و سنلاحظ هنا اننا مررنا المتغيران وبالرغم من أن قيمتهم غير معرفة


كود :
GetMaximumMinimumValue(arr, max, min)
السطر التالي من الكود هو ما نحتاجه لحصول علي قيم فعلية للمتغيران min و max
حيث هنا نعيد مساواة القيم ثانية مع ما يناظرها


كود :
max = max
min = min

الأن لنستخدم القيمان التي حصلنا عليهم كما نريد والكود التالي يوضح الشكل النهائي للكود


كود :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}
Dim min As Integer
Dim max As Integer
GetMaximumMinimumValue(arr, max, min)
max = max
min = min
Me.Text = min + max
max = Nothing
min = Nothing
End Sub
ملحوظة هامة علي المثال الثاني : الكود الموجود بالمثال أعلاه يحتاج الفيجوال استوديو 2008 علي الأقل والسبب في ذلك هو أنني استخدمت الكلاس HashSet وهو موجود فقط في الدوت نت 3.5 فيما فوق


طبعا ولأنني أعشق الجرافكس فمن الصعب أن أترك المقال بدون أن أضع أمثلة توضح كيفية استخدام الكلاس OutAttribute في +GDI

المثال الثالث:

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


كود :
Private Sub GetRectCenterPoint(ByVal r As Rectangle, <Out()> ByRef pt As Point)
pt.X = ((r.Left + r.Right) / 2)
pt.Y = ((r.Top + r.Bottom) / 2)
End Sub
ثم في الحدث Paint يمكن أن نستخدم االروتين بالشكل التالي


كود :
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)

' تعريف المستطيل
Dim boundRect As New Rectangle(10, 10, 100, 100)
' تعريف نقطة ما بدون اعطاؤها اي قيمة
Dim pt As Point
' تمرير النقطة الي الروتين أعلاه
GetRectCenterPoint(boundRect, pt)
' الحصول علي القيمة الفعلية لهذه النقطة
pt = pt
' ثم نرسم شيئا ما مثل المستطيل
e.Graphics.DrawRectangle(Pens.Black, boundRect)
' ثم نسخدم النقطة التي حصلنا عليها لنرسم خطا من منتصف المستطيل الي نقطة بداية المستطيل علي الفورم
e.Graphics.DrawLine(Pens.Red, pt, boundRect.Location)

' هنا يمكننا ان نعيد قيمة النقطة الي صفر او لا شئ حسب رغبتنا
pt = Nothing

End Sub

المثال الرابع:

ويمكن إعادة كتابة الروتين أعلاه والموجود بالمثال الثالث بالشكل التالي أيضا


كود :
Private Sub GetRectCenterPoint(ByVal r As Rectangle, <Out()> ByRef x As Integer, <Out()> ByRef y As Integer)
x = ((r.Left + r.Right) / 2)
y = ((r.Top + r.Bottom) / 2)
End Sub
ثم في الحدث Paint أيضا يمكن أن نستخدم االروتين بالشكل التالي


كود :
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)

' تعريف المستطيل
Dim boundRect As New Rectangle(10, 10, 100, 100)
' تعريف متغيران ما بدون اعطاؤها اي قيمة

Dim Xcenter As Integer
Dim Ycenter As Integer

' نمرر القيمتان الي الروتين
GetRectCenterPoint(boundRect, Xcenter, Ycenter)
' الحصول علي القيم الفعلية
Xcenter = Xcenter
Ycenter = Ycenter
' ثم نستخدم البيانات لنرسم ما نريد
' نرسم شيئا ما مثل المستطيل
e.Graphics.DrawRectangle(Pens.Black, boundRect)

' ثم نسخدم القيمتان التي حصلنا عليهما لنرسم خطا من منتصف المستطيل الي نقطة بداية المستطيل علي الفورم
e.Graphics.DrawLine(Pens.Red, New Point(Xcenter, Ycenter), boundRect.Location)

End Sub
بالنهاية ومن المؤكد أنه يمكن ان نكتب الكثير من الأفكار المماثلة للأمثلة أعلاه بحيث نستفيد من الكلاس OutAttribute بأكثر من أسلوب وتحديدا في Data Marshalling وخاصة مع Managed Code والأن الأمر متروك لك عزيزي القارئ لتكتشف كيفية عمل ذلك بنفسك

إن شاء الله في المشاركات التالية سأحاول أن أضع بعض الأمثلة الإضافية

بالتوفيق للجميع وتقبلوا تحياتي
أخوكم عمر
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Control Finder Class silverlight 3 74 03-12-16, 06:11 AM
آخر رد: أبو عمر
  [مقال] تشغيل برمجيات الدوت نت بدون تنصيب النت فروم ويرك m0075 13 4,145 13-02-14, 08:29 PM
آخر رد: Omar Mekkawy
  تفقيط الارقام فى الدوت نت مبرمج أوتار 16 3,746 30-08-13, 01:01 AM
آخر رد: abatenovtch
  التــعامل مع cmd من خلال الدوت نت مبتدئ في الاحتراف 2 534 24-04-13, 07:58 PM
آخر رد: مبتدئ في الاحتراف
  معلومة : Partial Class RaggiTech 1 548 06-10-12, 11:03 PM
آخر رد: RaggiTech
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 1,249 06-10-12, 12:23 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 366 06-10-12, 12:20 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Skin Control RaggiTech 0 534 06-10-12, 12:08 AM
آخر رد: RaggiTech
  مقال- كيف تصنع ملفات المساعدة Help Files وتربطها مع برنامجك RaggiTech 0 731 05-10-12, 07:30 PM
آخر رد: RaggiTech
  مقال- تطوير الفورم رسم الفورم باستخدام +GDI وتحريكه Moving و تغيير أبعاده Resize RaggiTech 2 884 05-10-12, 07:00 PM
آخر رد: RaggiTech

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


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