22-12-16, 11:06 PM
الكلاسان التاليان الهدف منهما تحويل اسم الملف و مكانه علي الكمبيوتر الي IntPtr ثم باستخدام هذا IntPtr نقوم بفتح الملف و قراءته
الكلاسان مكتوبان بنسخة الفيجوال استوديو 2015
وربما الكلاسلات لا تصلح للعمل من النسخ القديمة من الفيجوال استوديو
عموما إن وجدت أخطاء في الكلاسلات عند استخدامها مع الفيجوال استوديو الخاص بك رجاء أن تترك كومنت و سأوضح لك لاحقا كيفية اعادة كتابتهم ليتناسبا مع النسخ القديمة من الفيجوال استوديو
الكلاس الأول
هذا الكلاس نمرر له البيانات او المدخلات علي هيئة String ومن ثم يتم تحويل String الي IntPtr
يمكن استخدام الكلاس منفردا
الكلاس الثاني
هذا الكلاس نمرر له اسم الملف و يقوم بتحويل الملف الي مصفوفة من Byte و ايضا الي MemoryStream و هذا الكلاس مناسب للعمل مع اي ملف من اي نوع
يمكن استخدام الكلاس منفردا كيفما يحلو للمستخدم
الاستخدام
و هنا سوف استخدم الكلاسان لقراءة صورة موجودة في فهرس المشروع
عن طريق تحويل اسم الملف ومكانه علي الكمبيوتر الي IntPtr ومن ثم عرض الصورة كخلفية للفورم
لاحقا ربما اٌقوم بالتعديل علي الكلاس الثاني CairoFile لتكون المدخلات له عبارة عن IntPtr و ليس String
اتمني يكون الكلاسان مفيدان للبعض منكم
الكلاسان مكتوبان بنسخة الفيجوال استوديو 2015
وربما الكلاسلات لا تصلح للعمل من النسخ القديمة من الفيجوال استوديو
عموما إن وجدت أخطاء في الكلاسلات عند استخدامها مع الفيجوال استوديو الخاص بك رجاء أن تترك كومنت و سأوضح لك لاحقا كيفية اعادة كتابتهم ليتناسبا مع النسخ القديمة من الفيجوال استوديو
الكلاس الأول
هذا الكلاس نمرر له البيانات او المدخلات علي هيئة String ومن ثم يتم تحويل String الي IntPtr
يمكن استخدام الكلاس منفردا
PHP كود :
Public Class CairoIntPtr
Inherits MarshalByRefObject
Implements IDisposable
Private _disposed As Boolean
Private _handle As IntPtr
Public Sub New(s As String)
Dim func As Func(Of String, IntPtr) = Function(str)
Dim ptr As IntPtr = CType(Nothing, IntPtr)
ptr = System.Runtime.InteropServices.Marshal.StringToHGlobalUni(str)
Return ptr
End Function
Dim zero As Func(Of IntPtr) = Function() IntPtr.Zero
_handle = If(Not String.IsNullOrEmpty(s), func(s), zero)
End Sub
Public ReadOnly Property Handle() As Integer
Get
Return Me._handle
End Get
End Property
Public ReadOnly Property ToInt32 As Int32
Get
Return Convert.ToInt32(Me.Handle)
End Get
End Property
Public ReadOnly Property ToInt64 As Int64
Get
Return Convert.ToInt64(Me.Handle)
End Get
End Property
Private Sub DisposeInternal()
If Me._handle <> 0 Then
Dim action As Action(Of IntPtr) = Sub(ptr As IntPtr)
System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr)
End Sub
action(_handle)
Me._handle = 0
End If
End Sub
' هذه الدالة يفترض أن تكون في كلاس أخر
' لكنني كتبتها هنا من أجل توضيح الفكرة
Public Shared Function IntPtrToString(ptr As IntPtr) As String
Dim result As String = System.Runtime.InteropServices.Marshal.PtrToStringUni(ptr)
Return result
End Function
Protected Overridable Sub Dispose(disposing As Boolean)
If _disposed Then
Return
End If
If disposing Then
Me.DisposeInternal()
End If
_disposed = True
End Sub
Public Overrides Function Equals(obj As Object) As Boolean
Return obj IsNot Nothing AndAlso obj.[GetType]() Is MyBase.[GetType]() AndAlso (CType(obj, CairoIntPtr))._handle = Me.Handle
End Function
Public Overrides Function GetHashCode() As Integer
Return Me._handle.GetHashCode()
End Function
Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
End Class
الكلاس الثاني
هذا الكلاس نمرر له اسم الملف و يقوم بتحويل الملف الي مصفوفة من Byte و ايضا الي MemoryStream و هذا الكلاس مناسب للعمل مع اي ملف من اي نوع
يمكن استخدام الكلاس منفردا كيفما يحلو للمستخدم
PHP كود :
Public Class CairoFile
Private _data As Byte()
Public Sub New(filePath As String)
Me._data = (If(Not String.IsNullOrEmpty(filePath), (New Lazy(Of Byte())(Function() IO.File.ReadAllBytes(filePath))).Value, (New Lazy(Of Byte())(Function() New Byte() {})).Value))
End Sub
Public ReadOnly Property ToBytes As Byte()
Get
Return Me._data
End Get
End Property
Public ReadOnly Property ToStream As IO.MemoryStream
Get
Return New IO.MemoryStream(ToBytes())
End Get
End Property
End Class
الاستخدام
و هنا سوف استخدم الكلاسان لقراءة صورة موجودة في فهرس المشروع
عن طريق تحويل اسم الملف ومكانه علي الكمبيوتر الي IntPtr ومن ثم عرض الصورة كخلفية للفورم
لاحقا ربما اٌقوم بالتعديل علي الكلاس الثاني CairoFile لتكون المدخلات له عبارة عن IntPtr و ليس String
PHP كود :
Dim filePath As String = ".\tmp-0.gif"
Dim ptr As IntPtr = New CairoIntPtr(filePath).Handle
If IO.File.Exists(CairoIntPtr.IntPtrToString(ptr)) Then
Dim cf As New CairoFile(filePath)
Me.BackgroundImageLayout = ImageLayout.Center
Me.BackgroundImage = Image.FromStream(cf.ToStream)
End If
اتمني يكون الكلاسان مفيدان للبعض منكم