05-10-12, 06:00 PM
كاتب الموضوع : silverlight
بسم الله الرحمن الرحيم
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
مقدمـــــــــــة:
يوجد في الدوت نت كلاسا اسمه OutAttribute وهو موجود تحديدا في System.Runtime.InteropServices NameSpace وفي موضوعنا هذا سنوضح كيفية استخدام هذا الكلاس ولمزيد من المعلومات عن هذا الكلاس يمكنكم زيارة هذا اللينك
المثال الأول:
لنفرض أننا لدينا String Array تم تعريفها كالتالي وكما ستلاحظون فهي تحتوي علي أرقام فقط
كود :
Dim arr As String() = {10, 100, 50, 30, 40, 200, 5, 12}
غالبا هنا ما نقوم بكتابة دالتين للحصول علي اقل قيمة و أعلي قيمة وهاتان الدالتان سيكون الكود الخاص بهما كالأتي
كود :
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
المثال الثاني:
الأن كيف نستخدم الكلاس 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
ولكي نستخدم الروتين أو الكود أعلاه علينا أن نقوم بتعريف المدخلات كالأتي
تعريف متغير يعبر عن 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)
حيث هنا نعيد مساواة القيم ثانية مع ما يناظرها
كود :
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
طبعا ولأنني أعشق الجرافكس فمن الصعب أن أترك المقال بدون أن أضع أمثلة توضح كيفية استخدام الكلاس 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
كود :
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
كود :
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
إن شاء الله في المشاركات التالية سأحاول أن أضع بعض الأمثلة الإضافية
بالتوفيق للجميع وتقبلوا تحياتي
أخوكم عمر