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

ما الجديد في ال VB.NET

مغلق
بدأه Abu Sabreen في 3 يوليو 2005 · 18 رد · 3,405 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

نظرا لكثرة ترددات كثير من المبرمجين الفيجوال الى الانتقال الى هذه اللغة فقد اردت وضع ميزات هذه اللغة

ملاحظة : الميزات منقولة من كتاب.

إنّ التطويرات التي لحقت بـ VB.Net من الكثرةِ بحيثُ لن نستطيع أن نحيطَ بها كلّها هنا.. ولكن يكفي أن نذكر منها ما يلي:

1) لم تعد لـ VB واجهة استخدام مستقلّة، فكلّ لغات VS.Net تستخدم واجهة واحدة، مليئة بالأدواتِ التي تُسهّل بطريقة مدهشة عمليّةَ تصميم البرنامج.. إنّ هذه الميزة تسمح لك بإنشاء تطبيقات تدخل فيها أكثر من لغة برمجة، دون أن تحتاج لفتح أكثر من واجهة.. إنّها واجهة واحدة فقط لكلّ المبرمجين.

2) هناك إمكانيّات جديدةٌ في نافذة محرّر الكود، منها قيام اللغة بكتابة جملة نهاية المقطع تلقائيّا، بمجرّد كتابتك لبدايته وضغط زرّ Enter.. فمثلا: لو كتبت جملة:

If X = 0 Then

فإنّ محرّر الكود سيضيف الجملة التالية تلقائيّا:

End If

بل إنّك لو لم تكتب كلمة Then فسيكتبها لك محرّر الكود تلقائيّا!

هذا بالإضافة إلى أنّه سيضع مؤشّر الكتابة داخل مقطع If، وسيقوم بتنسيق المسافات البادئة تلقائيّا، بحيث يبدو الكود منظّما وواضحا عند قراءته.

كمّا أنّ هناك تحسيناتٍ كثيرةً في تلميحات الشاشةِ التي تعرضُ قيمَ المتغيّراتِ وأنواعَها ومعاملاتِ الإجراءاتِ والدوالِّ وقيمَها المعادة، مع نبذة عن وظيفة كلّ دالة وكلّ معامل.. باختصار: لقد أصبحت كتابة الكود متعة.

3) هناك تحسيناتٌ كثيرةٌ في مظهر النموذج والأدوات، وهناك العديدُ من الخصائص والوسائل الجديدة التي تمّت إضافتها لهذه العناصر، بحيث تمنحك تحكّما أكبر فيها.. فمثلا، أصبح بإمكانك تحديد درجة شفافية النموذج، كما صار بإمكانك ت- صار بإمكانك إضافة الأزرار والأدوات للنماذج في وقت التنفيذ Run Time، مع قدرتك على ربطها بأيّ إجراء، ليتمّ استدعاؤه عند ضغطها.

4) لم يعد هناك أيّ قصور في مترجم الكود Compiler، فكلّ لغات VS.Net تعمل على مترجم واحد، ممّا يعني أنّ VB قد صار بقوّة وسرعة وكفاءة VC++.. وكمثال، صار بإمكانك استخدام البرمجة الارتداديّة Recursive Programming دونّ أن تخشى من بطئها أو استهلاكها لحجم الذاكرة، فقد صارت في منتهى السرعة والكفاءة.

5) أصبح بإمكانك معالجة الأخطاء، عن طريق استخدام معالجات الاستثناءات Exception Handlers في جملة Try.. Catch.. End Try.

6) VBحديد المنطقة التي ستظهر منه على الشاشة، بحيث يمكنك تصميم نماذج بأيّ شكل.. ولم تعد مضطرّا لكتابة الكود الذي يحافظ على تناسب مقاييس الأدوات مع مقاييس النموذج كلّما تغيّر حجم النموذج، فقد صارت هناك خصائصُ جاهزةٌ مسئولةً عن هذا.. هذا بخلافِ العديد من الأدوات الجديدة، مثل الفاصل Splitter الذي يُمكّنك من تغييرِ حجمِ الأدوات المتجاورةِ أثناء تشغيل البرنامج

.Net مبنيّةٌ بالكاملِ على مفهومِ البرمجةِ بالكائنات Object Oriented Programming، لدرجة أنّ الأعدادَ الصحيحة Integers والنصوص Strings والمصفوفات Arrays قد صارت خلايا Classes، وصارت لهذه العناصرِ خصائصُ ووسائلُ جاهزة.. فمثلا، أصبحت لديك وسائل جاهزة تنتمي للمتغيّر النصّيّ، تسمح لك بالبحث فيه أو تقطيعه أو استبدال أجزاء منه... إلخ... كما صارت لديك وسائلُ جاهزةٌ لعكسِ المصفوفةِ وترتيبِها والبحثِ فيها!

7) صار بإمكانك استخدام كلّ مفاهيم الوراثة Inheritance وتعدّد الأشكال Polymorphism بلا أيّ مشاكل.. وإن كان مسموحا لك بوراثة خليّة واحدة فقط Single Inheritance للتسهيل.

8) يمنحك إطار العمل .Net Framework ثروة هائلة من الخلايا Classes، تقدّر بـ 3500 خليّة، تفعل كلّ ما تحلم به وأكثر، بحيث تريحك بدرجة كبيرةٍ من الاحتياج لاستخدام دوال API الخاصّة بالويندوز، بما فيها من تعقيد ومشاكل.. وأحدث ما فعلته (ميكروسوفت)، هو إصدار نسخة جديدة من DirectX مبنيّة بالكامل بالخلايا بدلا من APIs.

9) هذا بخلاف أنّ معظم هذه الخلايا قابل للوراثة، بما فيها الأدوات Controls نفسها، ممّا يمنحك القدرة على تطوير أدائها بما يناسبك.

10) ومن الخلايا الجاهزة العديدة التي يمكنك استخدامها، الخلايا التالية: Stack ـ Queue ـ BitArray، و ArrayList وغيرها.

11) أصبح بإمكانك تعريف المتغيّرات داخل مقاطع الجمل الشرطيّة If Statements والجمل التكراريّة Loops، بحيث تكون معزولة عن المتغيّرات الموجودة خارج هذه المقاطع.

12) أصبح بإمكانك تعريف الخلايا داخل الخلايا Nested Classes، وأيّ نوعٍ Type داخل أيّ نوع آخر.

13) أصبح بإمكانك تعريف الواجهات Interfaces وكتابة الخلايا التي تطبّقها وتنفّذها.

14) أصبح بإمكانك استخدام المندوب Delegate كمعامل للإجراءات والدوال، بحيث يمكنك تمرير اسم أيّ إجراء أو دالة كمعامل!

15) أصبح بإمكانك استخدام السمات Attributes في تعريف الخلايا والوسائل والخصائص والأنواع المختلفة، ممّا يختصر لك الكثير من العمل، ويمنحك العديد من القدرات.

16) لديك إمكانيّات جديدة وعديدة تمنحها لك خلايا جاهزة، للتعامل مع الملفّات والمجلّدات.. وعلى سبيل المثال، يمكنك أن تراقب أيّ تغيير يطرأ على ملفّات المجلّد الذي تريد، باستخدام الأداة FileSystemWatcher، كما يمكنك أن تخزّن كائنا أو مصفوفة أو مجموعة Collection من أيّ نوعٍ إلى ملفّ مرّة واحدة، وإعادة قراءتها حينما تريد، باستخدام خلايا السلسلة Serialization.

17) هناك إمكانيّات هائلة في مجال الرسم والتلوين تمنحها لك مكتبة GDI+.. يكفي أن تعرف أنّ بإمكانك الآن رسم منحنيات معقّدة، وتكوين أشكال مركّبة من مجموعة خطوط ومضلّعات ومنحنيات، وتلوين السطوح بألوان متدرّجة، وتحديد شكل مساحة الرسم، وتحديد درجة الشفافية، وتدوير الرسوم وتغيير مقاييسها تكبيرا أو تصغيرا.... إلخ.

18) يمكنك استخدام المؤشّرات Pointers في بعض الأحيان، للقراءة والكتابة في الذاكرة، كما يمكنك أداء عمليّات معقّدة على النظام System لم تكن لتحلم بها!

19) أصبح بإمكانك تقسيم برنامجك لمجموعة من العمليّات المستقلّة Threads، ممّا يعني أنّ برنامجك يستطيع القيام بأكثر من عمليّة في نفس اللحظة Multithreading.

20) هناك إمكانيّات جديدة رائعة للتعامل مع قواعد البيانات، تمنحها لك تقنية ADO.Net، بالإضافة للعديد من الأدوات المرئيّة التي تساعدك في إنشاء تطبيقات قواعد البيانات بأقلّ قدر من الكود.

21) أمّا الجديد تماما، فهو قدرتك على تصميم صفحات الإنترنت بنفس الطريقة التي تصمّم بها النماذج العاديّة، مع كتابة كود VB بمعظم إمكانيّاته، لإنشاء تطبيقات ASP تعمل على الخوادم Servers بدون كتابة حرف واحد من لغة ASP!!

والسلام

من دروسي :

درس مبسط لفهم ال VB6.... Resource File

تعلم تصميم اداة ال Active X خطوة بخطوة (الجزء الأول)

الطريقة المثلى للتعامل مع مسجل النظام( VB6..... (Registry

من برامجي :

Abo Sabreen Messenger v2.1 العملاق

--------------------------------------------------

مفكرة الإسلام؛ طالع أخبار العالم وأخبار المجاهدين بعيدا عن التعتيم الاعلامي.

#2

أهلا بأبو صابرين في الدوت نت وشكرا علي موضوعك ,

ولكن Class تعني فصيله وليس خليه ,الخليه في ال English تكون Cell ,

والمعني العام أنه تم تصنيف الدوال الخاصه بكل مجموعة عمليات متشابهه في فصيله خاصه ,

وعايزين نشوف شغل منك في الدون نت .

#3

شكرا لك اخي حزوووووووم

وشكرا للتوضيح ولكن كما اشرت الموضوع منقول

وعذرا اخي هذه المشاركة قبل الاخيرة في هذا المنتدى وذلك لانني انا الان في التوجيهي وسوف انهي بعد سنة

ورح ان شاء الله طوالة على ال vb.net

والمشاركة الاخيرة سوف تكون عبارة عن كتاب رائع في ال vb.net

من دروسي :

درس مبسط لفهم ال VB6.... Resource File

تعلم تصميم اداة ال Active X خطوة بخطوة (الجزء الأول)

الطريقة المثلى للتعامل مع مسجل النظام( VB6..... (Registry

من برامجي :

Abo Sabreen Messenger v2.1 العملاق

--------------------------------------------------

مفكرة الإسلام؛ طالع أخبار العالم وأخبار المجاهدين بعيدا عن التعتيم الاعلامي.

#4

للمشاركة

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#5

شكراً على المشاركة و لكن هناك بضع ملاحظات

abu sabreen كتب:
2) هناك إمكانيّات جديدةٌ في نافذة محرّر الكود، منها قيام اللغة بكتابة جملة نهاية المقطع تلقائيّا، بمجرّد كتابتك لبدايته وضغط زرّ Enter.. فمثلا: لو كتبت جملة:

If X = 0 Then

فإنّ محرّر الكود سيضيف الجملة التالية تلقائيّا:

End If

بل إنّك لو لم تكتب كلمة Then فسيكتبها لك محرّر الكود تلقائيّا!

هذه ليست من ميزات الفيجوال بيسك دوت بل من ميزات بيئة التطوير فيجوال ستوديو دوت نت

abu sabreen كتب:
4) لم يعد هناك أيّ قصور في مترجم الكود Compiler، فكلّ لغات VS.Net تعمل على مترجم واحد، ممّا يعني أنّ VB قد صار بقوّة وسرعة وكفاءة VC++.. وكمثال، صار بإمكانك استخدام البرمجة الارتداديّة Recursive Programming دونّ أن تخشى من بطئها أو استهلاكها لحجم الذاكرة، فقد صارت في منتهى السرعة والكفاءة.

معلومة نصف صحيحة. لكل لغة دوت نت كومبايلر خاص بها يحول الكود الى Microsoft Intermediate Language MSIL ثم هناك كومايلر آخر يدعى JIT (Just In Time) Compiler يحول الـMSIL الى لغة الآلة عند تشغيل البرنامج لأول مرة.

abu sabreen كتب:
18) يمكنك استخدام المؤشّرات Pointers في بعض الأحيان، للقراءة والكتابة في الذاكرة، كما يمكنك أداء عمليّات معقّدة على النظام System لم تكن لتحلم بها!

المؤشرات و الـunsafe code بشكل عام غير مسموح به في الـVB.NET بل هم من ميزات أختها الكبيرة #C

#6

مشكور اخي System Down على الايضاح

وذلك لان الموضوع منقول

من دروسي :

درس مبسط لفهم ال VB6.... Resource File

تعلم تصميم اداة ال Active X خطوة بخطوة (الجزء الأول)

الطريقة المثلى للتعامل مع مسجل النظام( VB6..... (Registry

من برامجي :

Abo Sabreen Messenger v2.1 العملاق

--------------------------------------------------

مفكرة الإسلام؛ طالع أخبار العالم وأخبار المجاهدين بعيدا عن التعتيم الاعلامي.

#7
اقتباس
المؤشرات و الـunsafe code بشكل عام غير مسموح به في الـVB.NET بل هم من ميزات أختها الكبيرة #C

على العكس بالنسبة للمؤشرات يمكنك استعمالها في الفيجوال و مثال على ذلك التعامل مع الصور حيث يمكنك عمل تعديلات على صورة قد حددت لها مساحة على الذاكرة ثم بعد ذلك تنقلها الى برنامجك الشئ الذي يعطي سرعة للتعامل معها (أي الصور)

تم تعديل هذه المشاركة بواسطة crazy-man في 17 يوليو 2005 في 00:48

#8
crazy-man كتب:
على العكس بالنسبة للمؤشرات يمكنك استعمالها في الفيجوال و مثال على ذلك التعامل مع الصور حيث يمكنك عمل تعديلات على صورة قد حددت لها مساحة على الذاكرة ثم بعد ذلك تنقلها الى برنامجك الشئ الذي يعطي سرعة للتعامل معها (أي الصور)

ممكن sample code؟ أنا لا أتعامل كثيراً مع الصور لذا لم أسمع بهذا من قبل.

#9

هذا مثال يقوم بعكس ألوان صورة معينة

Imports System.Drawing.Imaging


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       'يحمل هذا المتغير الصورة الموجودة في مربع الصورة

       Dim Bitmap As Bitmap = New Bitmap(PictureBox1.Image)



       'انشاء مستطيل بنفس مساحة الصورة

       Dim Rect As New Rectangle(0, 0, Bitmap.Width, Bitmap.Height)



       'يحمل هذا المتغير بيانات عن صورة معينة

       Dim BitmapData As BitmapData = New BitmapData()



       'تقوم هذه الدالة باغلاق مساحة معينة من الصورة ولها 3 توابع

       'الاول : المساحة التي تريد اغلاقها من الصورة ليتم التعامل معها في الذاكرة مباشرة

       'الثاني : نوع الاغلاق و قد اخترنا منع الكتابة على الصورة

       'الثالث : تحديد نوع تنسيق الصورة و قد اخترنا النقطية

       'و بالتالي اصبح هذا المتغير يشير الى بيانات الصورة في الذاكرة 

       BitmapData = Bitmap.LockBits(Rect, ImageLockMode.WriteOnly, _

                Bitmap.PixelFormat)



       'عرفنا هذا المتغير من نوع المؤشرات

       Dim pixels As IntPtr



       'تقوم هذه الدالة باعطائك العنوان لاول نقطة في الصورة في الذاكرة

       pixels = BitmapData.Scan0()



       'يمنحك هذا الكلاس مجموعة من الدوال تمكنك من القراءة و الكتابة في الذاكرة

       Dim M As System.Runtime.InteropServices.Marshal



       Dim X, Y, C, O As Integer



       Dim W As Integer = Rect.Width



       Dim Clr As Color



       For Y = 0 To Rect.Height



           For X = 0 To W - 1



               ' حساب موضع النقطة في الذاكرة

               ' موضع النقطة هو : 4 * عرض الصورة * رقم الصف الذي به النقطة + 4 * رقم العمود الذي به النقطة

               ' لاحظ ان الرقم 4 هو بسبب ان الصورة نقطية و ان كل نقطة في الذاكرة تخزن في اربع وحدات في الذاكرة

               O = CInt((4 * W * Y) + (4 * X))



               'تقوم هذه الدالة بقراءة بيانات معينة من الذاكرة

               '  اتابع الاول: العنوان الذي يشير الى الصورة في الذاكرة

               'التابع الثاني : عدد الوحدات التي تريد ان يتم اضافتها الى العنوان الاساسي للصورة ليتم قراءة البيانات التي به 

               C = M.ReadInt32(pixels, O)



               ' تحويل اللون من عدد صحيح إلى كائن لون

               Clr = Color.FromArgb(C)





               ' عكس الوان الصورة

               Clr = Color.FromArgb(Clr.A, 255 - Clr.R, _

               255 - Clr.G, 255 - Clr.B)





               ' تحويل كائن اللون إلى عدد صحيح



               C = Clr.ToArgb



               ' تخزين اللون المعكوس في الذاكرة

               'التابع الثالث لهذه الدالة هو البينات التي تريد كتابتها في العنوان المحدد

               M.WriteInt32(pixels, O, C)



           Next

       Next



       ' فك الاغلاق الذي تم في الذاكرة للصورة

       Bitmap.UnlockBits(BitmapData)



       PictureBox1.Image = Bitmap



       PictureBox1.Refresh()



   End Sub

End Class
#10

جزاك الله كل خير يا اخي

#12

.....

أرجو مراجعة المثال....

حسب علمي البسيط، VB.NET لا تدعم Pointers والمثال الذي أرفقته عبارة عن التحكم بالأشياء Objects من خلال References وليس Pointers.

واستخدامك لهذه الطريقة، هي الطريقة الطبيعية في VB.NET وفي أي لغة شيئية التوجه!!

#13

شكرا

#14

أخي ابو مازن أولا دعنا نعرف عمل الكلاس

System.Runtime.InteropServices.Marshal

يقوم بالتعامل مع الذاكرة و تحديدا يقوم بالأعمال التالي:

Provides a collection of methods for allocating unmanaged memory, copying unmanaged memory blocks, and converting managed to unmanaged types, as well as other miscellaneous methods used when interacting with unmanaged code.

المصدر : MSDN

ثانيا أنت قلت ان الفيبي دوت نت يتعامل مع ال References للأشياء و ليس ال Pointers و أنا أتفق معك لكن هل هناك حقا فرق كبير بين الاثنين ؟ طبعا لا لأن النتائج التي ستحصل

هو حقيقة يتعامل مع ال References لكن يجب أن تعلم انه نفس الشئ تقريبا

و هذا مثال من السي ++ للتعامل مع Variable بواسطة ال Pointer و ال reference و ستلاحظ أنه لا يوجد أي فرق يذكر و النتيجة هي نفسها

//هنا تعاملنا بالبوانترز 
int i=0;
int *pi=&i;
*pi=*pi+1; // نتعامل الآن مع المتغير i 
// عن طريق pi
//
// الآن لنرى كيف يتم نفس الشئ باللجوء الى انشاء Reference
int i=0;
int &ri=i;
ri=ri+1; 
//ستحصل هنا على نفس النتيجة التي حصلت عليها لما تعاملت مع البوانتر

انا هنا كتبت كود سي++ فقط لأظهر لك تشابه التعامل مع البوانترز و مع الreference

و أذكر أيضا أن ال References لأي متغير لديهم نفس العنوان الشئ الذي لا يحدث أي فرق كبير بين التعامل بهم او بالبوانترز

و طبعا اذا كنت قد أخطأت في شئ فأنا أنتظر رأيك

و السلام عليكم

#15

معك حق،

بعد البحث وجدت أن الفئة IntPtr وظيفتها تخزين بيانات ذاكرة عشوائية.

ووظيفة الفئة Marshal هي الكتابة والقراءة على IntPtr. (فلا تستطيع القراءة والكتابة مباشرة على IntPtr) تستطيع كتابة البيانات العادية من أرقام وكلمات، أو هندسية Strcuts

ووظيفة GCHandle هي لقراءة وتخزين (أشياء) Objects من فئات مختلفة!

وهذه الثلاث فئات، تمكنك من التعامل مع الذاكرة. لاحظ معي أن هذه الفئات ليست مؤشرات، لكنها فئات تساعدك على محاكاة عمل المؤشرات!

لو استخدمت هذه الفئات في C# فلن تكون شفرتك غير آمنة unsafe، لماذا؟ لأنها ليست مؤشرات مباشرة، بل هي فئات تحاكي هذا العمل، إن أردت استعمال مؤشرات في C# فعليك أن تستخدم الأمر unsafe كما هو معلوم. وهذا غير موجود في VB.NET

الجديد في الأمر أني عرفت من أخونا Crazy-Man أن باستطاعتك محاكاة ذلك في VB باستخدام الفئات السابقة!! كما في مثاله السابق:

Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

      Dim Bitmap As Bitmap = New Bitmap(PictureBox1.Image)
      Dim Rect As New Rectangle(0, 0, Bitmap.Width, Bitmap.Height)
       Dim BitmapData As BitmapData ' = New BitmapData() جملة زائدة لا عمل لها!!

       BitmapData = Bitmap.LockBits(Rect, 	 ImageLockMode.WriteOnly, _
                Bitmap.PixelFormat)

      Dim pixels As IntPtr
      pixels = BitmapData.Scan0()
 '     Dim M As System.Runtime.InteropServices.Marshal 'هذه مضللة
' استعمل Marshal 
' مباشرة

      Dim X, Y, C, O As Integer
      Dim W As Integer = Rect.Width
      Dim Clr As Color
      For Y = 0 To Rect.Height
          For X = 0 To W - 1
              O = CInt((4 * W * Y) + (4 * X))
              C = Marshal.ReadInt32(pixels, O)
              Clr = Color.FromArgb(C)
       Clr = Color.FromArgb(Clr.A, 255 - Clr.R, _
              255 - Clr.G, 255 - Clr.B)
              C = Clr.ToArgb
              Marshal.WriteInt32(pixels, O, C)
          Next
      Next
      Bitmap.UnlockBits(BitmapData)
      PictureBox1.Image = Bitmap
      PictureBox1.Refresh()
  End Sub
End Class

لاحظ معي أن التعامل مع Marshal و IntPtr هو تعامل مع فئات وأشياء. كتعاملك مع أي فئة أخرى، وهذه الأشياء تقوم عوضا عنك بعمل محاكاة للمؤشرات!

أضف إلى ذلك أن التعامل مع هذه الفئات أكثر أمانا من استخدام المؤشرات، و%

#16

معك حق،

بعد البحث وجدت أن الفئة IntPtr وظيفتها تخزين بيانات ذاكرة عشوائية.

ووظيفة الفئة Marshal هي الكتابة والقراءة على IntPtr. (فلا تستطيع القراءة والكتابة مباشرة على IntPtr) تستطيع كتابة البيانات العادية من أرقام وكلمات، أو هندسية Strcuts

ووظيفة GCHandle هي لقراءة وتخزين (أشياء) Objects من فئات مختلفة!

وهذه الثلاث فئات، تمكنك من التعامل مع الذاكرة. لاحظ معي أن هذه الفئات ليست مؤشرات، لكنها فئات تساعدك على محاكاة عمل المؤشرات!

لو استخدمت هذه الفئات في C# فلن تكون شفرتك غير آمنة unsafe، لماذا؟ لأنها ليست مؤشرات مباشرة، بل هي فئات تحاكي هذا العمل، إن أردت استعمال مؤشرات في C# فعليك أن تستخدم الأمر unsafe كما هو معلوم. وهذا غير موجود في VB.NET

الجديد في الأمر أني عرفت من أخونا Crazy-Man أن باستطاعتك محاكاة ذلك في VB باستخدام الفئات السابقة!! كما في مثاله السابق:

Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

      Dim Bitmap As Bitmap = New Bitmap(PictureBox1.Image)
      Dim Rect As New Rectangle(0, 0, Bitmap.Width, Bitmap.Height)
       Dim BitmapData As BitmapData ' = New BitmapData() جملة زائدة لا عمل لها!!

       BitmapData = Bitmap.LockBits(Rect, 	 ImageLockMode.WriteOnly, _
                Bitmap.PixelFormat)

      Dim pixels As IntPtr
      pixels = BitmapData.Scan0()
 '     Dim M As System.Runtime.InteropServices.Marshal 'هذه مضللة
' استعمل Marshal 
' مباشرة

      Dim X, Y, C, O As Integer
      Dim W As Integer = Rect.Width
      Dim Clr As Color
      For Y = 0 To Rect.Height
          For X = 0 To W - 1
              O = CInt((4 * W * Y) + (4 * X))
              C = Marshal.ReadInt32(pixels, O)
              Clr = Color.FromArgb(C)
       Clr = Color.FromArgb(Clr.A, 255 - Clr.R, _
              255 - Clr.G, 255 - Clr.B)
              C = Clr.ToArgb
              Marshal.WriteInt32(pixels, O, C)
          Next
      Next
      Bitmap.UnlockBits(BitmapData)
      PictureBox1.Image = Bitmap
      PictureBox1.Refresh()
  End Sub
End Class

لاحظ معي أن التعامل مع Marshal و IntPtr هو تعامل مع فئات وأشياء. كتعاملك مع أي فئة أخرى، وهذه الأشياء تقوم عوضا عنك بعمل محاكاة للمؤشرات!

أضف إلى ذلك أن التعامل مع هذه الفئات أكثر أمانا من استخدام المؤشرات، واستخدامها أسهل وهذه ميزة بلا شك!

اقتباس
ثانيا أنت قلت ان الفيبي دوت نت يتعامل مع ال References للأشياء و ليس ال Pointers و أنا أتفق معك لكن هل هناك حقا فرق كبير بين الاثنين

الفرق كبير كبير، صحيح أن نتائجها متقاربة كما ذكرت، لكن Refrences أمنها وأمانها أفضل ومفهومها أقرب لفهم الإنسان في استخدامه (للأشياء) التي حوله!!

Pointers تبين لك مكان الذاكرة، وبذلك تستطيع التحكم بالذاكرة مباشرة! فأنت لا تؤشر على الكائن، لكنك تؤشر على مكان حفظ معلومات الكائن! تخيل معي لو خزنت معلومات خاصة للكائن يفترض أن لا يكتب عليها! Pointers ستمكنك في الكتابة فوقها!

Refferences تعطيك صلاحية التحكم في الكائن الذي تؤشر عليه بحسب ما يقتضيه استعمال الكائن نفسه، أو الصلاحية المقدمة من الفئة نفسها!

فإذا كان بالكائن Person رقم العمل ID ، فلن تمكنك الفئة من تغيير هذا الرقم ، ولن يكون لديك مثلا

refferencePerson.setNewID(number as Long);

وهذا يعطي أمانا فائقا لبياناتك ويقلل الأخطاء!!

-----

#17

طبعا, أنا عنيت بقولي انهم متقاربين النتيجة التي تنتج عنهما

Dim BitmapData As BitmapData ' = New BitmapData() جملة زائدة لا عمل لها!!

لا يا أخي ابو مازن, هذه الجملة ليست زائدة ذلك لأن للتعامل مع أي Class في الدوت نت يجب انشاء New Intstance منها و الا سيحصل خطأ عندما تريد التعامل مع أي خاصية فيها

و يمكن كتابة هذه الجملة بالطريقة التالية أيضا

Dim BitmapData As New BitmapData

و هذه حقيقة هي الصيغة التي أفضل

تم تعديل هذه المشاركة بواسطة crazy-man في 21 يوليو 2005 في 03:28

#18

أخي crazy ربما لم تنتبه أنك أعطيت المتغير BitmapData شيئا في الجملة التي تليها:

Dim BitmapData As BitmapData ' = New BitmapData() جملة زائدة لا عمل لها!!

      BitmapData = Bitmap.LockBits(Rect,   ImageLockMode.WriteOnly, _
               Bitmap.PixelFormat)

جملة

Bitmap.LockBits ترجع لك (كائنا) من BitmapData

بهذا لا تحتاج أن تصنع BitmapData جديدة، لأنك ستسعمل الكائن من LockBits..!!

جرب حذف الجملة التي أشرت عليها New ، وإن طرأ خطأ فضعه هنا، ربما أكون ناسيا!!

هذا الموضوع مغلق.

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