بسم الله الرحمن الرحيم
في البداية اشكر الله عز وجل ان اعانني على جمع ما قد كتبته من اكواد مشروحة في منتديات الفريق العربي للبرمجة . ثم اشكر منتدى الفريق العربي للبرمجة على اهتمامه بالموضوع بان قام بتثبيته في المنتدى مما شجعني على المواصلة و الاستكمال . واشكر منتدى vb4arab و الذي قد اجاب على كثير من تساؤلاتي في البرمجة .
و قد قسمت هذا الملف الى عشرة اقسام وفقا لمحتواها , و هي كالتالي:
1- التعامل مع الصور و الرسم
2- الملفات و المجلدات
3- اساسيات اللغة
4- الاوفيس
5- نظام التشغيل
6- النصوص
7- تطبيقات الويب
8- الدوال الرياضية
9- التاريخ و الوقت
10- منوعات
مستعرض صور مبسط
نريد
ان نعمل
برنامج يقوم
باستعراض
الصور الموجودة على
الجهاز ومن ثم
اختيار صورة
لكي نستعرضها في
البرنامج ,
واليك الكود
البسيط:
اولا
ضع على الفورم
صندوق حوار
فتح
(open dialog) ومربع صورة
و و زر امر
(button) واكتب هذا
الكود في ال form1 class :
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
End If
شرح الكود: الخاصية
showdialog تقوم
بعرض صندوق
الحوار فتح ,
واذا اختار
المستخدم زر ok على
الصورة فان
على مربع
الصورة ان
يعرضها . وقد
استخدمنا
الخاصية FromFile التي
يلزمها وسيط
وهو اسم الملف
المراد عرضه .
والخاصية FromFile موجودة
في ال Image class .
تصغير
الصور
اذا
اردت تصغير
حجم الصورة
(الطول
والعرض) فعليك
بوضع زر و مربع صورة
ووضع اي صورة
في مربع
الصورة ثم نغير
اسم مربع
الصورة الى
Picture1 , ومن ثم نكتب
الكود التالي:-
Dim x As Bitmap
x = Picture1.Image.GetThumbnailImage(N2.Value, N1.Value, Nothing, Nothing)
x.Save("c\x.jpg")
شرح الكود:
نضع اي متغير
وليكن
المتغير x ونجعله على
هيئة صورة Bitmap .
ثم نستخدم
الوظيفة GetThumbnailImage الموجودة
في الخاصية Image والتي
توجد في
الكائن Picture1 .
الوظيفة GetThumbnailImage لها 4
توابع :-
الاول: العرض
الذي تريد ان
تجعله للصورة
.
الثاني: الطول
الذي تريد ان
تجعله للصورة
.
الثالث: يتيح
لك الفرصة بان
تلغي عملية
تصغير الصورة
, وفي مثالنا
استخدمنا
الكلمة
المحجوزة nothing (اي اننا
لم نستخدم هذا
التابع)
الرابع: دائما
صفر (nothing)
و الناتج من
هذه العملية
وضعناه في
المتغير x .
وبعدها
استخدمنا
الوظيفة Save لكي
نحفظ الصورة ,
والوظيفة Save لها
تابع واحد وهو
:-
مسار الصورة
التي تريد
حفظها .
ويمكن ان نغير
هيئة الصورة (Format) بكل
سهولة . ولكن
ساجعل كود
تحويل هيئة
الصورة لاحقا
ان شاء الله .
قلب
الصور
اذا
اردت القيام
بقلب صورة
(Rotate) فعليك
بانشاء زر امر و مربع
صورة ووضع
صورة فيه
وكتابة الكود التالي:-
Dim x As Bitmap = PictureBox1.Image
x.RotateFlip(RotateFlipType.Rotate180FlipY)
PictureBox1.Image = x
شرح الكود:
ننشئ اي متغير
وليكن x
ونجعله
على هيئة صورة bitmap .ثم نحدد
ماهي الصورة
التي سنتعامل
معها وهي
Picturebox1.image .
ثم
نستخدم
الوظيفة
RotateFlip والتي لها
تابع واحد وهو نوعية
القلب .
وهناك
انواع كثير
سيسردها لك vb.net .
الى الان
نحن قلبنا
الصورة في
المتغير
X ولم نقلبها
فعليا في مربع الصورة
ولنقلبها
فعليا يجب
علينا ان نجعل
الصورة
الفعلية
تساوي المتغير PictureBox1.Image = x .
تهيئة
الصور
Image Format
اذا
اردت تغيير
هيئة صورة
معينة فاكتب الكود
التالي:
Dim x As New Bitmap("c:\pic06.jpg")
x.Save("c:\new.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
في
البداية قمنا بانشاء
متغير x
ووضعنا
فيه صورة
معينة وذلك
باستخدام
الكلاس
Bitmap .
بعد
ذلك استخدمنا
الدالة
Save ولها
تابعين:
1-مسار
الصورة
الجديدة التي
تريد حفظها
(بالاضافة الى
امتداد الصورة)
2- هيئة الصورة (bmp , gif , jpg ....etc).
وبذلك
نكون قد
انشانا نفس
الصورة ولكن
بهيئة اخرى(كود
مفيد جدا)
اذكر
كان في برنامج
معمول
بالفيجوال
بيسك 6
يقوم
فقط بتغيير
هيئة الصور من bmp الى jpg , ولكني
عندما اطلعت على
الكود
اصابتني صدمة
. ما اقدر
اوصفلكم كيف
كان حجم الكود . ولكن
الحمد لله على
كل حال .
التصغير
و التكبير
تصغير
و تكبير ال PictureBox يتم
باستخدام
خاصتي ال width , height .
ولكن
هاتين
الخاصيتين لا
تقوم بتصغير
او تكبير
الصورة . التي
تقوم بهذه
المهمة هي
الدالة GetThumbnailImage . والتي
تم شرحها
سابقا .
المثال التالي
يقوم بتكبير
اي صورة في PictureBox1 و
يخزنها في
مسار d:xxx.bmp
Dim x As Bitmap
x = PictureBox1.Image.GetThumbnailImage(PictureBox1.Width
+ 100, PictureBox1.Height + 100, Nothing, Nothing)
x.Save("d:xxx.bmp")
الوان متدرجة
اذا
اردت ان تملأ
الفورم بلون
متدرج فاكتب
الكود التالي:
Dim grbrush As System.Drawing.Drawing2D.LinearGradientBrush grbrush = New System.Drawing.Drawing2D.LinearGradientBrush(New _ Point(0, 0), New Point(Me.Width, Me.Height), Color.Gold, Color.Blue) Me.CreateGraphics.FillRectangle(grbrush, New Rectangle(0, 0, Me.Width, Me.Height))
اولا:
نقوم
بانشاء
متغير من نوع LinearGradientBrush والذي
يقوم
بالوظيفة
.
ثانيا:
نقوم بكتابة
وسائط الدالة LinearGradientBrush وهي:
1- نقطة
البداية: لكي
نجعل اللون
يملا الفورم
من اوله فيجب وضع
القيمة صفر
لكل من الx , y .
2- نقطة
النهاية:
لكي
نجعل اللون
يملا اخر
الفورم فيجب
وضع قيمة عرض
الفورم لل
x , وطول
الفورم لل
y .
3- اللون
الاول.
4- اللون الثاني.
ثالثا:
نقوم بانشاء
الكائن
Graphics للفورم (CreateGraphics)
رابعا:
نقوم
باستخدام
الوظيفة
FillRectangle وذلك لكي
نملا الفورم
باللون
المتدرج الذي
انشاناه من
الوظيفة
LinearGradientBrush . والوظيفة FillRectangleلها
تابعين
:
1- الفرشة او اللون الذي تريد ان تملا الفورم به .
2- المساحة التي تريد ان تملا اللون بها في الفورم . ولهذا نستخدم البنية Rectangle والتي لها التوابع التالية:
1- نقطة
x وتبدا من
اليسار
العلوي : صفر
2- نقطة
y وتبدا من
اليسار العلوي
: صفر .
3- عرض
المساحة:
عرض الفورم .
4- طول المساحة
: طول الفورم.
وبالتالي
نكون قد
انشانا لون
متدرج للفورم
. لكن لو اتينا للvb 6 لما
جدنا الكلاس LinearGradientBrush والذي
ينتظر منك
الاوامر
.
تحويل
النص الى صورة
الكود
التالي يقوم
بتحويل النص
الى هيئة صورة .
Me.CreateGraphics.DrawString("Hello World!", _ New Font("Verdana", 16), Brushes.MediumSeaGreen, 10, 10)
الدالة DrawString لها 5
توابع :
1- النص الذي
تريد تحويله
الى صورة .
2- نوع الخط
الذي تريد
كتابة النص به
, وقد استخدمنا
الكلاس Font لتحديد
اسم الخط
وحجمه . و يتيح
لك هذا الكلاس
Font خيارات
عديدة
للتلاعب في
نصك .
3- نمط النص او
لونه : وقد
استخدمنا
الكلاس Brushes لاختيار
نمط ال Brush . وعن
نفسي فقد
اخترت اللون
البحري .
4 , 5 - تحديد موقع
الصورة على
الفورم وذلك
بتحديد ال X, Y .
ويمكنك
استبدال
الفورم Me بمربع صورة
ليمكنك تحرير
الصورة اكثر
وحفظها والى
اخره .
الحافظة
Clipboard
كيف تقوم بنسخ و
لصق الصور . الامر بسيط جدا
اليك كود نسخ
الصور
:
Clipboard.SetDataObject(PictureBox1.Image)
استخدمنا الدالة
SetDataObject
التابعة
للكائن Clipboard
ووظيفتها هي نسخ
البيانات الى الحافظة
.
كود
لصق الصور
If
Clipboard.GetDataObject.GetDataPresent(DataFormats.Bitmap) = True Then
PictureBox1.Image =
Clipboard.GetDataObject.GetData(DataFormats.Bitmap)
Else
MsgBox("The Clipboard doesn’t contain a bitmap!")
End If
في البداية يجب التاكد فيما
اذا كانت هناك صورة في الحافظة و ذلك
باستخدام الدالة
GetDataPresent
و
تابعها هو نوع البيانات التي تريد
التاكد فيما اذا كانت موجودة في الحافظة او لا . و بالتالي
نستخدم الكلاس
DataFormats لنعرف النوع Bitmap .
و اذا كان
الناتج True فننا نقوم
بلصق الصورة في مربع الصورة و ذلك باستخدام الدالة GetData
و تابعها هو نوع البيانات التي تريد لصقها من الحافظة
.
مقدمة
في معالجة
الصور
الصورة عبارة
عن مصفوفة
مكونة من قيم
الوانها
(احمر, ازرق,
اخضر) . و كل
قيمة من هذه
القيم ترسم في
نقطة تسمى
بكسل Pixel في اداة PictureBox .
و بالتالي اذا
اردنا ان نقوم
بتغييرات
بالصور او ان
نقوم بعمل فلتر
Filter فما
علينا الا ان
نقوم بتغيير
هذه القيم .
فمثلا اذا
اردنا ان نقوم
بعكس الوان
الصورة Inverse فعلينا
ان نقوم بطرح
كل لون من
الوان الصورة
من 255 . فمثلا اذا
كانت هناك
صورة زرقاء
بالكامل (0 , 255 , 0 )
فان المعكوس
سيصبح (255 , 0 , 255 ) .
و اذا اردت
تمليس الصورة Blur فان
العملية اصعب
قليلا و لكنها
فكرة ذكية جدا
.
الفكرة هي ان
تجعل الوان
الصورة قريبة
من بعضها .
ولكي تقوم
بذلك فعليك
باخذ المتوسط
من كل 9 نقاط Pixels في
الصورة . فاذا
كانت هناك
نقطة ذات فرق
كبير في درجة
لونها عن
الثمانية
النقاط الاخر
فان المتوسط
سوف يقرب لون
هذه النقطة من
الوان اخواتها
الثمانية .
و كذلك شحذ او
تحديد الصور Sharpen فما
عليك الا
القيام بعكس
عملية
التمليس .
كما ان هناك
عمليات اخرى
كثيرة ولكن
المهم ان نفهم
المبدا وهو
انك سوف
تتعامل مع
الوان الصورة
.
و بطبيعة
الحال فان فجوال
بيسك .نت يدعم
هذا النوع من
العمليات بدالتين
هما GetPixel و SetPixel . اما
الاولى فهي
للحصول على
الوان الصورة
, واما
الثانية فهي
للتعديل في
الوان الصورة
.
يبقى علينا
التطبيق
برمجيا بعد
الانتهاء من فهم
الفكرة نظريا
.
عكس
الوان الصور
اتبع
الخطوات
الاتية:
ابدا مشروع ويندوز , ثم اضف زر امر و مربع صورة , ثم اضف صورة
من عندك الى
مربع الصورة .
بعد ذلك اكتب هذا الكود تحت زر الامر
Dim bmap As New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim red, green, blue As Integer
Dim i, j As Integer
With bmap
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red =
CInt(.GetPixel(j, i).R)
blue =
CInt(.GetPixel(j, i).B)
green =
CInt(.GetPixel(j, i).G)
bmap.SetPixel(j, i, Color.FromArgb(255 - red, 255 - green, 255 - blue))
Next
PictureBox1.Refresh()
Next
PictureBox1.Refresh()
End With
ساقوم
بشرح النقاط
الاساسية في
هذا الكود .
في
بداية الامر
قمنا بانشاء
متغير و خزنّا
فيه الصورة الموجودة
في مربع
الصورة .
بعد
ذلك انشأنا
حلقتي تكرار .
الاول يقوم بفحص
عدد صفوف
البكسل
الموجودة في
الصورة . و الثاني
يقوم بفحص كل
بنقطة او بكسل
موجودة في
الصورة .
ثم
قمنا بتجميع
النقاط ذات اللون
الازرق و تخزينها
في المتغير blue . و كذلك
اللون الاحمر
و الازرق .
وذلك عن طريق الدالة
GetPixels و
التي لها
تابعين و هما
احداثي
النقطة التي تريدها x ,y .
ثم
استخدمنا
الدالة SetPixel للقيام
بعكس الوان
الصورة , و
التي لها 3 توابع :
الاول
و الثاني هما
احداثي
النقطة التي
تريد تغيير
لونها .
الثالث
: اللون الذي
تريده للنقطة
. و كما تلاحظ
فاننا طرحنا
كل لون من 255 لنقوم
بعكس الوان
الصورة .
و اذا
اردت تسريع
العملية فقم
بحذف
PictureBox1.Refresh()
الاولى
لانها تحت
عملية
التكرار
الاولى . ووظيفتها
انها تجعلك
ترى العملية .
و
انشاء الله
سوف نتعلم
فكرة تمليس
الصورة في الدرس
القادم و هي
فكرة رائعة
جدا جدا .
تمليس
الصور
الفكرة
كما ذكرت
سابقا عبارة
عن تقريب
درجة الوان
النقاط من
بعضها . فاذا
كانت هناك
نقطتين وحدة
زرقاء والاخرى
خضراء فسوف
يتم تقريب لون
الزرق الى
التركوازي.
ويتم ذلك
بحساب المتوسط
لكل 9 نقاط في
الصورة
.
Dim bmap As New
Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim red, green, blue As Integer
Dim i, j As Integer
With bmap
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red =
CInt((CInt(.GetPixel(j - 1, i - 1).R) + _
CInt(.GetPixel(j - 1, i).R) + _
CInt(.GetPixel(j - 1, i + 1).R) + _
CInt(.GetPixel(j,
i - 1).R) + _
CInt(.GetPixel(j, i).R) + _
CInt(.GetPixel(j, i + 1).R) + _
CInt(.GetPixel(j + 1, i - 1).R) + _
CInt(.GetPixel(j + 1, i).R) + _
CInt(.GetPixel(j
+ 1, i + 1).R)) / 9)
green =
CInt((CInt(.GetPixel(j - 1, i - 1).G) + _
CInt(.GetPixel(j - 1, i).G) + _
CInt(.GetPixel(j - 1, i + 1).G) + _
CInt(.GetPixel(j, i - 1).G) + _
CInt(.GetPixel(j, i).G) + _
CInt(.GetPixel(j, i + 1).G) + _
CInt(.GetPixel(j + 1, i - 1).G) + _
CInt(.GetPixel(j + 1, i).G) + _
CInt(.GetPixel(j + 1, i + 1).G)) / 9)
blue =
CInt((CInt(.GetPixel(j - 1, i - 1).B) + _
CInt(.GetPixel(j - 1, i).B) + _
CInt(.GetPixel(j - 1, i + 1).B) + _
CInt(.GetPixel(j, i - 1).B) + _
CInt(.GetPixel(j,
i).B) + _
CInt(.GetPixel(j, i + 1).B) + _
CInt(.GetPixel(j + 1, i - 1).B) + _
CInt(.GetPixel(j + 1, i).B) + _
CInt(.GetPixel(j + 1, i + 1).B)) / 9)
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
' Me.Text =
Int(100 * i / (PictureBox1.Image.Height - 2)).ToString & "%"
Next
End With
PictureBox1.Refresh()
Me.Text = "Done smoothing image"
(اتبع
نفس الخطوات
السابقة في
عكس الوان
الصورة )
كما
تلاحظ فان
الكود متطابق
في بدايته مع
كود عكس الوان
الصورة .
واحب
ان اوضح نقطة
وهي -2
الموجودة في
التكرار و
فائدتها هي
استبعاد
اطراف الصورة
من العملية .
المتغير
red : قمنا
بجمع قيم
الالوان لكل 9
نقاط متجاورة
ذات اللون
الاحمر ومن ثم
قسمتها على 9
لحساب المتوسط
.
و
كذلك المتغير blue و المتغير green .
و لو
جربت ان تحذف
عملية
المتغير green و المتغير red فان الصورة
ستصبح زرقاء
تماما .
تحديد
الصور Sharpening
من
المعروف ان تحديد
الصورة هو عكس
تمليسها . و
لتحديد صورة يجب
ان نجد
خزارزمية
معينة تبين او تزيد
الفرق بين
النقاط
المختلفة
اصلا .
لانه من
غير الممكن ان
نحدد صورة
زرقاء تماما و
ليس بها نقاط
مختلفة .
لذلك
السؤال هو ما
هي الخوارزمية
التي تزيد
الفرق بين
النقاط
المتجاورة
المختلفة
اصلا (ذات
اللون المختلف)
و لا تؤثر على
النقاط
المتجاورة
المتطابقة
(ذات اللون
الواحد) ؟؟
الجواب هو
ان تضيف الفرق
بين النقطة
الاصلية و
النقطة
المجاورة الى النقطة
الاصلية . و
بالتالي اذا
كانت النقطتان
المتجاورتان
ذات لون واحد
فان الفرق سيساوي صفر و بالتالي لن تؤثر عليها ,
وانما التاثير سيحدث
على النقاط
التي سيكون بين قيمها فرق
. و اليك الكود
الذي سيوضح العملية
Dim bmap = New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim red, green, blue As Integer
Dim i, j As Integer
With bmap
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red =
CInt(.GetPixel(j, i).R) + _
0.5 *
CInt((.GetPixel(j, i).R) - CInt(.GetPixel(j - 1, i - 1).R))
If red
< 0 Then red = red * -1
green =
CInt(.GetPixel(j, i).G) + _
0.5 *
CInt((.GetPixel(j, i).G) - CInt(.GetPixel(j - 1, i - 1).G))
If green
< 0 Then green = green * -1
blue =
CInt(.GetPixel(j, i).B) + _
0.5 *
CInt((.GetPixel(j, i).B - CInt(.GetPixel(j - 1, i - 1).B)))
If blue
< 0 Then blue = blue * -1
red =
Math.Min(red, 255)
green =
Math.Min(green, 255)
blue =
Math.Min(blue, 255)
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
Me.Text = "Done sharpening image"
دعنا
ناخذ المتغير red مثلا : j , i هي
النقطة
الاصلية ,
اضفنا اليها
الفرق بينها و
بين النقطة
المجاورة .
اما عن الضرب في
0.5 فهو لتقليل
حجم التفصيل
او الفرق
الحاصل .
يمكنك القسمة
على 2 بدلا
من الضرب في 0.5
و بعد
حساب red يجب
التاكد من ان
قيمتها موجبة .
فاذا كانت
سالبة فاننا
نضربها ب -1
لتصبح موجبة,
لان قيم
الالوان بين 0 و 255 . و
للتاكد من ان
قيمة red اقل او
تساوي 255 فاننا
نستخدم هذا
الكود :
red
= Math.Min(red, 255)
الدالة Min تعيد
القيمة
الاصغر بين
قيمتين محددتين
, فاذا كانت red اكبر من 255
فان red ستصبح
255 حسب الدالة Min .
و
هكذا
المتغيرين green و blue .
و لكن
لو جربت
العملية فستلاحظ
ان التنفيذ
بطيء للغاية .
و لستريعه قليلا
فاننا نستخدم
صورة مؤقتة في
الذاكرة . و
اليك الكود:
Dim bmap = New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim red, green, blue As Integer
Dim tempbmp As New Bitmap(PictureBox1.Image)
Dim i, j As Integer
With tempbmp
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red =
CInt(.GetPixel(j, i).R) + _
0.5 *
CInt((.GetPixel(j, i).R) - CInt(bmap.GetPixel(j - 1, i - 1).R))
If red
< 0 Then red = red * -1
green =
CInt(.GetPixel(j, i).G) + _
0.5 *
CInt((.GetPixel(j, i).G) - CInt(bmap.GetPixel(j - 1, i - 1).G))
If green
< 0 Then green = green * -1
blue =
CInt(.GetPixel(j, i).B) + _
0.5 *
CInt((.GetPixel(j, i).B - CInt(bmap.GetPixel(j - 1, i - 1).B)))
If blue
< 0 Then blue = blue * -1
red =
Math.Min(red, 255)
green =
Math.Min(green, 255)
blue =
Math.Min(blue, 255)
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
Me.Text = "Done sharpening image
و
مع ذلك فان
الاداء غير
مرضي لان
العملية
بطيئة جدا
مقارنة مع
برامج الرسم زي
الفوتو شوب . و
هذا يدل على
ان هناك
خوارزميات
اخرى للتعامل
مع مثل هذا
النوع من
معالجة الصور
.
ارجو
ان تكون قد
استمتعت مع
الدرس . و
بصراحة هذي
افكار تطور
قدراتك
البرمجية
لذلك ارى انه يجب
ان نخوض اكثر
في الخوارزميات
و الافكار و
الحيل
البرمجية .
لتسريع
عمليات
معالجة الصور
السابقة قم
بتغير الكود
من
Dim bmap = New Bitmap(PictureBox1.Image)
الى
Dim bmap As New Bitmap(PictureBox1.Image)
زخرفة
الصور Embossing
اعتقد ان
الجميع يعرف
الفلتر
المسمى Emboss و الموجود
في برامج
تحرير الصور
المشهورة مثل الفوتوشوب .
يقوم هذا
الفلتر
بابراز
براويز او
حواف
الكائنات
الموجودة في الصورة .
يمكننا
عمل ذلك
بالقيام باخذ
الفارق بين كل
نقطتين متجاورتين
. ولكن غالبا
يكون هذا
الفارق ضئيل و
بالتالي
ستظهر الصورة
غامقة و لذلك
يجب عليك
اضافة رقم الى
هذا الفارق
(مثلا 100 او 128 او 150 )
لزيادة اضاءة
الصورة .
new_value = difference + 128
و
اليك الكود
الخاص بهذه
العملية :
Dim bmap As New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim i, j As Integer
Dim red, green, blue As Integer
With bmap
For i = 0 To .Height - 2
For j = 0 To .Width - 2
Dim
pixel1, pixel2 As System.Drawing.Color
pixel1 =
.GetPixel(j, i)
pixel2 =
.GetPixel(j + 1, i + 1)
red =
Math.Min(Math.Abs(CInt(pixel1.R) - CInt(pixel2.R)) + 128, 255)
green =
Math.Min(Math.Abs(CInt(pixel1.G) - CInt(pixel2.G)) + 128, 255)
blue =
Math.Min(Math.Abs(CInt(pixel1.B) - CInt(pixel2.B)) + 128, 255)
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
Me.Text = "Done embossing image"
كما تلاحظ فان المتغيرين Pixel1 , Pixel2 هما عبارة عن نقطتين متجاورتين في الصورة
green =
Math.Min(Math.Abs(CInt(pixel1.G) - CInt(pixel2.G)) + 128, 255)
* الدالة
Min تعيد
القيمة
الاصغر بين
قيمتين . وهي
بالتالي تضمن
بان القيمة لن
تتجاوز ال 255 .
* الدالة
Abs تعيد
القيمة
المطلقة
للقيمة . فاذا
كانت القيمة
سالبة فان
الدالة
تحولها الى
قيمة موجبة . وهي
بالتالي تضمن
بان القيمة لن
تكون سالبة .
تغبيش
الصور Diffusing
بصراحة
لم اجد معنى
مناسب لكلمة Diffuse . و لكن ستعرف
معناها جيدا
اذا طبقت
الكود . كود تغبيش
الصورة يعتمد
على جعل
الصورة نقاط
عشوائية . هذه
النقاط
العشوائية
نقوم بانشائها
باستخدام
الدالة rnd . و
اليك الكود
الذي سيبين لك
العملية
Dim bmap = New
Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim tempbmp As New Bitmap(PictureBox1.Image)
Dim i As Integer, j As Integer
Dim DX As Integer
Dim DY As Integer
Dim red As Integer, green As Integer, blue As
Integer
With tempbmp
For i = 3 To .Height - 3
For j = 3 To .Width - 3
DX = Rnd()
* 4 - 2
DY = Rnd()
* 4 - 2
red =
.GetPixel(j + DX, i + DY).R
green =
.GetPixel(j + DX, i + DY).G
blue =
.GetPixel(j + DX, i + DY).B
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
Me.Text = "Done diffusing image"
لاحظ
اننا اسندنا
القيمة Rnd() * 4 - 2 للمتغيرين
DX , DY . استخدمت
-2 لكي ات#1581;اشى
حواف الصورة ,
والا فان خطأ
ما سيحدث .
لاحظ
ايضا انه كلما
زدنا قيمة
الرقم
العشوائي (4 , 5 , 6 ) فان
العملية
ستزيد تركيزا
. جربها بنفسك .
و
احب ان اوضح
انه بدون
انشاء متغير tempbmp فان
العملية
ستكون بطيئة
جدا و غير
مرتبة لان العملية
ستؤثر على
الصورة نفسها
في كل امر و عملية
حسابية في
حلقة التكرار
. و لكن
بالمتغير tempbmp فاننا نقوم
بالحسابات في
الخلفية Background واما
التطبيق
بالدالة SetPixel فيكون على
الصورة نفسها
وذلك بالمتغير
bmap و
بالتالي تكون
العملية اسرع
و اجمل .
الاضاءة
في الصور Brightness
هل تساءلت
يوما عن كيفية
تكثيف و تقليل
درجة الاضاءة
في الصور ؟
الفكرة بسيطة جدا
لان فجوال
بيسك .نت يدعم
خاصية اسمها
الفا alpha يمكنك
من خلالها تغيير
درجة شفافية
الصورة . اظن ان
الفكرة قد
وضحت و اليك
الكود الذي
يقوم بتقليل
درجة الاضاءة
في صورة :
PictureBox1.BackColor = Color.Black
Dim bmap = New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim tempbmp As New Bitmap(PictureBox1.Image)
Dim red, green, blue As Integer
Dim i, j As Integer
With tempbmp
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red =
CInt(.GetPixel(j, i).R)
green =
CInt(.GetPixel(j, i).G)
blue =
CInt(.GetPixel(j, i).B)
bmap.SetPixel(j, i, Color.FromArgb(200, red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
كما
تلاحظ فاننا في
بداية الكود
قمنا بتغيير
لون الخلفية
لاداة مربع
الصورة الى
الاسود ثم
قمنا بتغيير
قيمة الفا
للصورة تساوي
200 . و قيمتها بين
0 و 255 .
255 : غير
شفافة .
0 : شفافة
تماما .
و
الخاصية الفا
هي اول تابع
في الدالة SetPixel .
و
اذا اردت ان
تجعل الصورة
اكثر اضاءة
فاجعل
الخلفية
بيضاء white .
الالوان
في الصور
اذا اردت
ان تجعل صورتك
زرقاء مثلا
فاجعل قيمة
اللون الاحمر
و الاخضر تساوي
صفر
Dim bmap = New
Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim tempbmp As New Bitmap(PictureBox1.Image)
Dim red, green, blue As Integer
Dim i, j As Integer
With tempbmp
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red =
CInt(.GetPixel(j, i).R)
green =
CInt(.GetPixel(j, i).G)
blue =
CInt(.GetPixel(j, i).B)
bmap.SetPixel(j, i, Color.FromArgb(0, 0, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
و
اذا اردت مثلا
ان تحذف اللون
الاخضر في
صورتك فاجعل
قيمة اللون
الاخضر تساوي
صفر .
و
اظن ان هذه
العملية
موجودة في
فوتو شوب و تسمى
ب Channels .
التعامل مع
المجلدات
لانشاء
مجلد جديد , عليك كتابة الكود
التالي:-
Dim x As Directory
x.CreateDirectory("c:\folder")
x.Delete("c:\folder")
في
البداية انشانا متغير من
الفئة
Directory
ثم
استخدمنا الدالة
CreateDirectory
والتي
لها
تابع واحد وهو مسار المجلد الذي تريد انشائه
.
اما
الدالة
Delete
فتقوم بحذف المجلد . ولها تابع واحد وهو مسار المجلد الذي
تريد
حذفه .
واذا
اردت معرفة اخر مرة تم الدخول الى مجلد
معين
فعليك بالكود التالي:
n = x.GetLastAccessTime("c:\windows")
MsgBox(n)
كما
تلاحظون فاننا استخدمنا
الدالة
GetLastAccessTime
ولمعرفة
تاريخ انشاء
مجلد:
n = x.GetCreationTime("c:\windows")
MsgBox(n)
خصائص
الملفات
اذا اردت
ان تخفي ملف او ان تجعله للقراءة فقط او او
او , فقم
بكتابة الكود الاتي:
Dim x As IO.File
x.SetAttributes("c:\x.doc", IO.FileAttributes.Compressed)
هذه الدالة لها تابعين هما
مسار الملف الذي تريد التغييير في خصائصه
الخاصية التي تريد اضافتها للملف . وسيعرضلك لسته
فيها جميع الخصائص
قراءة الملفات النصية
اضف
زر امر واكتب الكود الاتي:
'الملف الذي تريد قراءته
Dim FILENAME As String = "C:\x.txt"
'StreamReader يستخدم لقراءة الملفات
Dim objStreamReader As StreamReader
'OpenText تستخدم لفتح ملف ليتم التعامل معه
objStreamReader = File.OpenText(FILENAME)
'ReadToEnd تستخدم لقراءة الملف كاملا
Dim contents As String = objStreamReader.ReadToEnd()
'نسخ محتوى الملف الى مربع النص
TextBox1.Text = contents
'اغلاق الملف
objStreamReader.Close()
وقبل كل شيء
Imports System.IO
اهام شيء
في
الكود السابق هو الكلاس
StreamReader
والذي به مجموعة
من الخصائص
و الوظائف
التي تستخدم في قراءة الملفات .
والنهاية
استخدمت الوظيفة
Close كي
اغلق الملف , ولاني اذا لم اغلقه فانه
لن يقبل اي
عملية Request
عليه من اي مستخدم , وسيعرض الرسالة
Access denied
لان الملف قيد الاستخدام ولم يغلق
.
دوال
الملفات
الدالة
SetAttr
تقوم هذه
الدالة بتغيير
خواص
الملفات للقراءة فقط , مخفي...
ولها
وسيطين:
SetAttr("d:\x.gif", FileAttribute.ReadOnly)
الاول:
الملف
الذي تريد تغير خواصه
.
الثاني:
الخواص التي تريد تغييرها .
الدالة
Kill
تقوم بحذف
الملفات .
Kill("C:\x.txt")
ولها وسيط
وحيد
وهو الملف الذي
تريد حذفه .
الدالة
FileDateTime
القيمة
المسترجعة من هذه الدالة هي الوقت والتاريخ لملف معين
.
MsgBox(FileDateTime("d:\x.gif"))
ولها وسيط
وحيد
وهو الملف الذي
تريد معرفة التاريخ والوقت الذي انشئ فيه
او
المرة
الاخيرة التي تم التعديل فيه
.
الدالة
FileLen :
القيمة
المسترجعة من هذه الدالة هي حجم ملف معين
بالبايتات
.
MsgBox(FileLen("c:\x.txt"))
طبعا راح
يكون
الرقم كبير لانه
بالبايتات . وبالتالي يمكنك القسمة على 1024
لتحويله
الى كيلو بايت
.
الدالة
FileCopy
تقوم
هذه الدالة بنسخ ملف معين من مساره الى مسار اخر
.
FileCopy("C:\x.txt", "d:\x.txt")
لها وسيطين
وهما:
الاول:
مسار الملف الذي تريد نسخه .
الثاني:
المسار
الذي تريد نسخ الملف اليه
.
الدالة
Rename
تقوم
بتغيير اسم ملف او مجلد معين
Rename("C:\x.txt", "C:\y.txt")
ولها
وسيطين:
الاول:
مسار الملف الذي تريد تغيير اسمه
.
الثاني:
المسار والاسم الجديد
.
ويمكنك
تغيير اسم مجلد كامل حتى
لو كانت به
ملفات او مجلدات .
دوال
المجلدات
الدالة
MkDir
تقوم
بانشاء
مجلد
MkDir("C:\fld")
ولها تابع
وحيد وهو
مسار المجلد الذي
تريد انشاؤه .
الدالة
RmDir
تقوم بمسح
مجلد معين بشرط ان يكون المجلد خالي . واذا اردت
حذف مجلد
به ملفات فقم باستخدام الدالة
Kill لمسح
الملفات ثم
استخدم الدالة
RmDir لحذف
المجلد .
RmDir("C:\fld")
ولها تابع
وحيد وهو
مسار المجلد الذي
تريد حذفه .
كما ان
هناك دوال اخرى
مثل
Dir والتي
تتحقق من وجود ملف او مجلد معين .
واليك هذا
الكود على الدالة
Dir
hidden = Dir("C:\WINNT\*.dll", FileAttribute.Hidden)
فالكود
السابق يقوم بالكشف عن ملفات ال
dll
المخفية الموجود في ملفات
الويندوز
.
نكتفي بهذا
القدر من دوال المجلدات
.
حذف ملفات مجلد
سنتعلم اليوم
كود بسيط
مبني على فكرة البرمجة
الدورية Recursive
Programming .
هذا الكود يقوم بمسح
جميع ملفات مجلد
معين ثم يقوم بحذف هذا المجلد . و سابدا بشرح الفكرة منطقيا خطوة بخطوة
1- قم باستدعاء
فضاء الاسماء IO
الذي يحتوي على فئات
المجلدات و
الملفات .
Imports System.IO
2-
الكود التالي يقوم بحذف
جميع ملفات
المجلد
C:XX
Directory.Delete("C:xx", True)
التابع الثاني يطلب منك فيما اذا اردت حذف
المجلد بما فيه
من ملفات و مجلدات او حذف المجلد فقط و هذه الحالة سيكون
المجلد فاضي
.
اذن هذه الدالة ادت الغرض . ولكن تبقى هناك مشكلة او
استثناء بمعنى
اخر , وهو اذا كانت هناك ملفات لها الخاصية
Read-Only فلن
تستطيع هذه
الدالة القيام بحذفها . ولذلك يجب علينا ان نقوم بتغيير خصائص
جميع ملفات
المجلد الى
Normal
3-
لكي تقوم بتغيير خصائص
جميع
ملفات المجلد
الى Normal
يجب ان تكتب هذا الكود
Dim h As String
Sub Clean()
For Each h In Directory.GetFiles("C:xx")
File.SetAttributes(h, FileAttributes.Normal)
Next
End Sub
في البداية استخدمنا العبارة
For Each .... Next ,
لكي نتعامل مع كل ملف
في هذا المجلد . مهمة السطر الاول ان يخزن
مسار كل ملف في
المتغير h
اما السطر الثاني فيقوم بتوحيد خصائص
جميع الملفات
الموجودة في المجلد C:xx
الى Normal
لاحظ ان الكود
السابق لا يقوم
بتغيير خصائص المجلدات و انما خصائص الملفات فقط
.
4-
لاستخدام الاجراء
السابق قم بكتابة هذا الكود
Clean()
Directory.Delete("C:xx", True)
السطر الاول يستدعي الاجراء
Clean
السطر الثاني يمسح المجلد بما فيه من ملفات . كما انه يقوم بحذف
المجلدات التي
ليس
بها ملفات
Read-Only
و باذن الله سوف
اقوم قريبا بوضع
كود يمسح المجلد بما فيه من ملفات ومجلدات و خرابيط ووو , و
سيقوم ايضا على
مبدا البرمجة الدورية Recursive Programming
واليك
الكود كاملا
Dim h As String
Sub Clean()
'On Error Resume Next
For Each h In Directory.GetFiles("C:xx")
File.SetAttributes(h, FileAttributes.Normal)
Next
End Sub
Clean()
Directory.Delete("C:xx", True)
End Sub
ولكن قبل كل شيء لا تنسى
Imports System.IO
الحصول على امتداد ملف
Dim yy
As String = System.IO.Path.GetExtension("c:\file.txt")
MsgBox(yy)
الدالة GetExtension تعطيك امتداد اي ملف تمرره لها .
الكلاس
Class
الكلاس
يتكون من مجموعة من الخصائص و الوظائف . و
الكلاس
ليس كائنا
Object
وانما الكائن ينشأ من الكلاس , اليك
المثال:
Class SimpleClass
Public Sub SimpleMethod()
System.Console.Write("Simple Class")
End Sub
End Class
الكود
السابق
عبارة عن تصريح لللكلاس
SimpleClass
والذي به
الوظيفة
SimpleMethod لاحظ
ان الكود السابق لا يقوم باي عمل الا اذا
كتبت
هذا الكود
:
Class Prog1
Public Shared Sub Main()
Dim obj as New SimpleClass()
obj.SimpleMethod()
End Sub
End Class
التعرف على
انواع
البيانات
الدالة
IsArray
تقوم
بالتحقق فيما اذا
كان
المتغير على شكل مصفوفة او لا
.
Dim x(100)
MsgBox(IsArray(x))
الدالة
IsDate
تقوم
بالتحقق من المتغير اذا كان على هيئة تاريخ او
لا
.
Dim x
x = InputBox("Enter the date")
If IsDate(x) = True Then
MsgBox("thank you")
Else
MsgBox("enter the date correctly")
End If
الكود
السابق
يطلب من المستخدم كتابة التاريخ . ثم يقوم بالتحقق عن
طريق
الدالة
IsDate
ما اذا كان المستخدم قد ادخل التاريخ بشكل
صحيح او
لا .
الدالة
IsNumeric
تقوم
بالتحقق
من
المتغير فيما اذا كان رقما او نصا
.
Dim x
x = InputBox("type your age")
If Not IsNumeric(x) = True Then
MsgBox("type it again please")
End If
الكود السابق يطلب من المستخدم ادخال عمره . فاذا كتبه نصيا فان البرنامج يطلب منه اعادة كتابته رقميا .
تحويل انواع
البيانات
1- CBool :
تقوم بتحويل
نوع المتغير الى قيمة
Boolean
اي
(True , False ) .
2- CByte :
تقوم بتحويل
نوع
المتغير
الى قيمة بايت
.
3- CDate :
تقوم بتحويل
نوع
المتغير
الى قيمة تاريخ
.
4- CDec :
تقوم بتحويل
نوع
المتغير
الى قيمة عشرية
.
5- CDble :تقوم
بتحويل نوع
المتغير
الى عدد مضاعف
.
6- CInt :
تقوم بتحويل
نوع
المتغير
الى عدد صحيح
.
7- CLong :
تقوم بتحويل
نوع
المتغير
الى عدد طويل
.
8- CStr :
تقوم بتحويل
نوع
المتغير
الى نص .
و
ساعطيك مثال على الدالة الاخيرة لتعرف
كيف
تقوم بالتحويل في انواع البيانات
:
MsgBox(CStr(123))
في هذه المثال
حولنا العدد 123 الى قيمة نصية يمكن استخدامها في الدوال التي
تطلب منك ادخال قيمة نصية وليس عددية
التدقيق الاملائي
سنتعلم اليوم
فكرة
جميلة جدا و
مفيدة و هي التدقيق الاملائي للنص . بالطبع
لن نقوم بعمل
فهرس للكلمات
و لكن سنقوم باستدعاء المدقق الاملائي لبرنامج الوورد . و سنقوم
بعمل برنامج
لا يقوم بالتدقيق الاملائي و حسب , وانما يعطيك المقترحات
للكلمات
الخاطئة .
في البداية
ابدا مشروع ويندوز جديد , ثم اضف زري
امر2
listbox , textbox ,
ثم من قائمة
Project اختر
Add Reference .
من علامة التبويب
com اختر
العنصر
Microsoft Word 10 Object Library طبعا
لازم تكون مركب الوورد
,ثم اضغط
OK
و اليك الكود
مع الشرح
هذا الكود
تحت زر الامر رقم واحد
'يمثل
هذا المتغير برنامج الوورد
public WordApp As New Word.Application()
'
يمثل هذا
المتغير النص المكتوب
Dim DRange As Word.Range
Me.Text = "Starting Word ..."
'اضافة
مستند جديد
WordApp.Documents.Add()
Me.Text = "Checking words..."
'
تعرف النص المكتوب الحالي و الموجود في المستند الذي
اضفناه
DRange = WordApp.ActiveDocument.Range
'ادخال
النص المكتوب في مربع النص الى المستند
DRange.InsertAfter(TextBox1.Text)
'يمثل
هذا المتغير الاخطاء الاملائية
Dim SpellCollection As Word.ProofreadingErrors
'تعريف
الاخطاء الاملائية المكتوبة في النص
SpellCollection = DRange.SpellingErrors
'اذا
كانت هناك اخطاء املائية في النص
If SpellCollection.Count > 0 Then
Dim iword As Integer
Dim newWord As String
' حلقة
تكرارية تضيف جميع الاخطاء الاملائية الى
اللستة
For iword = 1 To SpellCollection.Count
newWord = SpellCollection.Item(iword).Text
ListBox1.Items.Add(newWord)
Next
End If
Me.Text = "Word spelling Demo"
End Sub
الكود السابق يقوم بفحص
النص المكتوب في مربع النص , ثم يقوم
بادراج الكلمات الخاطئة (الغير معرفة في فهرس الوورد)
الى اللستة رقم واحد .
و ساقوم باضافة الجزء
الثاني في الدرس القادم انشاء الله و هو
عن كيفية استدعاء المقترحات للاخطاء الاملائية .
احب فقط ان اوضح السيناريو السابق:
في البداية
انشانا مستند جديد , ثم قمنا بانشاء صفحة (range)
و هي التي بها النص . بعد
ذلك نقلنا النص الموجود في مربع النص الى الصفحة , ثم قمنا بعمل
التدقيق الاملائي و اظهار النتائج في برنامجنا . و هذا كل
مافي الامر .
التدقيق الاملائي 2
سنقوم باضافة
المقترحات في
اللستة رقم 2 للاخطاء الاملائية الموجودة في اللستة رقم1فاذا اختار
المستخدم كلمة من الكلمات المقترحة ثم ضغط على الزر رقم 2 فان
البرنامج يقوم
باستبدال الكلمة الخاطئة في مربع النص بالكلمة المقترحة التي
اختارها
المستخدم .
Private Sub
ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
ListBox1.SelectedIndexChanged
'
يمثل هذا المتغير الكلمات المقترحة
Dim CorrectionsCollection As Word.SpellingSuggestions
'ناخذ الكلمات المقترحة للاخطاء الاملائية
الموجودة في اللستة 1
CorrectionsCollection =
WordApp.GetSpellingSuggestions(ListBox1.Text)
'مسح جميع العناصر الموجدة في اللستة 2
ListBox2.Items.Clear()
'اذا كانت هناك مقترحات للاخطاء الاملائية
If CorrectionsCollection.Count > 0 Then
Dim iWord As Integer
'حلقة
تقوم باضافة الكلمات المقترحة الى اللستة 2
For iWord = 1 To
CorrectionsCollection.Count
ListBox2.Items.Add(CorrectionsCollection.Item(iWord).Name)
Next
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
'اذا كانت
هناك اخطاء املائية و مقترحات لهذه الاخطاء
If ListBox1.SelectedIndex >= 0 And ListBox2.SelectedIndex >= 0 Then
' اسبدال
الكلمات الخاطئة في مربع
النص بالكلمات المقترحة
TextBox1.Text = Replace(TextBox1.Text, _
ListBox1.SelectedItem, ListBox2.SelectedItem)
'حذف
الخطا الاملائي في اللستة 1 بعد القيام
باسبداله
ListBox1.Items.Remove(ListBox1.SelectedIndex)
ListBox2.Items.Clear()
End If
End Sub
العمليات الحسابية المعقدة مع الاكسل
من
المعروف ان من
اهم الوظائف التي يقوم بها برنامج الاكسل هي القيام بالعمليات
الحسابية
المعقدة جدا . لذلك سنتعرف اليوم على كيفية ربط برنامج الاكسل و
ادخال العبارات
الحسابية اليه ثم اخراج النتائج
.
اولا: من قائمة
Project اختر Add Reference ,
من علامة التبويب
com اختر العنصر
Microsoft Excel 10 Object Library
ثم اضغط OK .
ثانيا: اضف زر
امر و اكتب
الكود الاتي:
'يمثل
هذا المتغير
برنامج الاكسل
Dim exl As New Excel.Application()
'سنخزن
في هذا المتغير عبارة رياضية معقدة
Dim mathStr As String
'امكانية ادخال العبارات الرياضية من المستخدم
mathStr = InputBox("Enter math expression to evaluate", , _
"cos(56.7/4)/exp(-4.269)")
If mathStr <> "" Then
Try
'اظهار
نتيجة العبارة الرياضية
MsgBox(exl.Evaluate(mathStr).ToString)
'في
حال وجود
خطأ
Catch exc As Exception
MsgBox(exc.Message)
End Try
End If
اصدار نظام التشغيل OSVersion
لمعرفة
رقم اصدار نظام التشغيل
Operating System :
ضع زر
امر على الفورم
(Button)
واكتب الكود
التالي:
MessageBox.Show("OS Version: " + Environment.OSVersion.ToString, "Operating System")
كما تلاحظون فاننا نستخدم الكلاس Environment
المدة
المستغرقة منذ تشغيل الجهاز
اولا :
قم بانشاء زر
button
ثانيا :
اكتب هذا الكود
:
Dim x As System.Environment
Dim y As Integer
y = (x.TickCount()) / 60000
MsgBox("المدة المستغرقة منذ تشغيل الجهاز هي " + y.ToString + " دقيقة")
End Sub
زبدة
الكود
السابق
تكمن في الدالة
TickCount
والتي تقوم
بارجاع المدة
المسغرقة منذ تشغيل الجهاز على شكل مللي ثانية أي
MilliSecond .
ولتحويلها الى دقائق يجب ان نقسم الالقيمة المسترجعة على
60000 .
وكما
تلاحظون فقد حولنا المتغير
y من
قيمة عددية الى
قيمة
نصية وذلك لكي نعرضها في ال
MsgBox
واريد
ان انوه ايضا
بان
الدالة
TickCount
موجودة في
الفئة
Enviroment
والتي
استدعيناها في اول الكود
.
التعامل مع
الريجستري
(Registry)
سنتعرف
في هذا الدرس البسيط كيفية
التعامل
مع مسجل النظام
Registry
ساقوم
بعمل برنامج يحفظ
عرض و
طول النموذج
Form
بحيث اذا خرج المستخدم من البرنامج
ودخل
عليه مرة اخرى فانه يجده على الحالة التي تركه عليها من حيث
الطول
والعرض .
اولا :
قم بانشاء زري امر
button ,
و اجعل
الخاصية
text
للزر الاول تساوي
"save"
وللزر الثاني
"Restore" .
ثم قم بكتابة
الكود التالي:-
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles save.Click
Dim w As Integer = Me.Width
Dim h As Integer = Me.Height
Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey("Software", True)
Dim newkey As RegistryKey = key.CreateSubKey("MCBInc")
newkey.SetValue("width", w)
newkey.SetValue("height", h)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Restore.Click
Dim x As RegistryKey = Registry.LocalMachine.OpenSubKey("software\\MCBinc")
Dim wval = x.GetValue("width")
Dim hval = x.GetValue("height")
Me.Width = wval
Me.Height = hval
End Sub
ولا تنسى :
Imports Microsoft.Win32.Registry
Imports Microsoft.Win32.RegistryKey
شرح الكود: تعاملنا في الكود
السابق مع الريجستري . ففي الزر الاول قمت بانشاء متغيرين وجعلت
قيمة الاول عرض الموذج وقيمة الثاني طول النموذج.
ثم انشات
متغير وجعلته على هيئة مفتاح ريجستري . ومفاتيح الريجستري
الاساسية خمسة منها المفتاح LocalMachine
والذي يقوم بحفظ
التغييرات التي يقوم بها المستخدم في البرامج . ثم استخدمت
الوظيفة OpenSubKey
والتي تقوم بفتح مفتاح في الريجستري ليكون
جاهزا للتعامل معه من حيث الاضافة او الحذف او التعديل. وهذه
الوظيفة لها تابعين :-
الاول: اسم او مسار المفتاح الذي تريد
التعامل معه.
الثاني: تحديد ما اذا كنت تريد ان تضيف او تكتب
شيئا في المفتاح . ووضعناها true
لاننا نريد حفظ وضعية الطول
والعرض في البرنامج .
وبعدها استخدمت الدالة CreateSubKey
والتي تقوم بانشاء مفتاح فرعي , ولها تابع واحد وهو
اسم المفتاح الفرعي .
ثم بعدها نستخدم الوظيفة SetValue
لنقوم باضافة
قيمة للمفتاح , ولها تابعين:-
الاول:- اسم القيمة التي تريد
اضافتها .
الثاني:- القيمة التي تريد اضافتها . ووضعت هنا عرض
و طول الفورم .
في الزر الثاني قمت بفتح مسار المفتاح
الذي انشاته مسبقا لاقوم باسترجاع البينات منه . وهنا ما يحتاج
ان اجعل التابع الثاني true
لانني لن اضيف او اعدل شيء في القيم
وانما ساسترجع بيانات فقط .
وبعدها استخدمنا الدالة GetValue
والتي تقوم باسترجاع القيم , ولها تابع واحد وهو اسم
القيمة التي نريد استرجاعها
.
واخيرا نقوم بتعديل قيم طول وعرض
الفورم.
Sleep
اذا اردت ان تجعل برنامجك يتوقف عن الاستجابة لفترة زمنية معينة فما عليك الا كتابة السطر التالي:
System.Threading.Thread.Sleep(5000)
الدالة
Sleep تقوم بالعمل , ولها تابع واحد وهو المدة الزمنية التي تريد
برنامجك ان يتوقف عن الاستجابة فيها , وتقاس بالمللي ثانية
. ولكي تحولها الى ثانية يجب عليك بضرب العدد في 1000 لذا الكود
السابق يقوم بالتوقف لمدة 5 ثوان
.
تغيير شكل
المؤشر
اذا
اردت تغيير شكل المؤشر فعليك بكتابة السطر
التالي:-
Cursor.Current = Cursors.WaitCursor
في
الشطر الأيسر من الكود
استدعيت
الفئة
Cursor
وتعني مؤشر الفارة . ثم استخدمت الخاصية
Current
وتعني المؤشر
الحالي .
اما في
الشطر الايمن فقد
استخدمت
الفئة
Cursors –لاحظ
الفرق بين هذه و تلك- لكي استدعي
المؤشر
WaitCursor .
وبذلك نكون قد
اسبدلنا شكل المؤشر بكل بساطة
, ولكي
نسترجع المؤشر السابق فعلينا كتابة الكود
التالي:-
Cursor.Current = Cursors.Default
الدرايفات Drives
اذا اردت ان تعرف اسماء الدرايفات الموجودة في جهازك عن طريق برنامج تعمله انت ,
فاتبع الخطوات :-
ابدأ مشروع Console Application
امسح صفحة الكود , و اكتب هذا الكود
Module Module1
Sub Main()
'استدعاء الاجراء
ShowDrives()
End Sub
Private Sub ShowDrives()
Dim d() As String
'نخزن اسماء الدرايفات الموجودة في الجهاز في المتغير d
d = System.IO.Directory.GetLogicalDrives
'تعريف عداد
Dim en As System.Collections.IEnumerator
'نعدد الدرايفات الموجودة في الجهاز
en = d.GetEnumerator
'حلقة تكرار تقوم بكتابة اسماء الدرايفات بالترتيب
While en.MoveNext
Console.WriteLine(CStr(en.Current))
End While
'ايقاف تنفيذ البرنامج لنقوم بالقراءة
Console.ReadLine()
End Sub
End Module
دقة الشاشة
GetScreenResolution()
End Sub
Public Function GetScreenResolution() As System.Drawing.Size
Dim x
'هذا الكلاس الذي يعطيك دقة وضوح الشاشة
x = System.Windows.Forms.SystemInformation.PrimaryMonitorSize
MsgBox(x.ToString)
End Function
تشغيل برنامجك عند بدء التشغيل
اذا اردت برنامجك يعمل عند بداية تشغيل الويندوز Start up فعليك كتابة الكود
الاتي:
Dim x As String =
System.Environment.GetFolderPath(Environment.SpecialFolder.Startup)
Dim y As String = System.Environment.CurrentDirectory
System.IO.File.Copy(y + "\" + "windowsapplication1.exe", x + "\" + "xx.exe")
السطر الاول يعطيك مسار مجلد بدء التشغيل .
السطر الثاني يعطيك مسار مجلد برنامجك .
السطر الثالث يقوم بنسخ برنامجك من مجلده الاصلي الى مجلد بدء التشغيل .
لاحظ ان يجب عليك استخدام "\" لكي تنسخ ملف معين موجود في مجلد .
التعامل مع
النصوص
الدالة Asc
:
تعطي
الرقم المقابل لحرف
معين
.
MsgBox(Asc("x"))
سيكون
الناتج 120
.
الدالة Chr
: تعطي
الحرف المقابل
لرقم
معين و هي معاكسة للدالة Asc
MsgBox(Chr("120"))
سيكون
الناتج هو
الحرف
x
الدالة
LCase
: تحول
الحروف الكبيرة
Capital
الى صغيرة من
A الى
a
MsgBox(LCase("HOLA"))
الدالة
UCase
: تحول
الحروف الصغيرة الى كبيرة (من
a الى
A )
MsgBox(UCase("hola"))
الدالة
Instr
: تعطيك
موقع النص 1 خلال
النص 2
. والمثال هو افضل وسيلة للتوضيح
:
Dim x, y As String
x = "look Over over there"
y = "over"
MsgBox(InStr(x, y, CompareMethod.Text))
الكود
السابق
يعرض لك موقع الكلمة
y خلال
الجملة x .
الدالة
Instr
لها 3 وسائط
:
1- النص
الذي تريد البحث فيه
.
2- النص
الذي
تريد البحث عنه
.
3- نوع
طريقة البحث , فلو اخترت ال
Binary
فان البحث سيضع في الحسبان الحروف الكبيرة و الصغيرة
.
يعني
الكود السابق سيعرض لك في صندوق الرسالة الرقم 6 لان
موقع
اول حرف في الكلمة
over
خلال النص
x هو 6
. ولكن لو غيرنا
الطريقة
من text
الى
binary
فانه سيعرض لك الرقم 11 لان
over
الاولى كابيتال
.
الدالة
Instr
تفيدك في البحث كثيرا
.
الدالة
StrComp
: تقارن
بين نصين من حيث
الحجم
.
MsgBox(StrComp("helo", "helo", CompareMethod.Text))
سيعرض لك القيمة صفر لان النصين متطابقين .
MsgBox(StrComp("heloo", "helo", CompareMethod.Text))
سيعطيك القيمة
1 لان
النص
الاول اكبر من الثاني
.
MsgBox(StrComp("hel", "helo", CompareMethod.Text))
سيعطيك القيمة
1 لان
النص
الاول اصغر من الثاني
.
الدالة
Len :
تعطيك
عدد
حروف نص معين
.
MsgBox(Len("الحمد لله"))
ستكون
القيمة 9
لان عدد
حروف الجملة هي 9
الدالة
Trim :
تزيل
مسافات النص من اليمين ومن اليسار
.
Dim x As String = InputBox("Type your name")
MsgBox(Trim(x) + "OK")
فلو
وضعت
مسافة
على يمين النص فستلاحظ انه ازيل
.
الدالة
Space
: تضيف
مسافة الى النص
.
Dim x As String = InputBox("Type your name")
MsgBox(x + Space(5) + "OK")
فستضيف بين
النصين مسافة حجمعا 5 حروف
الدالة
StrDup
:
تعطيك
رمز او حرف او نص
مكرر
بعدد معين من المرات
.
MsgBox(StrDup(20, "!"))
فمثلا
الكود
السابق
يعرض الرمز ! عشرين مرة
.
الدالة
StrReverse
:
تقوم بعكس نص
معين .
MsgBox(StrReverse("helo"))
الدالة
Replace
:
تقوم
باستبدال نص معين خلال جملة بنص اخر
.
Dim x As String = "Visual Basic .NET"
MsgBox(Replace(x, ".NET", "Seven"))
الكود السابق
يعرض الجملة x ولكن
بعد ان يستبدل الكلمة .NET ب
Seven
تفيدك في البحث اذا اردت اضافة ميزة الاستبدال كما في
برامج تحرير النصوص
تنسيق
البيانات
الدالة
Format :
تقوم بتنسيق رقم او تاريخ او
عملة الى
نمط معين .
MsgBox(Format(54681251, "$###,##,##"))
الكود السابق
يقوم بتحويل رقم الى عملة بنمط معين . هذا النمط يحدد في الوسيط
الثاني للدالة
من خلال هذه الدالة يمكنك تحويل انماط
كثيرة للبيانات
الدالة
LSet
:
تقوم بمحاذاة النص الى جهة
اليسار
.
الدالة
RSet
:
تقوم بمحاذاة النص الى جهة
اليمين
.
MsgBox(RSet("helo", 100))
الكود السابق
يقوم بمحاذاة كلمة helo
الى جهة اليمين بمقدار 100 خانة
تصفح الانترنت
توجد اداة
جاهزة في Visual Studio.Net
لاستراض صفحات
الانترنت, واذا اردت استخدام هذه الاداة فعليك باتباع الخطوات
التالية:
1- من
القائمة Tools ,
قم باختيار
Customize ToolBox .
2- من
علامة التبويب COM Components
اختر الاداة
Microsoft Web Browser ,
ثم اضغط
OK .
3- من
Windows Forms
الموجودفي صندوق الادوات
ToolBox
ستجد الاداة Explorer ,
اضغط
عليها
مرتين لكي تضيفها الى الفورم.
4- اضف زر
امر واكتب هذا
الكود:
AxWebBrowser1.Navigate("www.google.com")
الدالة
Navigate
تقوم بعرض صفحة معينة . ولها تابع واحد وهو الصفحة التي تريد
عرضها في الاداة
.
واليك اهم
الاوامر المتعارف
عليها:
AxWebBrowser1.GoBack()
AxWebBrowser1.GoForward()
AxWebBrowser1.GoHome()
AxWebBrowser1.Refresh()
AxWebBrowser1.Stop()
ويمكنك
تجربة
الخصائص
والاوامر الاخرى التي تتيحها لك هذا الاداة
الرائعة.
تحميل ملف من الانترنت
هذا الكود يقوم
بتحميل
ملف من النت:
Dim wc As New System.Net.WebClient()
wc.DownloadFile("http://www.microsoft.com/homepage/gif/artHome.gif",
"c:x.gif")
End Sub
بطل الكود هو : الدالة
DownloadFile والتي
توجد في الكلاس WebClient
والذي يوجد في
فضاء الاسماء Net .
الدالة DownloadFile
لها تابعين:
1- الملف الذي تريد تحميله
من الشبكة .
2- المسار الذي تريد فيه
تحميل الملف .
واذا واجهتك
مشكلة في الكود السابق فارجو ابلاغي بذلك .
انشاء تطبيقات الويب Web Application
للقيام
بعمل برنامج ويب مبسط -كبداية-
فاتبع
الخطوات الاتية:
* في
البداية يجب التاكد من ان
IIS مثبت
في الويندوز 2000 او
XP .
1- شغل
Visual Studio.NET
و
Internet Explorer ,
ثم تاكد في Internet Explorer
من انه لا
توجد علامة صح امام
Work Offiline
وذلك من قائمة File .
2- في
Visual Studio.NET ,
من قائمة
File اشر
على New
ومن ثم Project .
3- اختر
ASP.NET Web Application .
4- من
ToolBox ومن قائمة
Web Forms
اضف زر امر
Button .
5- اكتب
الكود التالي بعد ان تضغط على الزر مرتين:
Response.Write("أهلا وسهلا")
الامر
السابق يقوم
بكتابة
اهلا وسهلا في المتصفح .
6- اضغط
على F5
لكي تقوم
بعمل
Debug و استعراض للصفحة
.
وبالتالي
نكون قد انشانا
تطبيق ويب
بلغة ASP.NET-VB
. كما يمكنك انشاء التطبيقات بواسطة
ASP.NET-CS بلغة
CSharp
ولكن لان موضوعنا يهتم بال
Visual Basic.NET
فسوف نكتب تطبيقات الويب بلغة
VB.NET .
بواسطة
تطبيقات الويب فانك تستطيع ان تقوم بعمل صفحة ويب تعرضلك نظام
التشغيل و اسم المستخدم و المدة الزمنية المستغرقة في تشغيل
الجهاز والتحكم بالصور كالتكبير والتصغير وتحويل الصيغ وقلي
الصورة وغيرها من الامور التي كنا نحلم بان نعملها على الويب
.
يبقى الان
قضية نشر الصفحة على الويب
.
كما نعلم
بان هذه
التقنية جديدة
وبالتالي فانك لن تجد مواقع كثيرة
مجانية
تستضيف وتدعم هذه الصيغة والتي هي
aspx .
ولكن بعد البحث وجدت
هذا الموقع
الجيد الى حد ما
http://www.brinkster.com/ .
سجل في هذا
الموقع لكي تستطيع تحميل
UpLoad
صفحاتك الى النت وتعمل لها Test .
ولكن هناك
مشكلة ولها حل وهي: ان الموقع السابق لا يدعم
الكود
المفصول , بمعنى اخر انه لا يدعم بان يكون كود الفجوال
بيسك مفصول
عن كود ال HTML .
والحل هو دمج
الكودين في صفحة كود
واحدة بامتداد
aspx .
واذا دمجنا الكود السابق مع كود ال HTM;
فان الناتج هو
الاتي:
<%@ Page Language="VB" %>
<script runat="server">
Sub Button1_Click(sender As Object, e As EventArgs)
response.write("اهلا وسهلا")
End Sub
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:Button id="Button1" oncl
</form>
</body>
</html>
فكما
تلاحظون
فان الكود معقد
نسبيا كما ترون لمن لا يفهم في HTML
ولذلك فان
مايكروسوفت قدمت لنا محرر
ASP.NET
يدعى Web
Matrix يقوم بدمج الكود بدون اي عناء , يمكنك تحميله من
http://www.asp.net/Default.aspx?tabindex=4&tabid=46 .
حجمه ميغا
وشوية . انصحكم بتحميله لانه مفيد جدا وبسيط ولا
يحتاج الى
شرح
والسلااااااااااام
البريد
الالكتروني
E-Mail
يمكنك
باستخدام تطبيقات الويب في فيجوال
ستديو .نت
ان تنشئ تطبيق ويب يقوم بارسال رسالة الكترونية الى اي
شخص تريد ,
والميزة هنا ان الارسال يكون بدعم ذاتي وليس بدعم
برنامج
بريد كال Outlook
كما في مواقع
الانترنت .
ولكن
قبل ان نقوم بكتابة الكود , هناك القليل من الخطوات والتي يجب
ان
تقوم بها:
1- افتح
IIS , ومن خانة
Default SMTP Virtual Server
اضغط عليها باليمين واختر
Properties .
2- من خانة
التبويب
Access
اضغط على
Relay .
3- اختر
All exept the list below ,
ثم اضغط
OK .
4- الان
شغل تطبيق ويب وتاكد من المتصفح
شغال وانه
لا توجد علامة على work offline
واضف زر امر واكتب
الكود الاتي:
System.Web.Mail.SmtpMail.SmtpServer = "localhost"
System.Web.Mail.SmtpMail.Send("x@x.com", "y@y.com", "the subject", "the body")
في الكود
السابق
استخدمنا خدمة ال
SMTP والتي تاتي مع
IIS ,
وتدعم ارسال رسائل
البريد الالكتروني . اما
LocalHost
فيقوم مقام الملقم او
السيرفر.
اما الدالة
Send فتقوم بارسال الرسالة ولها 4
توابع:
1- المرسل
: تخيل ان بمقدورك التلاعب باسم المرسل
. يعني
ترسل رسالة لشخص معين و يكون اسم المرسل شخص انت تحدده
2- المرسل
اليه .
3- عنوان
الراسلة .
4- محتوى
الرسالة .
و الكلاس
SMTPMail
يوجد في فضاء الاسماء
Mail والذي
يوجد في فضاء الاسماء Web
5- اضغط
على F5 ,
واضغط على الزر , لن ترى شيئا ولكن بمجرد ان تتصل بالانترنت
فان
ال
IIS يقوم
بارسال الرسالة اوتوماتيكيا .
معلومات عن
المتصفح
يمكنك جلب
معلومات عن متصفح الانترنت لديك , اضف
زر امر
واكتب الكود التالي:-
Response.Write("Type = " & Request.Browser.Type & "<br>")
Response.Write("Name = " & Request.Browser.Browser & "<br>")
Response.Write("Version = " & Request.Browser.Version & "<br>")
Response.Write("Platform = " & Request.Browser.Platform & "<br>")
Response.Write("Is Beta = " & Request.Browser.Beta & "<br>")
Response.Write("Is Crawler = " & Request.Browser.Crawler & "<br>")
Response.Write("Is AOL = " & Request.Browser.AOL & "<br>")
Response.Write("Is Win16 = " & Request.Browser.Win16 & "<br>")
Response.Write("Is Win32 = " & Request.Browser.Win32 & "<br>")
Response.Write("Supports Frames = " & Request.Browser.Frames & "<br>")
Response.Write("Supports Tables = " & Request.Browser.Tables & "<br>")
Response.Write("Supports Cookies = " & Request.Browser.Cookies & "<br>")
Response.Write("Supports VB Script = " & Request.Browser.VBScript & "<br>")
Response.Write("Supports JavaScript = " & Request.Browser.JavaScript & "<br>")
Response.Write("Supports Java Applets = " & Request.Browser.JavaApplets & "<br>")
صورة عامة:
استخدمنا في الكود السابق الكلاس
Request
والذي يمكنك من جلب
معلومات
هامة , كالمتصفح وامكانياته , والكوكي واللغة واسم
السيرفر
وغيرها , ولكننا اليوم استخدمنا الكلاس
Browser
لنتعرف
على المتصفح الذي يستخدمه العميل
Client .
اما "<br>"
فتعني سطر
جديد في لغة
HTML .
الخاصية Type :
وتعطيك اسم
المتصفح و
ورقم الاصدار
.
الخاصية
Name : تعطيك اسم المتصفح
.
الخاصية
Version :
تعطيك رقم الاصدار
.
الخاصية
Platform :
وتعطيك اسم نظام التشغيل والذي يشتغل تحته المتصفح.
الخاصية
Beta: تحدد اذا ما كان المتصفح
Beta او لا
.
الخاصية
Crawler :
متعلق بمحركات البحث.
الخاصية
AOL : وتحدد ما اذا كان
العميل من
عملاء شركة AOL .
الخاصية
Win16 : تحدد ما اذ كان
نظام
الكمبيوتر مبني على
Win16 .
الخاصية
Win32 : تحدد ما اذ
كان نظام
الكمبيوتر مبني على Win32 .
الخاصية
Frames: تحدد ما
اذا كان
المتصفح يدعم الاطارات او الفريمات .
الخاصية
Table : تحدد ما اذا كان المتصفح يدعم الجداول
.
الخاصية
Cookies:
تحدد ما اذا كان المتصفح يدعم الكوكيز
.
الخاصية
VBScript :تحدد ما اذا كان المتصفح يدعم لغة
VBScript .
الخاصية
JavaScript :تحدد ما اذا كان المتصفح يدعم لغة جافا سكربت
JScript .
الخاصية
JavaApplet :
تحدد ما اذا كان المتصفح يدعم
تطبيقات
الجافا .
الكوكيز Cookies
الكوكيز هي ملفات صغيرة يخزن فيها معلومات عن المستخدم كاسمه والكلمة السرية و مفضلاته وغيرها .
'نختبر ما اذا كان هناك كوكي باسم myname '
If Request.Cookies("myname") Is Nothing Then
Dim cookie As HttpCookie
'ننشيء اسم للكوكي'
cookie = New HttpCookie("myname")
'نضع قيمة للكوكي'
cookie.Value = "hola"
'نضيف الكوكي'
Response.AppendCookie(cookie)
Label1.Text = "Cookie Written"
'اما اذا كانت الكوكي موجودة'
Else
Label1.Text = "Cookie already exists : "
Label1.Text = Label1.Text & Request.Cookies("myname").Value()
End If
كود بسيط
جدا يقوم باستخدام ميزة الكوكي يقوم باستخدام الكوكيز
.
الان
اذا دخلت الى الصفحة في المرة الاولى فستعرض لك هذه
الرسالة
Cookie Written
واذا
دخلتها مرة ثانية فستعرض
لك هذه
الرسالة
"Cookie already exists : hola"
واحب ان
اوضح بان قيمة الكوكي Value
ممكن تكون لون
الخلفية او
اسم الخط او لونه وغيرها
.
التشفير
باستخدام
MD5
تستخدم
خوارزمية MD5
لتشفير الكلمات
السرية ,
والميزة من هذه الخوارزمية انها غير قابلة لفك التشفير
Decrypt ,
وبالتالي فانه من المستحيل سرقة الكلمة السرية حتى من مشرف او
مدير الموقع .ولكن تبقى قضية ال
Login .
فلو ادخل المستخدم
الكلمة السرية كي يعمل
Login فكيف
للموقع معرفة ما اذا كانت
الكلمة
السرية صحيحة ام لا الا اذا قام بفك التشفير و مطابقتها
بالاصل ,
وبما ان MD5
غير قابلة لفك التشفير فهناك طريقة اخرى
للتاكد من الكلمة السرية وهي ان يقوم الموقع بتشفير الكلمة
السرية التي ادخلها المستخدم ومن ثم يقوم بمقارنة الشفرة
بالشفرة
المخزنة في قاعدة
البيانات , فاذا كانت متطابقة فانه يقوم بال
Login والا
فلا.
الدالة
التي تقوم بتشفير النص هي ComputeHash
والتي تقوم بتحويل
البايتات التي تمثل النص الى
مصفوفة
بايتات , ولانها تحول بايتات النص فيجب اولا تحويل النص
الى بايتات
وذلك باستخدام الكلاس UTF8Encoding
والذي به الدالة
GetByte والتي تقوم بتحويل النص الى بايتات كما هو معلوم فان
اصل البيانات مكون من بايتات
اليكم كود
التشفير باستخدام
خوارزمية
MD5 :
'النص المراد تشفيره
Dim txt As String = "Encrypt me!"
'متغير من فئة بايت والذي سوف يمثل النص
Dim Bytes As Byte()
' الكلاس الذي يستخدم لتحويل النص الى بايتات
Dim encoder As New UTF8Encoding()
'MD5 Class
Dim md5Hasher As New MD5CryptoServiceProvider()
' عملية التشفير : تحويل النص الى البايتات التي تمثله - تحويل بايتات النص الى مصفوفة بايتات
Bytes = md5Hasher.ComputeHash(encoder.GetBytes(txt))
ولا تنسى
ان
تكتب قبل كل شيء
Imports System.Security.Cryptography
Imports System.Text
Imports System.Data
ارجو من
اهل الخبرة ان يساعدوننا فيها
.
سرقة الصفحات Scraping
بصراحة لم
اجد لScraping
ترجمة
مناسبة , ولكن
معناها هو الاقتباس من صفحة معينة .
قم بالاتي:
1-
اضف زر
امر .
2- اضف
الاداة Literalوالتي
سوف
تعرض فيها
الصفحة
3- اكتب
الكود التالي:
'متغير من فئة webclient
Dim wc As New WebClient()
'القيمة المسترجعة من الدالة DownloadData على شكل بايتات
Dim bytes() As Byte
bytes = wc.DownloadData("http://www.asp.net")
' تحويل البايتات الى سلسلة نصية
Dim objUTF8 As New UTF8Encoding()
Dim html As String
html = objUTF8.GetString(bytes)
' عرض الصفحة
Literal1.Text = html
ولا
تنسى
Imports System.Net
Imports System.Text
اهم شيء في
الكود السابق هو الدالة DownloadData
والتي تقوم بتحميل بيانات
الصفحة المراد عرضها على شكل بايتات , ولكي نجعل الصفحة قابلة
للقراءة فاننا نستخدم الدالة GetString
والتي تحول البايتات الة
سلسلة نصية
String
ملاحظة:لو استبدلت الاداة Literal
بالاداة TextBox
فسوف يعرض كود ال HTML للصفحة
المدة الزمنية
اللتي استغرقها
السيرفر منذ تشغيله
يمكنك
معرفة معلومات
كثيرة عن السيرفر
الذي يستضيف موقعك . واذا كان السيرفر محليا
LocalHost
فهذا يعني ان السيرفر هو الجهاز الذي تشتغل عليه
.
الكود
التالي يوضح كيفية معرفة المدة الزمنية التي
استغرقها
السيرفر من اخر مرة تم اعادة تشغيله فيها . يعني من باب
اللقافة .
اضف زر امر
واكتب الكود
التالي:
Response.Write("The Web server has been running for:" & ts.Days & " days, " & _
ts.Hours & " hours, " & "and " & ts.Minutes & " minutes.")
الكلاس TimeSpan
يفيدك في معرفة مدة زمنية معينة , ولان TickCount
ترجع
بقيمة المللي ثانية فاننا استخدمنا الدالة FromMilliseconds
لنحسب مدة زمنية تحسب بالمللي ثانية . وكما نعرف فان
TickCount تفيدك في معرفة المدة الزمنية التي
استغرقها النظام , وبما اننا ننشئ
تطبيقات للويب فان النظام هنا سيكون السيرفر
واخيرا
نستخدم الخواص Days , Hours , Minutes , Secondes
لمعرفة الزمن
بالتحديد
Uploading
اذا اردت
نقل ملف الى ملقم Server
فقم بالاتي:
1- اضف
زر امر واضف الاداة
File Field
من قسم HTML
الموجود في مربع
الادوات
.
2- قم
بالضغط على الاداة File Field
باليمين واختر
Run As Server Control ,
ثم غير الخاصية
ID للاداة
File Field
الى
File
3- اضف
الكود التالي تحت زر الامر
:
'معرفة مسار الملف
Dim path As String = file.PostedFile.FileName
'استخراج اسم الملف من المسار
Dim name As String = System.IO.Path.GetFileName(path)
'عملية نقل الملف الى السيرفر
file.PostedFile.SaveAs("D:\" + name)
4- قم
بالتحويل
الى محرر ال
HTML لتقوم
باضافة الكود التالي :
<form id="Form1" encType="multipart/form-data" runat="server">
ملاحظات
* الاداة File Field
تفيدك في عملية اختيار الملف .
*الدالة GetFileName
تقوم باستخراج اسم الملف من المسار .
التصفح
الذكي
Smart Browsing
يمكنك
اضافة خاصية التصفح الذكي لصفحتك عن طريق السطر
الاتي:
Page.SmartNavigation = True
وهذه
الخاصية
بها 3 ميزات
:
1- اذا
سويت Back
للصفحة فانها ما راح تتحمل
مرة ثانية
, وانما تعرض بسرعة .
2- اذا
رجعت الى الصفحة فانك
لن تفقد
موقعك الذي كنت فيه , اي انك لو كنت في وسط الصفحة
وتركتها ثم
رجعت اليها فانك سترجع الى وسط الصفحة وليس بدايتها
.
3- اذا كنت
مركز على اداة فانك لن تفقد التركيز عليها
.
خدمات الويب Web Service
عن طريق
Visual Studio.NET
يمكنك انشاء
خدمات
للويب والتي تساعد العميل Client
في جلب بيانات من
خلال
هذه الخدمة
.
وخدمات
الويب لا تعتمد على نظم التشغيل او لغات
البرمجة .
يعني تسلك معاك حتى لو كان نظامك لينكس او ويندوز او
غيره
.
والمثال
التالي يوضح كيفية انشاء خدمة ويب , سنقوم
بالاتي:
1- انشاء
خدمة ويب . جهة السيرفر
Server Side
2- انشاء
تطبيق ويب او ويندوز (كما تحب) . جهة العميل
Client Side
3- اختبار
الخدمة عن طريق تطبيق الويندوز او تطبيق
الويب
.
اولا: خدمة
الويب Server
1- سنقوم
الان
بعمل خدمة ويب
مبسطة , شغل الفيجوال ستوديو .نت . من New Project
اختر
ASP.NET Web Service .
ودع الاسم
WebService1 .
2- اضغط
على الفورم مرتين , ستظهر لك تعليمات بالاخضر . وفي اخر 3
سطور كود
بسيط ولكنه على شكل تعليمات , اذن امسح العلامة ' لكي
تزيل اللون
الاخضر . ويصبح كود فعال
.
<WebMethod()> Public Function HelloWorld() As String
HelloWorld = "Hello World"
End Function
الكود
السابق
يمثل دالة مبسطة
بسيطة جدا تعيد الجملة Hello World .
3- اضغط
على F5
لكي تجرب خدمة الويب التي صنعتها . اتوقع انك ما راح
تفهم شيء
اذا شفت الصفحة لانك قاعد تتعامل مع لغة برمجة (وبالاصح
لغة توصيف
البيانات) اسمها XML .
على اية حال اضغط
على Hellow
World , ثم
Invoke ,
الان سترى القيمة المسترجعة باللون الاسود
والتي هي
Hellow World .
ملاحظة:
احفظ عنوان خدمة الويب
على
الاكسبلورر . فمثلا العنوان عندي هو:
http://localhost/WebService1/Service1.asmx
لاحظ
ان خدمة الويب تنتهي بامتداد
asmx , وان
تطبيق الويب ينتهي
بامتداد
aspx .
4- احفظ
مشروعك كاملا باسم WebService1 .
الى الان
لم نفعل شيء مشوق ويدعو الى الحماس
, ولكننا
سنرى الان ما فائدة خدمة الويب.
ثانيا:-
تطبيق
الويندوز
Client
1- من
New Project
اختر
Windows Application .
2- من
Solution Explorer اضغط
على
Windows Application1
باليمين , ثم
Add Web Reference .
3- اكتب
عنوان خدمة الويب التي عملناها و الذي ذكرتك
بان تحفظه
, ثم اضغط على السهم الاخضر , ثم اضغط على
ADD Reference .
الان ربطنا
التطبيق بالخدمة Link the client to the server .
ثالثا:
الاختبارTesting
1- في
تطبيق الويندوز الذي انشأناه الان , اضف زر امر واكتب الكود
التالي:-
'عملية ربط التطبيق بخدمة الويب برمجيا
Dim x As New localhost.Service1()
'عرض رسالة Hellow World
MsgBox(x.HelloWorld)
2- اضغط F5 , ثم
اضغط على الزر وسترى انه سيعرض لك رسالة Hellow World
والتي
انشأناها في خدمة الويب السابقة .
اذن نفهم من الدرس ان
خدمات الويب تستخدم من العملاء Cleint
للاستفادة من حاجة معينة
كدرجات الحرارة المئوية و اسعار البضائع وارقام الرحلات وغيرها
من التطبيقات المفيدة فعلا .
كما احب ان اذكر باننا انشانا
خدمة ويب من دون كتابة سطر واحد من لغة التوصيف XML
.
ارجو بان
يكون الدرس مفيد , وسنتعلم في الدرس القادم انشاء الله كيفية
عمل برامج او تطبيقات لاجهزة الجوال عن طريق فيجوال بيسك .نت
كما نعلم بان الرياضيات عنصر اساسي في البرمجة . يعني اذا كنت مبرمج فيتوجب عليك ان تكون فاهم في الرياضيات و دوالها. وسنستعرض مجموعة بسيطة من الدوال الرايضية .
لاحظ انه يجب عليك استدعاء المكتبة
Imports System.Math
الدالة
abs
:
ترجع القيمة المطلقة لعدد
معين
MsgBox(Abs(-6))
MsgBox(Abs(6))
سيكون
الناتج 6
في كليهما . لان
القيمة المطلقة تقلب الاشارة السالبة الى موجبة
. وهذه
تفيدنا في قياس الطول و العرض لان المسافة دائما بالموجب
.
الدالة
Round
:
تقوم بتقريب العدد
MsgBox(Round(2.49))
MsgBox(Round(2.51))
في الاولى
سينتج 2
لان .49 اقل من
النصف, وفي الثانية سينتج 3 لان .51 اكثر من
النصف
.
الدالة
Pow
:
تقوم برفع عدد الى
اس معين
.
MsgBox(Pow(2, 4))
سيكون
الناتج 16 ,
لاننا ضربنا العدد
2 في نفسه 4 مرات
.
الدالة
Cos
:
تعطيك جيب تمام زاوية
تقاس بنظام
الراديان .
MsgBox(Cos(3.14))
سيكون
الناتج قريب من السالب واحد
.
ولكن
باستخدام الدالة Round :
MsgBox(Round(Cos(3.14)))
سيكون
الناتج -1
تماما
.
الدالة
Sin
:
تعطيك جيب الزاوية
MsgBox(Round(Sin(3.14)))
الدالة
Tan
:
تعطيك ظل الزاوية
MsgBox(Round(Tan(3.14)))
الدالة Log : تعطيك اللوغاريثم الطبيعي و ليس العشري
MsgBox(Log(2.7))
احب
فقط ان اذكر بان الدوال السابقة
لن
تعمل
الا بكتابة هذا السطر في بداية صفحة
الكود لكي نقوم باستدعاء الدوال الرياضية
:
Imports System.Math
التاريخ و
الوقت
ثانيا: بعد
ان
اخذنا لمحة سريعة
على الدوال الرياضية في فيجوال بيسك .نت
, سابدا
بدوال التاريخ و الوقت . و هي دوال سهلة و مفيدة
.
الدالة
Now
:
تعطيك الوقت و التاريخ الحالي
.
MsgBox(Now)
الدالة
Weekday
:
تعطيك رقم
اليوم (من
1 الى 7 ) لتاريخ معين .
ولها
تابعين:
الاول:
التاريخ الذي تريد رقم يومه .
الثاني:
اليوم الاول في الاسبوع . لان اليوم الاول
يختلف من
مجتمع لاخر .
MsgBox(Weekday(Now, FirstDayOfWeek.Saturday))
فمثلا في
الكود السابق ستعطيك الدالة الرقم 2 اذا كان اليوم هو يوم
الاحد ,
او الرقم 3 اذا
كان اليوم هو الاثنين
.
الدالة
DateSerial
:
MsgBox(DateSerial((Now.Year), (Now.Month), (Now.Day) + 1000))
الكود السابق
يعطيك التاريخ بعد 1000 يوم من الان .
هذه الدالة لها 3 توابع (
السنة , الشهر , اليوم ) ثم اضفت 1000 يوم لكي تعطينا
التاريخ بعد 1000 يوم .
الدالة
DateDiff
:
تعطيك الفترة بين
تاريخين
محددين .
Dim date1 As Date = #3/30/2000#
MsgBox(DateDiff(DateInterval.Day, date1, Now).ToString + " day")
الدالة DateDiff لها 3 توابع :
الاول: نوع التاريخ يوم , شهر , سنة
الثاني: التاريخ الذي تريد طرحه
الثالث: التاريخ الذي تريد ان تطرح منه
الدالة DatePart : تجزئ تاريخ معين .
MsgBox(DatePart(DateInterval.Month, Now))
التابع
الاول : الجزء الذي تريده من التاريخ .
التابع الثاني:
التاريخ الذي تريد جزءا منه .
تاريخ اليوم
لمعرفة
تاريخ اليوم , عليك وضع زر امر على الفورم ومن ثم كتابة
الكود
التالي:
MessageBox.Show("Today's Date is: " + DateTime.Now.ToShortDateString())
الدالة Now و التي يتيحها لك الكلاس DateTime تعطيك تاريخ اليوم .
دوال متنوعة
الدالة
Rnd
:
تقوم بانشاء رقم عشوائي بين
عددين
.
MsgBox(Rnd() * 5)
الكود
السابق
يقوم بانشاء رقم
عشوائي بين العدين 1 و 5
واذا اردت
ازالة الارقام العشرية فعليك باستخدام الدالة
Round
.
MsgBox(Round(Rnd() * 5))
و اذا اردت
عدم
تكرار الرقم
العشوائي فعليك باستخدام الدالة
Randomize
,
ولكن لا يمكنك
استخدام الدالة
Round لانها ستقرب العدد و بالتالي
سيتكرر
لديك الرقم العشوائي .
Randomize()
MsgBox(Rnd() * 5)
احب ان اذكر فقط بانك اذا اردت استخدام الدالة Round فعليك باستدعاء دوال الرياضيات .
Imports System.Math
الدالة Shell : تقوم بتشغيل برنامج معين .
Shell("notepad.exe", AppWinStyle.MaximizedFocus)
التابع
الاول :
مسار البرنامج
الذي تريد تشغيله
.
التابع
الثاني : كيفية فتح
النافذة كبيرة , صغيرة , عادية , مخفية
الدالة
IIF
:
اليك المثال
.
MsgBox(IIf(5 = 4, "right", "wrong"))
التابع
الاول :
اي عبارة . و في
هذا الكود و ضعت العبارة 5 تساوي 4 . و هي عبارة
خاطئة
.
التابع
الثاني : ما ستعيده الدالة اذا كانت
العبارة
صحيحة .
التابع
الثالث : ما ستعيده الدالة اذا
كانت
العبارة خاطئة
.
وطبعا راح
تكون النتيجة wrong
لان العبارة خاطئة
. ولكن لو كانت العبارة 5 تساوي 5 لكانت
النتيجة
right .
الدالة
Environ
:
تعطيك
متغيرات
نظام التشغيل اسم المستخدم , اسم الجهاز , مسار مجلد
الويندوز
... الخ
MsgBox(Environ(27))
الكود
السابق
يعيد اسم المستخدم
. يمكنك ان تجرب الاعداد من 1 الى 30 .
MsgBox(Environ("TMP"))
هذا الكود
يعطيك
مسار مجلد ال
temp .
الدالة
Beep
:
تقوم باصدار صوت منبه من السماعات اذا كان لديك كرت صوت او من
داخل الجهاز اذا لم يكن لديك
.
Beep
تشغيل البرامج
الخارجية
لتشغيل
اي برنامج خارجي عليك ان تكتب الكود
التالي:-
System.Diagnostics.Process.Start("c:\somepath\somefile.txt")
هذه الدالة لها تابع وحيد وهو مسار الملف الذي تريد تشغيله
الكائن
Application
الكائن
Application
هو البرنامج
الذي تتعامل
معه ,
فمثلا:
Dim x As Application
x.Exit()
الكود السابق يقوم باغلاق
برنامجنا وذلك باستخدام الوظيفة
Exit
طبعا مثالنا
السابق بسيط جدا على استخدام الكائن Application ,
وسوف نتوسع
باذن الله قريبا في كل شيء
الفورم الشفافة
في
البداية اعتذر على التاخير الذي حصل وذلك لمشاكل التي
حصلت
لجهازي.
كود
اليوم بسيط للغاية . ولكنه جميل
.
اذا
اردت بجعل الفورم شفافة فم عليك الا ان تكتب السطر
التالي:-
Me.Opacity = 0.5
طبعا هذه الخاصية
تحوي
الارقام التي بين الصفر و الواحد . وتعني اللاشفافية . فلو وضعت
القيمة 0 فلن ترى الفورم والعكس صحيح
تقديم الفورم
على
النوافذ الاخرى
اذا
اردت ان تجعل الفورم فوق النوافذ
الاخرى
فما عليك الا كتابة الكود
التالي:-
Me.TopMost = True
اما اذا اردت العكس فاجعل القيمة
False
توليد ارقام عشوائية
MsgBox(Rnd() * 10)
هذه
الدالة تقوم
بتوليد ارقام عشوائية . وذلك بان تقوم بضرب الدالة في اي رقم
تريده لكي ينتج لديك رقم عشوائي موجب ولا يزيد عن هذا الرقم
تحويل النص الى
كلام
(Text To Speach)
اذا اردت
ان تسمع ما تكتب , فعليك
اتباع
الخطوات التالية:
1- من
القائمة Project
اضغط على
Add Reference .
2- من
علامة التبويب COM
اختر الاداة
Microsoft Direct Text To Speach ,
ثم اضغط على
Select ,
ثم اضغط OK .
3- اضف زر
امر Button
ومربع نص
Text Box .
4- اكتب
هذا
الكود:
Dim x As New ACTIVEVOICEPROJECTLib.DirectSS()
x.Speak(TextBox1.Text)
احب ان
اوضح
اننا في البداية اضفنا مكتبة تحويل النص الى كلام . ولو راجعت
ال Solution Explorer
لوجدت في ال
Reference
العنصر
ACTIVEVOICEPROJECTLib .
بكل بساطة
نستخدم الدالة Speak
والتي
لها تابع
واحد وهو النص التي تريده ان ينطق
.
ويمكنك
التحكم
في سرعة النطق .
وذلك باستخدام الخاصية Speed .
x.Speed = 100
فلو جعلت الرقم 200
فستلاحظ ان النطق ابطا مما هو عليه في 100 .
خدمات الويندوز Windows Service
خدمات
الويندوز هي عبارة عن برامج تشتغل
في الخلفية
BackGround
و تستخدم في عدة امور ككتابة ملفات
السجلات
log و مراقبة البرامج وغيرها , و وميزتها انها تشتغل قبل
دخول
المستخدم للويندوز . يعني قبل ال
Log In .
ولانشاء
خدمة ويندوز خاصة بك , قم بالاتي:-
1- من
New Project
اختر
Windows Service .
2- اضف
اداة Timer
واجعل قيمة
Inrerval
تساوي 10000 (عشر ثواني) ثم ادخل الى صفحة الكود . لاحظ
ان هناك
حدثان هما On
Start و يستخدم عند تشغيل الخدمة , و الحدث
On Stop
ويستخدم عند ايقاف الخدمة .
3- اضف هذا
الكود
ضمن حدث اداة ال
Timer1 :
Dim y As New IO.StreamWriter("C:\x.txt")
y.Write(Now.ToString)
y.Close()
الكود
السابق
يقوم بكتابة الوقت
والتاريخ لملف
يدعى x.txt .ففي
البداية
استدينا
الكلاس StreamWrite
لكي نستخدم الدالة
Write والتي تقوم
بالكتابة
الى ملف معين . الدالة
Now تعيد الوقت والتاريخ الحالي
.
لاحظ انه
يجب ان نغلق الملف في النهاية بالدالة
Close .
اضف الى
الحدث OnStart
الكود التالي
لتفعيل المؤقت
عند تشغيل الخدمة:
Timer1.Enabled = True
ثم اضف
الكود
التالي الى الحدث
OnStop وذلك لابطال المؤقت عند ايقاف
الخدمة:
Timer1.Enabled = False
انتهينا
الان من
برمجة خدمة
الويندوز وبقي علينا مشروع تثبيت الخدمة على الويندوز
.
5- اخرج
الان من صفحة الكود واذهب الى صفحة التصميم
Service1.vb [Design]
ثم اضغط باليمين في اي مكان واختر
Add Installer .
ستظهر لك اداتين ,
اضغط على الاداة
ServiceInstaller1
وغير الخاصية DisplayName
الى
MyService .
وهذا سيكون الاسم
الذي ترى به خدمتك الجديدة في الويندوز
.
ثم
اضغط على الاداة
ServiceProcessInstaller1
وغير الخاصية
Account
الى
LocalSystem (لكي
نقوم بتشغيل الخدمة على الجهاز الحالي
.
6- انشء
ملف txt
تحت هذا المسار
c:\x.txt
من
قائمة
Build اضغط
على Build
Solution
لتقوم بعمل بناء و تجميع
لخدمتك
.
الى الان
لم تثبت الخدمة على النظام
.
7- من
قائمة
Start - Programs - Microsoft Visual Studio .NET - Visual Studio .NET Tools -
Visual Studio .NET Command Prompt .
اذا كان
مسار الملف التنفيذي الذي انشاته للخدمه هو
D:\WindowsService1\bin\WindowsService1.exe
فاكتب الامر
الاتي تحت
سطر الاوامر:
installutil D:\WindowsService1\bin\WindowsService1.exe
لاحظ ان
الامر
السابق يقوم
بتثبيت الخدمة فعليا تحت نظام الويندوز .
8- لاختبار
الخدمة , من Control Panel
اضغط على
Administrative Tools ,
ثم
Services
ثم ابحث عن خدمة MyService
اضغط عليها
باليمين ثم
اضغط على Start .
الان كل
عشر ثواني ستكتب الخدمة
الوقت
والتاريخ في الملف
c:\x.txt .
تطبيقات الجوال Mobile Application
عن طريق
.NET يمكنك عمل برامج او
تطبيقات
لاجهزة الجوال من دون اي خبرة في لغات
WML او
HTML
وغيرها . بل تعملها بلغتك المفضلة سواء كانت CSahrp
او
Visual Basic.NET .
ولكن قبل
كل شيء عليك تحميل ادوات البرمجة
والتي
ستستخدمها في عمل التطبيقات من هذا الرابط:
http://www.microsoft.com/downloads/details.aspx?FamilyId=AE597F21-B8E4-416E-A28F-B124F41F9768&displaylang=en
والله
يعينك لان حجمها 4 ميغا تقريبا ولكن عليك ان تحملها باي طريقة لاننا بصراحة لم نكن نحلم ايام فيجوال بيسك6 عمل مثل هذه
الاشياء .
اذا انتهيت
من
التحميل , ابدا
بتثبيت الملف في
الجهاز . واذا انتهيت شغل الفيجوال ستوديو وتاكد من ان مشروع
الجوال ظاهرة لديك كما في الصورة التالية:
اضغط على
Mobile Web Application
طبعا كلمة
web لان
البرامج سوف تشتغل عن طريق الانترنت . يعني تحمل صفحتك
والتي سوف
تحتوي على التطبيق الى موقع يستضيف ملفات
aspx كموقع
brinkster.com
ومن ثم تتصفح موقعك عن طريق النت باستخدام خدمة
الواب
.
اذن الشروط
هي:
1- ان يكون
الجوال يدعم خدمة
الواب
.
2-ان يكون
الموقع يدعم هذ النوع من التطبيقات كـ
Brinkster
بعد ان
تفتح بيئة التشغيل لديك ابدا مشروع
جديد ومن
ثم Mobile Web
Application .
لاحظ ان
عنصر جديد اضيف
لصندوق
الادوات باسم
Mobile Web Forms .
اضف زر امر
الى
الفورم وذلك باضغط
على الزر مرتين ثم سحبه الى الفورم .
اضغط
الان على الزر مرتين لتفتح صفحة الكود , واكتب الكود
الاتي:
Response.Write("helo Mr Mobile")
اضغط F5 كي تجرب
التطبيق
اذا ضغطت على الزر فسيكتب لك رسالة
helo Mr Mobile
بقي عليك تحميل صفحتك الى موقع
ومن ثم عليك
بالاشتراك في خدمة الواب سيرفس من شركة الاتصالات, بعد ذلك يمكنك
اختبار تطبيقك على جهاز الجوال وذلك بالدخول للصفحة التي حملتها
الى الموقع
وما اتوقع انك تفكر بالرجوع الى
فيجوال بيسك6 بعد كل هذه الخدمات المذهلة
واذا في اي
سؤال انا بالخدمة
تشغيل الاصوات
عن طريق دوال
API
بصراحة لم
اجد طريقة مناسبة غير معقدة
في فيجوال
بيسك .نت تمكننا من تشغيل الاصوات
.
ولكني
تذكرت الدالة
sndPlaySound
والتي كنا
نستخدمها في
VB6 لتشغيل
الاصوات و
سنستخدمها ان شاء الله في VB.NET
ايضا
.
و في
المثال التالي سنتعلم:
1- كيفية
استخدام دوال ال API
و
الثوابت في
VB.NET .
2- كيفية
تشغيل الاصوات .
اتبع
الخطوات التالية:-
1- ابدا
مشروع Windows Application .
2- اضف زر
امر وادخل على صفحة الكود
.
3- يجب ان
نصرح اولا عن
الدالة
sndPlaySound ,
وذلك ضمن الكلاس
Form1 .تحت
السطر الاتي
مباشرة:
Inherits System.Windows.Forms.Form
اكتب هذا
التصريح:
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _ (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
ثم اضف هذا الكود والذي يصرح عن الثابت Constant :
Const SND_ASYNC = &H1
4- اضف
الكود
التالي ضمن زر
الامر لكي تقوم بتشغيل الصوت
مباشرة:
sndPlaySound("d:\x.wav", SND_ASYNC)
الدالة
sndPlaySound
لها وسيطين
:
1- مسار
الملف الذي تريد تشغيله
.
2- كيفية
التشغيل : يعني هل تريده ان يكرر الصوت او ان يقوم
بتشغيله
مرة واحدة فقط . يعني خيارات اضافية , ويمكنك ان تجعل
هذه القيمة
صفر ليقوم بتشغيل الصوت مرة واحدة
.
واذا اردت
معلومات وافية عن دوال ال
API فراجع
هذا الموقع المشهور لدى
مبرمجي الفيجوال
بيسك
http://www.allapi.net/
واريد ان
اوضح
نقطة وهي انه
بامكانك تشغيل الاصوات عن طريق هذا
الكود
System.Diagnostics.Process.Start("d:\x.wav")
ولكن هذا الكود
يقوم بتشغيل برنامج لتشغيل الصوت ولا يقوم بتشغيل الصوت من
برنامجك .
الادخال
والاخراج : الدالتين
Msgbox , Inputbox
اولا
الدالة
InputBox :تطلب هذه الدالة من المستخدم ان يقوم بادخال بيانات
.
InputBox("please enter your name", "name", System.Environment.UserName.ToString)
الوسيط
الاول:
النص الذي يوضح
للمستخدم ما يدخله.
الوسيط
الثاني: عنوان
مربع
الادخال .
الوسيط
الثالث : هذا الوسيط لم يكن موجودا
في
VB6 , وهو
ان تقوم بكتابة بيانات تتوقع ان المستخدم سوف
يكتبها .
فمثلا الكود السابق يطلب من المستخدم كتابة اسمه , وفي
هذا الوسيط
كتبت الكود الذي يقوم بالكشف عن اسم المستخدم . فعلا
وسيط رائع
للغاية .
الوسيط
الرابع: موقع مربع الادخال في
الشاشة
(X,Y) .
ثانيا
الدالة MsgBox :
الدالة
MsgBox عكس الدالة
InputBox ,
فهي تقوم
بعرض بيانات للمستخدم
MsgBox("helow my friend", MsgBoxStyle.Information, "helo")
ولها 3
وسائط:
الاول:
محتوى الرسالة.
الثاني:
نوع الرسالة معلومات
. تحذير , مساعدة , .... الخ
الثالث:
عنوان الرسالة .
المؤشرات Pointers
اعتقد ان هذه
اول مرة
ستكون للكثيرين من
مبرمجي فجوال بيسك ان يتعاملوا مع المؤشرات و الذاكرة و
غيرها من هذه
المواضيع . و ذلك لان فجوال بيسك.نت يدعم التعامل مع مثل هذه
الامور بعكس
الاصدارات السابقة .
اعتقد ان هذا
الموضوع ليس غريبا على
مبرمجي السي و
السي++ . و هو موضوع شيق ولكنه ليس سهلا و يكون خطير احيانا
بسبب انه يتعامل
مع الذاكرة مباشرة مما يؤدي حيانا الى اغلاق البرنامج او
اويندوز اذا تم
التعامل معها بشكل خاطئ.
على العموم
سنقوم بعمل
برنامج يقوم بعكس الوان
صورة معينة Inverse
و قد قمنا بعمل هذا الكود مسبقا و
لكن باستخدام
الدالتين SetPixels , GetPixels
و اللتان يلاحظ عليهما
البطء .
اما اليوم فسنتعلم كيف
نعكس الوان الصورة بالتعامل مع المؤشرات و الذاكرة
RAM مباشرة و ستلاحظ الفرق الشاسع في السرعة.
في البداية اضف
زر امر
و مربع صورة
.
قم بالاستدعاء
الاتي
Imports System.Drawing.Imaging
ثم اكتب الكود التالي:
'يحمل هذا المتغير
الصورة الموجودة في مربع الصورة
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
ستلاحظ فرق هائل في السرعة
بين هذا الكود و الكود السابق
.
اداة الشجرة Tree View
سوف نتعلم اليوم كيفية التعامل مع الاداة المسماة ب Tree View .
اولا : اضف الاداة Tree View الى الفورم .
ثانيا اضف الاداة ImageList .
ثالثا اضف صورتين الى الاداة ImageList1 .
رابعا اضاف الكود التالي في حدث تحميل الفورم :
Dim i As Integer
Dim J As Integer
With TreeView1
' اضافة الخطوط التي توصل جميع عناصر الشجرة
.ShowRootLines = True
' اضافة علامات الموجب و السالب و التي توضح بان ثمة عناصر موجودة
او لا
.ShowPlusMinus = True
'اضافة الصور الى عناصر الاداة و التي قد اضفناها من قبل للاداة
المسماة لستة الصور
.ImageList = ImageList1
End With
i = 1
For i = 1 To 40
'اضافة عناصر رئيسية للاداة و من ثم تسميتها
Dim nodp As New Windows.Forms.TreeNode("Node" & i.ToString)
TreeView1.Nodes.Add(nodp)
For J = 1 To 4
'اضافة عناصر فرعية للاداة و من ثم تسميتها
Dim nodc As New Windows.Forms.TreeNode("SubNode" &
i.ToString, 1, 1)
nodp.Nodes.Add(nodc)
Next
Next
تعدد المهام MultiThreaded
البرامج المتعددة المهام لها القدرة على اداء عدة عمليات في نفس الوقت . فمثلا
اذا اراد المستخدم من البرنامج فتح ملف كبير الحجم و عملية الفتح هذه تستغرق وقتا
طويلا فان البرنامج يتيح للمستخدم ان يؤدي عملية اخرى خلال عملية الفتح , فمثلا
يتيح له الكتابة او تطبيق جرافيكس معين على صورة .
و لحسن الحظ فان فجوال بيسك.نت هذه المرة يتيح لنا التعامل مع مثل هذه العمليات
بخلاف جميع اصدارات فجوال بيسك السابقة .
سوف نقوم اليوم بعمل بريمج صغير يوضح لنا كيفية تطبيق هذه العمليات في برامجنا .
في البداية يجب عليك استدعاء المكتبة
Imports System.Threading.Thread
ثم اضف هذا الاجراء
Sub BeBusy()
Dim i As Integer
For i = 1 To 20000
Me.Text = i.ToString
Next
Beep()
End Sub
ثم اضف الكود الالي تحت زر الامر 1
'انشاء
مهمة مستقلة للاجراء bebusy
Dim x As New System.Threading.Thread(AddressOf BeBusy)
'تشغيل المهمة
x.Start()
و اخير اضف الكود التالي تحت زر الامر 2
MsgBox("hola")
ملاحظة : لو انك لم تقم بانشاء مهمة مستقلة للاجراء bebusy و ضغطت على الزر 1 ثم
ضغطت على الزر 2 فان الرسالة لن تظهر الا بعد انتهاء الاجراء bebusy . و لانك
انشات مهمة مستقلة للاجراء bebusy فان الرسالة ستظهر في اي وقت تريد .
موضوعنا موضوع طويل و متشعب . ولكننا الان فهمنا كيفية برمجة هذه العمليات
المستقلة و اخذنا فكرة بسيطة عنها .
ازرار الفارة
اذا اردت معرفة عدد ازرار ماوس المستخدم فاكتب الكود التالي:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MB
End sub
Public Function MB() As System.Drawing.Size
Dim x
' Get the number of buttons on the mouse
x = System.Windows.Forms.SystemInformation.MouseButtons
MsgBox(x.ToString)
End Function
الطباعة
ابسط طريقة
لطباعة نص , هي
كالاتي:
اولا: من
صندوق الادوات Tool Box
اضف الاداة
PrintDocument .
ثانيا:
اضغط على الاداة نقرتين كي تقوم
بكتابة
الكود :
ثالثا:
اكتب الكود التالي:
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e _ As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage e.Graphics.DrawString("Helo World", New Font("Comic Sans MS", 20), Brushes.Black, 500, 500) End Sub
رابعا: قم
باضافة زر امر
Button
واكتب الكود التالي:
PrintDocument1.Print()
ولكن
الجديد اننا نلاحظ
في تصريح
الكود للاداة
PrintDocument1 ,
ان المتغير
e هو اهم
شيء
في هذه الاداة . لان به تتم طباعة النص او الصورة . والمتغير
على
هيئة
System.Drawing.Printing.PrintPageEventArgs .
ونلاحظ ان
الكلاس
Printing
موجود في الكلاس
Drawing .
لذلك يجب علينا ان
نستخدم الخاصية
Graphics
للمتغير e
لنقوم بالطباعة . والكلاس Graphics
به الكثير من الدوال
.
ناخذ مثال
اخر وهو طباعة
الصور ,
نفس الخطوات السابقة وانما عليك ان تضيف مربع صورة وتضع
فيها اي
صورة تشاء , ثم تستخدم الدالة
DrawImage
بدلا من الدالة
DrawString ,
كما في الاتي:
Private Sub
Button1_Click(ByVal sender As System.Object _
, ByVal e As System.EventArgs) Handles Button1.Click
PrintDocument1.Print()
End Sub
Private Sub PrintDocument1_PrintPage(ByVal sender As_ System.Object _
, ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
Handles PrintDocument1.PrintPage
e.Graphics.DrawImage(PictureBox1.Image, 500, 500)
End Sub
الدالة DrawImage تقوم برسم صورة في موقع معين , ولها تابعين
1- الصورة التي تريد ان ترسمها .
2,3 - موقع الصورة . بتحديد ال X,Y .
اذا انتهيت من تحديد الصورة او النص وتحديد المواقع
فما عليك الا استخدام الدالة Print
الموجودة في الكائن PrintDocument1 .