تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال- أفكار في الدوت نت Enum
#5
كما تلاحظون في الأكواد اعلاه انه في كل مرة نحاول أن نقوم بتحويل المتغيرات الموجودة داخل أي Enum وهي عبارة عن Strings إلي قيمتها العادية فإننا نبني دالة لكي نسترجع القيمة وربما لاحظتم في المثال الثالث أعلاه الدوال التالية


كود :
Private Function GetHatchStyleFromString(ByVal hatchString As String, ByVal ignoreCase As Boolean) As HatchStyle
Return CType([Enum].Parse(GetType(HatchStyle), hatchString, ignoreCase), HatchStyle)
End Function

Private Function GetContentAlinmentFromString(ByVal hatchString As String, ByVal ignoreCase As Boolean) As ContentAlignment
Return CType([Enum].Parse(GetType(ContentAlignment), hatchString, ignoreCase), ContentAlignment)
End Function

Private Function GetKnowColorString(ByVal ColorName As String, ByVal ignoreCase As Boolean) As KnownColor
Return CType([Enum].Parse(GetType(KnownColor), ColorName, ignoreCase), KnownColor)
End Function

Private Function GetDashStyleString(ByVal ColorName As String, ByVal ignoreCase As Boolean) As DashStyle
Return CType([Enum].Parse(GetType(DashStyle), ColorName, ignoreCase), DashStyle)
End Function
بالتأكيد ليس منطقيا ان نكتب دالة لكل Enum علي حدة بل الأفضل أن نكتب دالة واحدة فقط نستفيد بها في استرجاع قيمة الثوابت الموجودة داخل كل Enum وبهذا نقلل من حجم الكود المكتوب.

لذلك الدالة التالية يمكن أن تحل محل اي دالة من الدوال الأربعة أعلاه بل أيضا من الممكن استخدامها مع أي Enum وكما ستلاحطون فإنه قد تم استخدام Generics لبناء الدالة ..........


كود :
Private Function StringToEnum(Of T)(ByVal value As String, ByVal ignoreCase As Boolean) As T
If [Enum].IsDefined(GetType(T), value) Then
Return CType([Enum].Parse(GetType(T), value, ignoreCase), T)
End If
Throw New ArgumentException("value is not Enum")
End Function
والكود التالي يوضح التعديلات الجديدة بالمثال الثالث وستلاحظون ان الكود اصبح اقل من الكود الموجود بالمثال الثالث


كود :
Imports System.Drawing.Drawing2D

Public Class Form1

Private align As ContentAlignment = ContentAlignment.TopLeft
Private clr As Color = Color.Empty
Private hatch As HatchStyle = Nothing
Private pType As DashStyle = DashStyle.Dash

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
FillComboBoxsWithEnumData()
End Sub

Private Sub FillComboBoxsWithEnumData()
' Fill ComboBox1 with HatchStyle Enum
For Each hatchStyleObject As Object In [Enum].GetValues(GetType(HatchStyle))
If Not ComboBox1.Items.Contains(hatchStyleObject) Then ComboBox1.Items.Add(hatchStyleObject)
Next

' Fill ComboBox2 with ContentAlignment Enum
For Each contentAlignmentObject As Object In [Enum].GetValues(GetType(ContentAlignment))
If Not ComboBox2.Items.Contains(contentAlignmentObject) Then ComboBox2.Items.Add(contentAlignmentObject)
Next

' Fill ComboBox3 with KnowColor Enum
For Each knownColorObject As Object In [Enum].GetValues(GetType(KnownColor))
If Not ComboBox3.Items.Contains(knownColorObject) Then ComboBox3.Items.Add(knownColorObject)
Next

' Fill ComboBox4 with DashStyle Enum
For Each dashStyleObject As Object In [Enum].GetValues(GetType(DashStyle))
If Not ComboBox4.Items.Contains(dashStyleObject) Then ComboBox4.Items.Add(dashStyleObject)
Next
End Sub

Private Function StringToEnum(Of T)(ByVal value As String, ByVal ignoreCase As Boolean) As T
If [Enum].IsDefined(GetType(T), value) Then
Return CType([Enum].Parse(GetType(T), value, ignoreCase), T)
End If
Throw New ArgumentException("value is not Enum")
End Function

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
hatch = StringToEnum(Of HatchStyle)(Me.ComboBox1.SelectedItem.ToString, True)
Invalidate()
End Sub

Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
align = StringToEnum(Of ContentAlignment)(Me.ComboBox2.SelectedItem.ToString, False)
Invalidate()
End Sub

Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged
clr = Color.FromKnownColor(StringToEnum(Of KnownColor)(Me.ComboBox3.SelectedItem.ToString, True))
Invalidate()
End Sub

Private Sub ComboBox4_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox4.SelectedIndexChanged
pType = StringToEnum(Of DashStyle)(Me.ComboBox4.SelectedItem.ToString, True)
Invalidate()
End Sub

' Paint Something in the Form
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)

Dim TestRectangle As New Rectangle(10, 10, 200, 200)
Dim frameRect As Rectangle = TestRectangle
frameRect.X -= 4
frameRect.Y -= 4
frameRect.Width += 8
frameRect.Height += 8

Using obrush As New Drawing2D.LinearGradientBrush(frameRect, ControlPaint.Light(clr), ControlPaint.Dark(clr), Drawing2D.LinearGradientMode.Vertical)
e.Graphics.FillRectangle(obrush, frameRect)
Using framePen As New Pen(Brushes.Black)
framePen.DashStyle = pType
e.Graphics.DrawRectangle(framePen, frameRect)
End Using
End Using

Using hBrush As New Drawing2D.HatchBrush(hatch, clr)
e.Graphics.FillRectangle(hBrush, TestRectangle)
Using borderPen As New Pen(clr)
borderPen.DashStyle = pType
e.Graphics.DrawRectangle(borderPen, TestRectangle)
End Using
End Using

If Me.Text IsNot Nothing Then
Dim format As New StringFormat()
format.LineAlignment = StringAlignment.Center
format.Trimming = StringTrimming.EllipsisCharacter
Select Case align
Case ContentAlignment.BottomCenter
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Far
Exit Select
Case ContentAlignment.BottomLeft
format.Alignment = StringAlignment.Near
format.LineAlignment = StringAlignment.Far
Exit Select
Case ContentAlignment.BottomRight
format.Alignment = StringAlignment.Far
format.LineAlignment = StringAlignment.Far
Exit Select
Case ContentAlignment.MiddleCenter
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Center
Exit Select
Case ContentAlignment.MiddleLeft
format.Alignment = StringAlignment.Near
format.LineAlignment = StringAlignment.Center
Exit Select
Case ContentAlignment.MiddleRight
format.Alignment = StringAlignment.Far
format.LineAlignment = StringAlignment.Center
Exit Select
Case ContentAlignment.TopCenter
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Near
Exit Select
Case ContentAlignment.TopLeft
format.Alignment = StringAlignment.Near
format.LineAlignment = StringAlignment.Near
Exit Select
Case ContentAlignment.TopRight
format.Alignment = StringAlignment.Far
format.LineAlignment = StringAlignment.Near
Exit Select
End Select
Dim fnt As New Font("Times /new Roman", 25.0F, FontStyle.Bold)
Using sb As New SolidBrush(Color.White)
e.Graphics.DrawString(Me.Text, fnt, sb, TestRectangle, format)
End Using
End If

End Sub

End Class
الكود الموجود بالمرفقات بنسخة الفيجوال استوديو 2010

في المشاركات اللاحقة سوف نناقش كيف نستفيد أكثر من Enum و بطرق أخري مختلفة

تقبلوا تحياتي ولا تنسونا في دعائكم..............

أخوكم عمر


الملفات المرفقة
.rar   Enum_Example4_src.rar (الحجم : 67.58 ك ب / التحميلات : 50)
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
مقال- أفكار في الدوت نت Enum - بواسطة Raggi Tech - 05-10-12, 01:19 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - مقدمة RaggiTech 3 6,338 30-07-21, 05:14 PM
آخر رد: kebboud
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,443 30-06-19, 10:41 AM
آخر رد: invocker
  التــعامل مع cmd من خلال الدوت نت مبتدئ في الاحتراف 3 4,032 02-06-18, 12:36 AM
آخر رد: YousefOkasha
  أفكار في الجرافكس AlignRectangle silverlight 0 1,713 14-10-17, 02:02 PM
آخر رد: silverlight
  تفقيط الارقام فى الدوت نت مبرمج أوتار 17 13,400 20-04-17, 12:21 PM
آخر رد: محمد بوقزاحة
  [مقال] تشغيل برمجيات الدوت نت بدون تنصيب النت فروم ويرك m0075 13 11,092 13-02-14, 08:29 PM
آخر رد: Omar Mekkawy
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 3,681 06-10-12, 12:23 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 2,465 06-10-12, 12:20 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Skin Control RaggiTech 0 2,620 06-10-12, 12:08 AM
آخر رد: RaggiTech
  مقال- كيف تصنع ملفات المساعدة Help Files وتربطها مع برنامجك RaggiTech 0 3,410 05-10-12, 07:30 PM
آخر رد: RaggiTech

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


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