مشاريع
أقسام المقالات
Total Articles: 19
مؤتمرات وأحداث
مراكز وانجازات
.net 2008 Course
آخر 10 مواضيع
كتب وملخصات
Tips & Tricks
مدخل إلى WAP
الإثنين، ٢٥ أغسطس، ٢٠٠٨


مقدمة :
في هذا الدرس ، سوف نتعرف سوية على التقنية المعروفة باسم Wireless Application Protocol والتي تعرف اختصاراً باسم WAP ، كما سنتطرق في الجزء الثاني من هذا الدرس إلى كيفية التعامل مع هذه التقنية من خلال .net .

الجزء الأول من الدرس : تعريف بالتقنية ...

تطبيقات الموبايل Mobile Application :
لم يعد الموبايل وسيلة اتصال بسيطة لاجراء المكالمات الهاتفية مثلما كان الهدف منه وقت ظهوره ، إنما تطور الأمر الآن ليصبح الموبايل وسيلة خدمية وترفيهية وتعليمية أيضاً ، ولم يعد الموبايل يستخدم من أجل المكالمات بل أصبح يستخدم في الدخول على الانترنت واستخدام التطبيقات المتقدمة والملتيميديا وغيرها .
ولهذا السبب وغيره ظهرت مصطلحات جديدة لتدل على تطبيقات الموبايل وبرامجه ونظم التشغيل الخاص به ، وكان من ضمن هذه المصطلحات مصطلح WAP مردافاً لمصطلح WEB على الحاسبات الشخصية والذي يرتبط بعالم الإنترنت وخدماته .

ما هو ال WAP ؟
كما اسلفنا سابقاً فكلمة WAP هي اختصار لكلمة Wireless Application Protocol ، وكما هو واضح من الاسم فإن هذا يعني ان WAP هي معيار أو Standerd عالمي يهدف إلى ربط أجهزة الهواتف النقالة Mobiles بالإرتباط بالإنترنت ، وتم تطويره في النصف الثاني من تسعينات القرن المنصرم .
وقد جاء هذا البروتوكول الموحد ليلم شتات أفكار شركات المحمول الكبرى والتي كانت كل منها تعمل منفردة وفي اتجاه مختلف عن الآخرين .


....

كيف تعمل WAP ؟
تتميز WAP عن WEB بأنها تعمل في اطار امكانيات الهواتف المحمولة ، وهذا ما يستلزم بالضرورة تصغير حجم البيانات والتعامل مع ضعف السرعة وضعف قدرات المعالجات الخاصة بالأجهزة المحمولة مقارنة بالأجهزة الشخصية وصغر حجم الشاشة التي يتم عرض البيانات من خلالها أيضاً .
ومن خلال تقنية ال WAP تم لم شمل شتات شركات المحمول الكبرى والتي كانت كل منها تسير فريدة في اتجاه مختلف سعياً لادخال خدمات الانترنت على أجهزتها المحمولة .

وتبدأ قصة ال WAP من خلال طلب العميل ل URL معين لصفحة ما أو لملف وخلافه ، وفي حالة طلب صفحة فإنه يتم ترجمة HTML إلى WML وهي طريقة عرض مناظرة لل HTML يتم استخدامها ضمن بروتوكول ال WAP وسوف نشرحها في الفقرة التالية ...
والجدير بالذكر أن بعض الهواتف المحمولة أصبحت تدعم HTML أيضاً ...

ما هي WML ؟
هي طريقة لوصف البيانات مشابهة جداً لطريقة عمل HTML ولكنها على معايير XML ، وتختلف عن HTML في عدد من النقاط منها :
- الوسم Tag الرئيسي هو <wml> بدلاً من <html>
- ينقسم المستند إلى بطاقات Cards لتسهيل العرض حيث تبدأ كل بطاقة بـ <card> وتنتهي أيضاً بـ <card/> .

الجزء الثاني من الدرس : تعليم WML باختصار ...

بداية سنعرض مثالاً يوضح كيفية كتابة WML وذلك بالشكل التالي مثلاً - من ويكيبديا - :

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN"
"
http://www.phone.com/dtd/wml11.dtd" >
<wml>
   <card id="main" title="First Card">
     <p mode="wrap">This is a sample WML page.</p>
</card>
</wml>

 قراءة القيم المختلفة وتخزينها وعرضها للمستخدم :
بكل بساطة يمكنك تعريف المتغيرات واسناد قيم لها بالشكل التالي :

<setvar name="First_Name" value="Ahmed"/>
<setvar name="Age" value="21"/>

ولاحقاً يمكنك عرضها بالشكل التالي مثلاً :

<p>First Name: $(First_Name)</p>

ويمكن ايضاً قراءة قيمة مربع نص أو Select بنفس الطريقة تماماً حيث يتم وضع اسم الأداة بدلاً من اسم المتغير ...
مثال لقراءة قيم أداة اختيار وعرضها للمستخدم - المثال منقول من موقع فرعون - :

<card id="card1" title="Tutorial">
<do type="accept" label="Answer">
<go href="#card2"/>
</do>
<p>
<select name="name">
<option value="HTML">HTML Tutorial</option>
<option value="XML">XML Tutorial</option>
<option value="WAP">WAP Tutorial</option>
</select>
</p>
</card>
<card id="card2" title="Answer">
<p>
You selected: $(name)
</p>
</card>
</wml>

الجزء الثالث والأخير من الدرس : أريد برمجة موقع ASP.net يدعم ال WAP ...

إذا قمنا بتحويل التطبيق الذي عرضناه في أول المقالة - المنقول من ويكيبيديا - والذي كان بالشكل التالي :

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN"
"
http://www.phone.com/dtd/wml11.dtd" >
<wml>
   <card id="main" title="First Card">
     <p mode="wrap">This is a sample WML page.</p>
</card>
</wml>

 وقمنا بتحويله إلى .net فسوف يكون بالشكل التالي :

<%@ Page Inherits="System.Mobile.UI.MobilePage" Language="C#" %>
<%@ Register TagPrefix="mobile" Namespace="System.Mobile.UI" %>
<mobile:Form runat="server">
<mobile:Label runat="server">
This is a sample WML page.
</mobile:Label>
</Mobile:Form>

في حالة رغبت في التعامل بواسطة VB.net غير السطر الأول فقط ليصبح بالشكل التالي :

<%@ Page Inherits="System.Mobile.UI.MobilePage" Language="C#" %>


والآن عند طلب الصفحة من قبل العميل ، يتم أولاً تحويل الصفحة إلى wml في حالة كان الطلب من جهاز هاتف محمول ، أو يتم التحويل مباشرة إلى HTML في حالة طلب الموقع من جهاز شخصي أو كومبيوتر كفي .

كان هذا أبسط مثال لتطبيق WAB من خلال .NET ، ولكن ما زال بامكانك عمل الكثير في هذا المجال في موضوع برمجة الموقع عموماً ، وفي التعرف على الأجهزة الزائرة وامكانياتها وغير ذلك من الخيارات المتقدمة خصوصاً .

التسميات: , , ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 04:37 م   0 تعقيبات
Microsoft Ajax Toolkit
الأحد، ٢٤ أغسطس، ٢٠٠٨


في هذا الدرس سوف نستعرض سريعاً كيفية الاستفادة من خدمات تقنية الإنترنت المعروفة باسم AJAX من خلال .net ولكن قبل البداية دعنا نتعرف على ما هي أجاكس ؟


اجاكس AJAX
هي اختصار لكلمة Asynchronous JavaScript and XML ، وفي الواقع فهي ليست لغة برمجة جديدة أو تقنية جديدة قدر ما هي استخدام للموارد الموجودة بطريقة أخرى ، وببساطة ، تعتمد اجاكس على تجزيء الصفحة إلى عدة اقسام تتم معالجة كل قسم على حدة ، وفي هذه الحالة فإنه عند طلب العميل لجزء ما لن يكون مضطراً لانتظار تحديث الصفحة بالكامل .
ولعل أشهر أمثلة استخدام AJAX هو البريد الإلكتروني Gmail اضافة إلى النسخة الجديدة من البريد الإلكتروني لل Yahoo و Hotmail .
لمعرفة المزيد ربما تستطيع زيارة صفحة ويكيبديا عن هذه التقنية :
http://en.wikipedia.org/wiki/Ajax_%28programming%29

كيف أبدأ من خلال .net ؟

قامت مايكروسوفت باصدار عدة نسخ من الأدوات التي تساعدك وتسهل الحصول على المميزات المتاحة في AJAX ، لكنك على اية حال تستطيع القيام بهذا الأمر في أبسط صوره يدوياً ، أو باستخدام ما يسمى باسم Atlas وهي نسخة من مايكروسوفت خاصة ب AJAX .


وللمزيد من التسهيل قامت مايكروسوفت باصدار Asp.net Ajax ToolKit ، وهي مجموعة من الأدوات المختلفة التي يمكن استعراضها من خلال هذا الرابط :
http://ajax.asp.net/ajaxtoolkit/

تستطيع زيارة الموقع وتحميل هذه الأدوات من خلال الرابط :
http://ajax.asp.net/

كما يوفر الموقع مكتبة ضخمة من المواد التعليمية لهذه الأدوات ول Asp.net عموماً ، يمكن الوصول إليها عبر هذا الرابط :
http://www.asp.net/learn/default.aspx?tabid=63

يمكنك البدء من خلال هذا الفيديو تحديداً :
http://download.microsoft.com/downlo...List-Video.zip
وسيقوم بالشرح منذ البداية عن كيفية استخدام Atlas .

وهناك دروس أخرى لشرح كيفية البدء باستخدام Ajax ToolKit مباشرة منها هذا الفيديو :
http://www.asp.net/learn/videos/view...tabid=63&id=75
http://www.asp.net/learn/videos/view...tabid=63&id=76


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 12:58 ص   0 تعقيبات
Expression Blend

 

ضمن التقنيات الجديدة التي ظهرت مع .net كانت تقنية WPF ، ومن اجل تطبيق اوسع لهذه التقنية قامت مايكروسوفت بتوفيرمجموعة من البرامج لتساعد في انتاج أكواد WPF ، واحد من هذه المجموعة كان Expression Blend  لتصميم واجهات برنامجك المختلفة ، حيث يوفر لك وسائل متعددة للتصميم ، سنحاول معرفة المزيد عنه بتفصيل في هذا الدرس ...


سنحاول الآن عمل تطبيق بسيط من خلال Expression Blend قم بتحميله أولاً من الروابط السابقة ، قم بتشغيله ومن ثم اختيار New Project ومن ثم WPF Application (*.exe) بالشكل التالي :

يمكنك اختيار اللغة التي تريد العمل عليها وال framework اضافة للاسم ومكان التخزين بالطبع .
من View اختر Active Document View ومن ثم اختر الوضع Split لتتمكن من عرض XAML و العرض العادي في نفس الوقت بالشكل التالي :

على جانب الشاشة ، ستجد كل الأدوات التي تحتاج إليها للتصميم سواء القلم والفرشاة وخلافه ، أو أزرار الأوامر ومربعات النصوص وخلافه من الأدوات التي ستستخدمها في برنامجك ، ايضاً يمكنك الضغط على آخر عناصر القائمة ليستعرض لك جميع الأدوات بالشكل التالي مثلاً :

خلال عملياتك في الرسم ، ستجد لأي اداة مجموعة من الخصائص على الجانب ، تستطيع منها التحكم بالمظهر وخلافه :

الآن كتطبيق سريع ، قم باضافة Canvas وقم بتحديد ابعاده ، هذا هو ال Canvas الذي سنضع فيه صورة خاصة بنا ونطبق عليها بعض التأثيرات :

<Canvas>
<Canvas x:Name="MainImageCanvas" Canvas.Left="40" Canvas.Top="120">

الآن قم باضافة MediaElement ولنضع فيه صورة مثلاً ، سيكون ناتج XAML بالشكل التالي :

<MediaElement x:Name="MainImage" Source="c:/example/futex.jpg" Width="300" Height="300" ></MediaElement>

والآن سنقوم بتطبيق بعض التأثيرات على ال Canvas حيث نطبق عملية الميل من خلال الخصائص ، سيكون ناتج XAML بالشكل التالي :

<Canvas.RenderTransform><TransformGroup>
<SkewTransform x:Name="MainSkewTransform" AngleY="-19" AngleX="0" CenterX="0" CenterY="0"/> <ScaleTransform x:Name="MainScaleTransform" ScaleY="1" ScaleX = "1" CenterX="0" CenterY="0"/></TransformGroup></Canvas.RenderTransform></Canvas>

الآن قم بالضغط على F5 لتجربة العرض والذي سيكون بالشكل التالي :

سنحاول تطبيق نظرية الظل للصورة أيضاً ، لذا سنقوم بعمل Canvas ونضع فيه الصورة أيضاً ولكن مع زوايا ميل مختلفة هذه المرة بحيث تحاذي اطراف الصورة ، سيكون ناتج XAML بالشكل التالي :

<Canvas x:Name="ReflectionImageCanvas" Canvas.Left="260" Canvas.Top="640">

<MediaElement x:Name="ReflImage" Source="c:/example/futex.jpg" Width="300" Height="300" Volume="0">

</MediaElement>

<Canvas.RenderTransform>

<TransformGroup>

<SkewTransform x:Name="ReflectionSkewTransform" AngleY="19" AngleX="-41" CenterX="0" CenterY="0" />

<ScaleTransform x:Name="ReflectionScaleTransform" ScaleY="-1" ScaleX="1" CenterX="0" CenterY="0" />

</TransformGroup>

</Canvas.RenderTransform>

</Canvas>

وسيكون الناتج للصورة بالشكل التالي :

آخر نقطة سنتعامل معها هي اضافة الشفافية لصورة الظل ، من ضمن الخصائص أيضاً ، لذا ستجد ناتج ال XAML في النهاية بالشكل التالي :

<Canvas x:Name="ReflectionImageCanvas" Canvas.Left="260" Canvas.Top="640">

<MediaElement x:Name="ReflImage" Source="c:/example/futex.jpg" Width="300" Height="300" Volume="0">

</MediaElement>

<Canvas.RenderTransform>

<TransformGroup>

<SkewTransform x:Name="ReflectionSkewTransform" AngleY="19" AngleX="-41" CenterX="0" CenterY="0" />

<ScaleTransform x:Name="ReflectionScaleTransform" ScaleY="-1" ScaleX="1" CenterX="0" CenterY="0" />

</TransformGroup>

</Canvas.RenderTransform>

<Canvas.OpacityMask>

<LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0">

<GradientStop Offset="0.345" Color="#00000000" x:Name="ReflGradientStop1" />

<GradientStop Offset="1.0" Color="#CC000000" x:Name="ReflGradientStop2" />

</LinearGradientBrush>

</Canvas.OpacityMask>

</Canvas>

قم بضبط بعض اعدادات ال Left وال Top يدوياً او من الكود لجعل صورة الظل منطبقة على الصورة الاصلية ، سيكون ناتج الصورة :

الكود الكامل XAML :

<Canvas>
            <Canvas x:Name="MainImageCanvas" Canvas.Left="40" Canvas.Top="120">

                <MediaElement x:Name="MainImage" Source="c:/example/FUTEX.JPG" Width="300" Height="300" >
                </MediaElement>
                <Canvas.RenderTransform>
                    <TransformGroup>
                        <SkewTransform x:Name="MainSkewTransform" AngleY="-19" AngleX="0" CenterX="0" CenterY="0"/>
                        <ScaleTransform x:Name="MainScaleTransform" ScaleY="1" ScaleX = "1" CenterX="0" CenterY="0"/>
                    </TransformGroup>
                </Canvas.RenderTransform>
            </Canvas>
            <Canvas x:Name="ReflectionImageCanvas" Canvas.Left="267" Canvas.Top="645">
                <MediaElement x:Name="ReflImage" Source="c:/example/futex.jpg" Width="300" Height="300" Volume="0">
                </MediaElement>
                <Canvas.RenderTransform>
                    <TransformGroup>
                        <SkewTransform x:Name="ReflectionSkewTransform" AngleY="19" AngleX="-41" CenterX="0" CenterY="0" />
                        <ScaleTransform x:Name="ReflectionScaleTransform" ScaleY="-1" ScaleX="1" CenterX="0" CenterY="0" />
                    </TransformGroup>
                </Canvas.RenderTransform>
                <Canvas.OpacityMask>
                    <LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0">
                        <GradientStop Offset="0.345" Color="#00000000" x:Name="ReflGradientStop1" />
                        <GradientStop Offset="1.0" Color="#CC000000" x:Name="ReflGradientStop2" />
                    </LinearGradientBrush>
                </Canvas.OpacityMask>
            </Canvas>
        </Canvas>

 

لا تنس ان MediaElement يمكن ان تكون اي شيء ، لذا جرب مثلاً وضع فيديو وستجد ان نفس التأثير ينطبق عليه تماماً ...
طبعاً يمكنك نقل الكود كما هو إلى الفيجوال ستوديو وسيعمل بنفس الصورة ، انشأ مشروع من نوع WPF وجرب .

بالتوفيق ...


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 12:53 ص   0 تعقيبات
مدخل إلى برمجة ال Pocket PC من خلال .net
السبت، ٢٣ أغسطس، ٢٠٠٨

 

سوف نعتبر هذا الدرس هو نقطة الإنطلاق التي يستطيع المبتدئ من خلالها البدء في برمجة الأجهزة الكفية Pocket PC .


قبل البداية ، ما هي الأجهزة الكفية Pocket PC ؟
هي مجموعة من أجهزة الهواتف المتنقلة تتميز باستخدام نظام تشغيل متقدم اضافة إلى هاردوير يمكنها من تشغيل مهام هذا النظام ، ويشكل نظاما التشغيل Windows Mobile ونظام التشغيل سيمبان اضافة لنظام Windows CE 2003 وما قبله أشهر نظم التشغيل التي تعمل على الأجهزة الكفية .
أما على صعيد الهاردوير فالأجهزة الكفية لا تمتلك هارد ديسك Hard Disk بالمعنى المشهور ، لكن بعضاً منها يستخدم جزء من ال RAM كهارد ديسك لا يتم مسح البيانات من عليه بعد اعادة تشغيل الجهاز ، وهناك أنوع أخرى تستخدم ROM لتخزين البرامج ونظام التشغيل وما شابه .


وماذا يمكنني عمله للأجهزة الكفية Pocket PC من خلال .net ؟
تستطيع من خلال لغة البرمجة اضافة برامج تستخدم أجزاء معينة من الجهاز لتحقيق خدمات للمستخدم سواء أكان استخدام بسيط (استخدام الذاكرة) لتخزين البرامج وتنفيذها وتخزين قواعد البيانات ، أو كان الأمر يختص باستخدام الكاميرا مثلاً والأجهزة الصوتية في الجهاز .
كيف أبدأ ؟
بكل بساطة ، سنقوم بعمل برنامج يظهر رسالة ترحيب عن الضغط على زر أمر .
1- قم بتشغيل الفيجوال ستوديو Visual Studio .net .
2- قم باختيار C# أو VB أو اللغة التي تود البرمجة من خلالها .
3- قم باختيار Smart Device ، ومن ثم قم باختيار Pocket PC 2003 أو Smartphone 2003 أو Windows CE 5.0 حسب الجهاز الذي تود العمل عليه .
4- بعد اختيار القسم المناسب قم باختيار Device Application .
5- قم بسحب Button من الأدوات ، وقم بكتابة هذا الكود في داخله :

MessageBox.Show("Welcome...")

فقط قم باضافة ; في حالة كونك مبرمج C# .

6- قم بالضغط على F5 اختار نوع ال deploy الذي ترغب فيه حسب الجهاز الذي تود العمل عليه ، أو قم باختيار نوع يعمل على الـ PC للتجربة فقط .
7 - مبروك ، لقد قمت بعمل برنامج الأول ، يمكنك أيضاً نقل الملف التنفيذي exe إلى الجهاز وتشغيله مباشرة ، لا بد في هذه الحالة ان يكون .net framework موجوداً على الجهاز الكفي Pocket PC .
كيف اكمل البرمجة من خلال .net ؟
بكل تأكيد فإن البرنامج السابق يعد من أبسط الصيغ الممكنة لبرنامج يعمل على Pocket PC ، فيما ستتضطر لاستخدام التخزين في البرامج الجدية والتعامل مع قواعد البيانات حيث يمكنك استخدام الملفات النصية كقواعد بيانات ، أو ملفات XML وحتى قواعد البيانات من نوع SQL Server CE .
كما يمكن ان تضطر للتعامل مع الملفات ، أو الصوتيات والشاشة ، أو حتى مع الأجهزة الملحقة مثل الكاميرا وخلافه .


بكل بساطة كل ما عليك هو الدخول إلى هذا الموقع : www.msdn.com وستجد فيه كل ما تريد ، يمكنك الدخول أيضاً مباشرة على هذا الرابط : http://msdn2.microsoft.com/en-us/library/aa458721.aspx

هل هناك أدوات مساعدة ؟
بكل تأكيد هناك العديد من الأدوات التي تساعدك على بناء تطبيقاتك وجعلها أفضل بطريقة أسهل - لكن لا تنشغل بالأدوات دون ان تعرف ولو بصورة عابرة كيف يمكنك العمل يدوياً - ، ومن أحدث هذه الأدوات Windows Mobile 6 Developer Resource Kit :
http://msdn.microsoft.com/windowsmob...t/default.aspx

هل هناك طرق أخرى غير .net لبرمجة الأجهزة الكفية ?
بكل تأكيد . نعم ، وبالعكس فإن لغة مثل سيمبان تعد أقدم من لغات مايكروسوفت ، كمان أن لغة مايكروسوفت لا زالت غير قادرة على اقتحام عالم الموبايلات التي لا تزال تسيطر عليه شركتي سيمبان وجافا .
http://www.ce4arab.com/vb7/index.php

أخيراً ، درس بسيط يحتوي على مجموعة أكواد مفيدة في عالم برمجة ال Pocket PC :

http://vb4arab.com/vb/showthread.php?t=2738

التسميات: , ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 11:50 م   0 تعقيبات
كتاب Speech SDK
الأحد، ١٣ يوليو، ٢٠٠٨

كتاب تم ارساله لي بخصوص شرح مكتبة Microsoft Speech SDK ، في المقدمة الخاص بالكتاب يقول المؤلف :

إن الهدف الرئيسي من هذا الكتاب هو شرح مبسط لاستخدام هذه المكتبة المتخصصة في عمليات فهم الكلام المحكي إلى المايكروفون ومن ثم تخزينه على شكل نص في البرنامج او العملية العكسية بتحويل الكلام المقروء إلى مسموع .

pic

فهرس الكناب :

  1. تنزيل واعداد المكتبة .
  2. شرح بعض الاساسيات .
  3. شرح طريقة عمل فهم الأوامر المستقبلة صوتياً .
  4. شرح مكتبة الاملاء .
  5. شرح طريقة تحويل الكتابة إلى كلام .
  6. الاعدادات ولوحة التحكم .
  7. تدريب الحاسوب .
  8. تطبيق برنامج يقوم بنطق الساعة .
  9. برنامج تسجيل الدخول عن طريق نطق كلمة السر .
  10. برنامج رد التحية .
  11. برنامج محادثة مع الحاسوب .
  12. الة حاسبة باستخدام الأوامر الصوتية .
  13. برنامج املاء يقوم بحفظ النصوص إلى ملف نصي

وفي النهاية ، يمكنك تحميل الكتاب مرفق به الأمثلة من هنا .

التسميات: , ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 02:55 م   0 تعقيبات
IComparable Interface
الثلاثاء، ١٧ يونيو، ٢٠٠٨

بسم الله الرحمن الرحيم .

كما هو واضح من الاسم ، يستخدم هذا ال interface للمقارنة ، ولذا من الطبيعي ان يكون شكل هذا ال interface بالشكل التالي :

C#:

public interface IComparable
{
int CompareTo(object o);
}

vb.net:

Public Interface IComparable
Function CompareTo(ByVal o As Object) As Integer
End Interface

يمكنك ملاحظة ان الدالة تعيد قيمة رقمية ، فعلياً هي تعيد في المعتاد القيم 0 في حالة التساوي ، القيمة 1 في حالة كون الطرف الأول اكبر ، و -1 في حالة كون الطرف الأول أصغر .

اما النقطة التي لدينا هنا فلسنا بحاجة لمعرفة هل يساوي هذا الكائن ذاك ام لا ، بل نحن في حاجة إلى معرفة ايهما اكبر او اصغر ، لنفترض ان لدينا كلاس للسيارات بالشكل التالي مثلاً :

C#:

class Car
{

string Name;
int year;
}

vb.net:

Class Car
Private Name As String
Private year As Integer
End Class

والآن نرغب في ترتيب السيارات بناء على تاريخ الصنع year ، لذا أول خطوة لدينا هي جعل الفئة الخاصة بنا تطبق الفئة IComparable :

C#:

class Car:IComparable
{

string Name;
int year;
}


vb.net:

class Car:IComparable
{

string Name;
int year;
}

ثم نكتب بعض الاكواد في الدالة CompareTo ، لنفترض الشكل التالي مثلاً :

c#:

int IComparable.CompareTo(object obj)
{
Car temp = (Car)obj;
if(this.year > temp.year)
return 1;
if(this.year < temp.year)
return -1;
else
return 0;
}

vb.net:

Private Function CompareTo(ByVal obj As Object) As
Integer Implements IComparable.CompareTo
Dim temp As Car = DirectCast(obj, Car)
If Me.year > temp.year Then
Return 1
End If
If Me.year < temp.year Then
Return -1
Else
Return 0
End If
End Function

طبعاً لا داعي لتذكيرك بانك تستطيع اعادة -100 و 0 و 94 بدلاً من -1و0و1 ، لكن هذا لتسهيل المفهوم ، الدالة تعمل بدلالة رقم سالب يعني اصغر ، صفر يعني التساوي ورقم موجب يعني اكبر فقط دون ان يعنيها قيمة هذا الرقم الفعلية .

الدالة Sort :

لنفترض ان لدينا مصفوفة array من الارقام باسم myNumbers ، في هذه الحالة لو قمنا بكتابة الأمر التالي لكان الكود مفهوماً :
c#:

Array.Sort(myNumbers);


vb.net:

Array.Sort(myNumbers)

ولكن لو كان لدينا مصفوفة من السيارات ، وكتبنا هذا الكود لترتيبها فإن هذا بالتأكيد سيحدث خطأ .

لكن في حالة كون الفئة car تطبق ال IComparable interface ، ففي هذه الحالة سيمكنك استخدام هذا الدالة ببساطة لإنها سوف تقوم بالمقارنة اعتماداً على دالة CompareTo التي قمت انت ببرمجتها ، ربما يكون هذا سبباً كافياً لتقوم بتطبيق هذا ال interface وكتابة كود الدالة بدلاً من كتابة دالة باسم check مثلاً او اي اسم آخر للقيام بنفس المهمة . هذا طبعاً بالاضافة لتسهيل استخدام الفئة الخاصة بكل لاحقاً ووضوحها لأي مبرمج آخر .


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 08:35 م   0 تعقيبات
FileSystemWatcher
الخميس، ٥ يونيو، ٢٠٠٨


تعتبر هذه الفئة مفيدة جداً في حالة رغبتنا في مراقبة سلوك ملف معين ومعرفة اي تغيير يطرأ عليها من التغييرات الموجودة في ال System.IO.NotifyFilters enum والذي يراقب اي من التغييرات التالية :

public enum NotifyFilters {
Attributes, CreationTime, DirectoryName, FileName, LastAccess, LastWrite, Security, Size,
}

طبعاً بما اننا نتحدث عن events وتغييرات ، سنحتاج فوراً لتعريف دوال يتم تنفيذها مرتبطة بالاحداث ، اي دالة تستخدم لقراءة احداث مثل التعديل والتغيير وخلافه لا بد ان تكون على شكل delegate التالي :

void MyNotificationHandler(object source, FileSystemEventArgs e)


حدث تغيير الاسم لا بد أن يتبع لل delegate التالي :
void MyNotificationHandler(object source, RenamedEventArgs e)


الآن سنقوم بتعريف برنامج عادي ، يقوم بمراقبة حالة الملفات ، طبعاً ولإننا نرغب في ان نرى نتائج البرنامج فلا بد ان نجعل البرنامج يعمل حتى يضغط المستخدم حرف q مثلاً ، لو كنا في windows Forms كان بامكاننا المراقبة مباشرة طبعاً ، في مثالنا هذا سنراقب كافة الملفات النصية في القرص الصلب c:\ لحدثي الاضافة والحذف :

C#:

FileSystemWatcher watcher = new FileSystemWatcher();




// monitor files at:


watcher.Path = @"c:\";





// monitor files when


watcher.NotifyFilter = NotifyFilters.LastAccess NotifyFilters.LastWrite NotifyFilters.FileName NotifyFilters.DirectoryName;





// watch files of type


watcher.Filter = "*.txt";





// watch events:


watcher.Created += new FileSystemEventHandler(OnChanged);


watcher.Deleted += new FileSystemEventHandler(OnChanged);





watcher.EnableRaisingEventys = true;





Console.WriteLine("Press 'q' to quit app.");





while (Console.Read() != 'q') ;

vb.net:
Dim watcher As New FileSystemWatcher()




' monitor files at:


watcher.Path = "c:\"





' monitor files when


watcher.NotifyFilter = NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName





' watch files of type


watcher.Filter = "*.txt"





' watch events:


AddHandler watcher.Created, AddressOf OnChanged


AddHandler watcher.Deleted, AddressOf OnChanged





watcher.EnableRaisingEvents = True


Console.WriteLine("Press 'q' to quit app.")





While Console.Read() <> "q"C


End While

كما لاحظت ، عندما يحدث أي حدث فإننا نقوم باستدعاء الدالة OnChanged ، يمكن تخصيص دالة لكل حدث أو كما تحب لكن هذا فقط مثال ، يمكننا كتابة الدالة OnChanged بالشكل التالي مثلاً - عرض الملف والتغيير ووقت التغيير - :

C#:

static void OnChanged(object source, FileSystemEventArgs e)

{


Console.WriteLine("File Changed, File Path: {0} , Change: {1}, DateTime: {2}", e.FullPath, e.ChangeType,DateTime.Now.ToString());


}

vb.net:
Private Shared Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs)




Console.WriteLine("File Changed, File Path: {0} , Change: {1}, DateTime: {2}", e.FullPath, e.ChangeType, DateTime.Now.ToString())


End Sub

والآن جرب البرنامج ...

الصورة التالية نتاج متوقع لحذف ملف من السي واعادته مرة أخرى ( من السي مباشرة ) :

التسميات:


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 03:00 م   0 تعقيبات
- إالغاء جميع البيانات من الادوات الموجوده في جميع الشاشات النشطه :

سوف نقوم بتقسيم المشكله الى قسمين :
اولا : حذف جميع البيانات الموجوده في الcontrols في الشاشه الاساسيه
ثانيا : الوصول الي باقي الشاشات الفعاله وتكرار الخطوه الاولى
ولكن اولا , قم باضافه    ( button ( clear button ) , textbox , combo box ,button ( clear all) ,label and button ( show f2

اولا : حذف جميع البيانات الموجوده في الcontrols في الشاشه الاساسيه (شاشه واحده فقط ) :
- قم ياضافه الكود في Clear button :

untitled1 

ثانيا : الوصول الي باقي الشاشات الفعاله وتكرار الخطوه الاولى 
-قم باضافه الكود السابق في Clear all button :
سونف نقوم بالغاء الcomment من على الكود السابق واضافه comment على الكود :
cc= this.Controls
الكود Application.OpenForms للوصول الى كل الشاشت الفعاله في البرنامج
وبالطبع في الزر show f2 سوف تقوم بكتابه الكود المسؤول عن فتح نافذه جديده
 

التسميات:


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Mohamed Abd El hafeez @ 05:25 ص   0 تعقيبات
الفرق بين const و static readonly
الأربعاء، ٤ يونيو، ٢٠٠٨

لو كنت قد جربت التعامل مع الثوابت بكثرة ، فلا بد انك تساءلت ، ما هو الفارق بين تعريف ثابت const او تعريفه باستخدام static readonly ، فكلاهما كما تعلم لا يمكن تغيير قيمتهما .

الفارق بسيط جداً ، هو ان ال const يتم تعريف قيمتها وقت ال compile time ، اما قيمة ال static readonly فيتم تعريفها وقت ال run time .

لهذا سنجد مزية اضافية لل static readonly ، وهو اننا يمكن ان نقوم بتعريفة في ال static constructor بالشكل التالي مثلاً :

 

class Program
    {
        public static readonly Test test = new Test();
        static void Main(string[] args)
        {
            test.Name = "Program";
}

 

التسميات: ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 03:46 م   0 تعقيبات
الفرق بين التعريف باستخدام overridde و new

من المبادئ العامة في ال OOP استخدام مفهوم ال override ، في برامجك من خلال .net يمكنك تحديد الدالة لتكون قابلة لعمل override لها لاحقاً بالشكل التالي :

C#:

public class Base
{
    public virtual void SomeMethod()
    {
    }
}

 

vb.net:

Public Class Base
    Public Overridable Sub SomeMethod()
    End Sub
End Class

 

ومن ثم لعمل override لهذه الدالة في فئة Class آخر نقوم بكتابة الكود التالي :

C#:

public class Derived : Base
{
    public override void SomeMethod()
    {
    }
}

 

vb.net:

Public Class Derived
    Inherits Base
    Public Overloads Overrides Sub SomeMethod()
    End Sub
End Class

 

في هذه الحالة لو قمنا بتعريف نسخة من الفئة الأولى Base وقمنا بعملها من النوع  Derived فسيتم تنفيذ الدالة الموجودة في Derived مباشرة :

C#:

Base b = new Derived();
b.SomeMethod();

vb.net:

Dim b As Base = New Derived()
b.SomeMethod()

 

التعريف باستخدام new أو Shadows :

اما لو قمنا بتعريف ال  override باستخدام new أو Shadows في vb.net فكل ما سيحدث هو عملية اخفاء مؤقت hide ، لذا فإن الأمر التالي مثلاً :

C#:

public class Base
{
    public virtual void SomeOtherMethod()
    {
    }
}

public class Derived : Base
{
    public new void SomeOtherMethod()
    {
    }
}

Base b = new Derived();
Derived d = new Derived();
b.SomeOtherMethod();
d.SomeOtherMethod();

vb.net:

Public Class Base
    Public Overridable Sub SomeOtherMethod()
    End Sub
End Class

Public Class Derived
    Inherits Base
    Public Shadows Sub SomeOtherMethod()
    End Sub
End Class

Dim b As Base = New Derived()
Dim d As New Derived()
b.SomeOtherMethod()
d.SomeOtherMethod()

سوف يقوم باستدعاء الدالة الأولى في السطر الثالث ، فيما يقوم باستدعاء الدالة الثانية فقط في السطر الرابع .

المصدر :
http://blogs.msdn.com/csharpfaq/archive/2004/03/12/88453.aspx


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 03:33 م   0 تعقيبات
Nullable Types
السبت، ٣١ مايو، ٢٠٠٨

 

في عرف المتغيرات التقليدية تعد القيمة Null غير مقبولة اطلاقاً ، فالمتغير من نوع Boolean مثلاً لا بد ان يحتوي على True أو False ، المتغير Short لا بد ان يحتوي على ارقام ما بين الصفر و 32767 مثلاً ... وهكذا ، في حين كانت القيم النصية مثلاً String تستطيع استيعاب القيمة null لإنها من نوع reference .

لكننا في بعض الاحيان نضطر لأن يحمل متغير منطقي Boolean قيمة (لا قيمة - Null ) بمعنى اننا غير قادرين على تحديد فيما إذا كان True أو False ، ابسط امثلة ذلك هي المشكلة التقليدية التي تواجه اغلب مبرمجي قواعد البيانات في حالة عدم ادخال المستخدم لقيمة في حقل ما وليكن حقل (متزوج) ، ولنفرض ان المستخدم لم يحدد كون الشخص متزوجاً من عدمه ، في هذه الحالة سيظل الحقل يحتفظ بقيمة null ، وهو ما كان يستلزم عمل Check على انها ليست Null قبل وضعها في اي متغير من نوع bool مثلاً .

لكن ومع الاصدارة الثانية من .net framework اصبح بالامكان تعريف متغير مخصص ليسمح بتقبل القيمة null اضافة للقيم الاساسية له ، كما في المثال التالي :

bool? ismarried = null;

 

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

 

هناك عدة طرق اخرى لتعريف متغير يقبل Null مثل الطريقة التالية ايضا :

Nullable<bool> nullableBool = null;

 

حيث ان ? هي فعلياً اختصار لل generic المسمى System.Nullable<T> ، وهو ما سنتعرف على معناه في مراحل قادمة من الدورة .

وبنفس الطريقة فيما لو اردنا تعريف دالة يكون ال return لها Nullable فسيكون ذلك بالشكل التالي :

public bool? functionName()

 

خصائص ال Nullable :

اهم خصائص ال nullable هي خاصية HasValue والتي تحدد فيما إذا كان المتغير به قيمة ام انه يحتفظ بقيمة Null بالشكل التالي :

if (ismarried.HasValue)

 

يمكن كتابتها باستخدام وسائل المقارنة ايضاً != أو <> في الفيجوال بيسك بالشكل التالي :

C#:

if (ismarried!=null)

 

VB.net:

if ismarried<>nothing then



*** حيث ان nothing خاصة بالفيجوال بيسك بدلاً من null في السي شارب .

المعامل ؟؟ :

يمكن استخدام المعامل ؟؟ مع القيم ال nullable لكي نخبره بوضع قيمة ما في حالة وجودها ب null ، لنفترض مثال حالة الزواج السابق ، وسنفترض ان اي شخص لم يقم بادخال بيانات الزواج فهو شخص اعزب بمعنى ان القيمة ستصبح False مباشرة ، سنقوم بكتابة الكود التالي من اجل ذلك :

int? ismarried = returnvaluefromdatabase() ?? False;

 

التسميات: ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 11:53 م   0 تعقيبات
Strategy Design Pattern
الجمعة، ٣٠ مايو، ٢٠٠٨

The Strategy Design Pattern
نبدأ أولاً مع التعريف وهو :

The Strategy Design Pattern basically consists of decoupling an algorithm from its host, and encapsulating the algorithm into a separate class. More simply put, an object and its behaviour are separated and put into two different classes. This allows you to switch the algorithm that you are using at any time.

وباختصار ، فإن هذا الباترن مكون من عملية decoupling للالجوريزم و encapsulating في كلاسات Classes مختلفة ، حيث يتم فصل الكائن عن سلوكه في كلاسين منفصلين ، وهو ما سيسمح لك لاحقاً بتغيير الالجوريزم وقت ما تريد .

مميزات هذا الباترن :
- يمكنك بكل بساطة من خلاله تغيير ال behaviour الخاص بك وقت ما تريد عن طريق فصل كل behaviour في كلاس خاص به .
- في حالة رغبتك في اضافة behaviour أو تعديله لن تضطر إلى التعديل في الكلاس الرئيسي .


الاستخدام :
عندما يكون لديك عدد من الكائنات Objects متشابه ومختلفة فقط في ال behaviour فإنه من المفضل دائماً استخدام Strategy حيث يمكنك اختصار جميع هذه الكلاسات في كلاس واحد فقط مع استخدام Strategies مختلفة .
كذلك الأمر أيضاً مع subclassing للكائنات ، حيث يعتمد الحل القديم على كون ال behaviour من نوع static ، وعندما ترغب في تغييره فإنك تقوم بعمل new instance ومن ثم تقوم بعمل تبديل replace للقديم ، ولكن الآن كل ما عليك هو تغيير ال Strategy وهو سيقوم تلقائياً بتعديل ال behaviour .


أيضاً فإن وجود عدد كبير من ال behaviour في كلاس واحد سيجبرك على كثرة استخدام الجمل الشرطية لمعرفة ال behaviour المطلوب ، أما مع Strategy فلن تحتاج إلى ذلك أبداً .
طريقة العمل بكل بساطة في الصورة التالية :

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

التسميات:


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ 03:44 م   0 تعقيبات
تشفير الأسرار للمستخدم الحالي
الإثنين، ٢٦ مايو، ٢٠٠٨


            يحتاج التطبيق في كثير من الأحيان إلى تخزين بيانات خصوصية في ملف أو في الذاكرة والحل الواضح هو التشفير المتماثل الذي يشفر البيانات باستخدام سلسة عشوائية من البايتات تدعى بالمفتاح السري. وتكمن المشكلة عندما تريد فك تشفير البيانات المشفرة في أنك ستحتاج لنفس المفتاح السري الذي استخدمته للتشفير مما يؤدي إلى سلسلة من التعقيدات فإما أنك ستحتاج إلى مكان آمن لتخزين المفتاح السري وهذا أمر صعب أو أنك ستحتاج لاستخلاصه من معلومات أخرى مثل كلمة سر مزودة من قبل المستخدم والتي تكون في الغالب غير آمنة وستنهار كليا عندما ينسى المستخدم كلمة السر الخاصة به.



 


و الحل المثالي هو جعل نظام الويندوز يقوم بتشفير البيانات من أجلك ولتحقيق هذا ستحتاج إلى ما يسمى بـ DPAPI أو Data Protection API والذي يقوم بتشفير البيانات باستخدام مفتاح متماثل مبني على معلومات خاصة بالمستخدم والآلة وبهذه الطريقة لم تعد تقلق بخصوص تخزين المفتاح ووثوقيته وبدلا عن ذلك يتأكد نظام التشغيل من وثوقية المستخدم عندما يدخل إلى النظام وتكون البيانات المخزنة من قبل مستخدم غير ممكنة الوصول بالنسبة للمستخدمين الآخرين.


في النسخ السابقة من الدوت نيت لايوجد فئات مدارة لاستخدام DPAPI وتم تصحيح هذا في الدوت نيت 2.0 بالفئة الجديدة ProtectData في مجال الأسماء System.Security.Cryptography


 


كيف يمكنني فعل ذلك


 


            الفئة ProtectData تقدم طريقتان مشتركتان Shared Methods الأولى ProtectData تأخذ مصفوفة بايتات تمثل البيانات المراد تشفيرها وتعيد مصفوفة بايتات بالبيانات المشفرة والثانية UnprotectData تقوم بالعملية المعاكسة حيث تأخذ مصفوفة بايتات بالبيانات المشفرة وتعيد مصفوفة بايتات بالبيانات المفكوك تشفيرها. وباستخدام ProtectData و UnprotectData يمكنك فقط التعامل مع مصفوفات بايتات Byte Array وهذا يعني أنك عندما تريد تشفير بيانات من أي نوع عليك القيام بتحويلها إلى مصفوفة بايتات قبل القيام بالتشفير.


 


مثال عملي


 


Imports System.Security.Cryptography


Imports System.IO


 


Module ProtectData


 


    Sub Main()


 


        ' Get the data.


        Console.WriteLine("Enter a secret message and press enter.")


        Console.Write(">")


        Dim Input As String = Console.ReadLine()


        Console.WriteLine()


 


        If Input <> "" Then


            Dim Data(), EncodedData() As Byte


 


            ' Write the data to a new MemoryStream.


            Dim DataStream As New MemoryStream()


            Dim Writer As New StreamWriter(DataStream)


            Writer.Write(Input)


            Writer.Close()


 


            ' Convert the MemoryStream into a byte array,


            ' which is what you need to use the ProtectData() method.


            Data = DataStream.ToArray()


 


            ' Encrypt the byte array.


            EncodedData = ProtectedData.Protect(Data, Nothing, _


              DataProtectionScope.CurrentUser)


 


            ' Store the encrypted data in a file.


            My.Computer.FileSystem.WriteAllBytes("c:\secret.bin", _


        EncodedData, False)


 


        End If


    End Sub


 


End Module


 


عندما تقوم بتشغيل التطبيق سيطلب من إدخال نص والذي سيقوم بتشفيره باستخدام الحساب الحالي للمستخدم ويقوم بتخزين البيانات في الملف secret.bin والبيانات الموجودة فيه لن يستطيع قراءتها أي مستخدم آخر. وللتأكد من أن البيانات مشفرة فعلا لديك خياران قم بفتح الملف وألقي نظرة بنفسك أو يمكنك تعديل الكود ليقرأ البيانات مباشرة من مجرى الذاكرة Memory Stream و الكود التالي يحاول القيام بالخيار الثاني ونتيجة إظهاره ستتكون سلسة نصية لا معنى لها


 


  ' Verify the data is encrypted by reading and displaying it


  ' without performing any decryption.


  DataStream = New MemoryStream(EncodedData)


  Dim Reader As New StreamReader(DataStream)


  Console.WriteLine("Encrypted data: " & Reader.ReadToEnd())


  Reader.Close()


 


            ولتفكيك تشفير البيانات يجب عليك وضعها في مصفوفة بايتات ثم استخدام الطريقة UnprotectData لاستخلاص البيانات من مصفوفة البايتات ويمكنك إضافة StreamReader لإضافة دعم لتفكيك التشفير للمثال السابق مثلا يمكنك إضافة الكود التالي ليقرأ البيانات من الملف ويظهر الجملة التي أدخلتها سابقا


 


If My.Computer.FileSystem.FileExists("c:\secret.bin") Then


            Dim Data(), EncodedData() As Byte


 


            EncodedData = My.Computer.FileSystem.ReadAllBytes("c:\secret.bin")


            Data = ProtectedData.Unprotect(EncodedData, Nothing, _


              DataProtectionScope.CurrentUser)


 


            Dim DataStream As New MemoryStream(Data)


            Dim Reader As New StreamReader(DataStream)


 


            Console.WriteLine("Decoded data from file: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


تذكر بما أن البيانات تم تشفيرها بواسطة حساب المستخدم الحالي يمكنك تفكيك تشفيرها في أي وقت والقيد الوحيد هو انك يجب أن تدخل باستخدام نفس حساب المستخدم ولاحظ أنك عندما تقوم بحماية البيانات يجب عليك اختيار واحدة من القيم من التعداد DataProtectionScope Enumeration ويكون بذلك لديك خياران:


 


LocalMachine


سيقوم ويندوز بتشفير البيانات بمفتاح خاص بالآلة وبهذا تضمن أن لا أحد يستطيع قراءة البيانات إلا على نفس الجهاز. وهذا يعمل جيدا بالنسبة للتطبيقات التي تعمل على المخدم Server Side Application والتي تعمل بدون تدخل المستخدم


 


            CurrentUser


                        سيقوم ويندوز بتشفير البيانات بمفتاح خاص بالمستخدم وبالتالي لا يمكن قراءتها من قبل المستخدمين الآخرين


 


            في المثال المذكور يتم تخزين بيانات خاصة بالمستخدم ومع ذلك يمكنك تغيير مجال حماية البيانات DataProtectionScope ليتم تخزين البيانات بشكل يستطيع جميع مستخدمي الجهاز الوصول إليها.



 


وفيما يلي سرد للمثال كاملا وهو تطبيق من نوع Console Application


 


 


Imports System.Security.Cryptography


Imports System.IO


 


Module ProtectData


    Sub Main()


 


        ' Get the data.


        Console.WriteLine("Enter a secret message and press enter.")


        Console.Write(">")


        Dim Input As String = Console.ReadLine()


        Console.WriteLine()


 


        If Input <> "" Then


            Dim Data(), EncodedData() As Byte


 


            ' Write the data to a new MemoryStream.


            Dim DataStream As New MemoryStream()


            Dim Writer As New StreamWriter(DataStream)


            Writer.Write(Input)


            Writer.Close()


 


            ' Convert the MemoryStream into a byte array,


            ' which is what you need to use the ProtectData() method.


            Data = DataStream.ToArray()


 


            ' Encrypt the byte array.


            EncodedData = ProtectedData.Protect(Data, Nothing, _


              DataProtectionScope.CurrentUser)


 


            ' Store the encrypted data in a file.


            My.Computer.FileSystem.WriteAllBytes("c:\secret.bin", _


               EncodedData, False)


 


            ' Verify the data is encrypted by reading and displaying it


            ' without performing any decryption.


            DataStream = New MemoryStream(EncodedData)


            Dim Reader As New StreamReader(DataStream)


            Console.WriteLine("Encrypted data: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


        If My.Computer.FileSystem.FileExists("c:\secret.bin") Then


            Dim Data(), EncodedData() As Byte


 


            EncodedData = My.Computer.FileSystem.ReadAllBytes("c:\secret.bin")


            Data = ProtectedData.Unprotect(EncodedData, Nothing, _


              DataProtectionScope.CurrentUser)


 


            Dim DataStream As New MemoryStream(Data)


            Dim Reader As New StreamReader(DataStream)


 


            Console.WriteLine("Decoded data from file: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


        Console.ReadLine()


    End Sub


 


End Module


ماذا عن ...


            حماية البيانات قبل تخزينها في قاعدة البيانات؟ طالما أنك استخدمت الفئة ProtectedData لتشفير بياناتك يمكنك وضعها في أي مكان تريده ففي المثال السابق قمت بكتابة البيانات المشفرة إلى ملف ومع ذلك يمكنك كتابة البيانات الثنائية إلى سجل قاعدة البيانات ولفعل ذلك ستحتاج ببساطة إلى حقل ثنائي binary في جدولك بمساحة كافية ليتسع لمصفوفة البايتات المشفرة وفي الـ Sql Server تستخدم نوع البيانات varbinary لهذا الغرض


 


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة samerselo @ 10:47 م   0 تعقيبات
كيف تقوم بإضافة إجراءاتك الخاصة إلى مجال الأسماء My
الخميس، ٢٢ مايو، ٢٠٠٨

لإضافة فئة جديدة إلى مجال الأسماء My كل ما عليك عمله هو إضافة كتلة Namespace  تحمل اسم My فإذا أردنا إضافة فئة جديدة إلى مجال الأسماء My مثلا TestClass يحتوي على دالة JustForTest سنقوم ببساطة بكتابة الكود التالي


 


Namespace My


 


    Public Class TestClass


 


        Public Shared Function JustForTest(ByVal SomeText As String) As String


            Return SomeText & ", " & Now.ToString("dddd")


        End Function


 


    End Class


 


End Namespace


 


و أصبح الآن بإمكاننا استخدامه كبقية الفئات الموجودة سابقا في مجال الأسماء My



 


        TextBox2.Text = My.TestClass.JustForTest(TextBox1.Text(


 


ولكن تجدر الملاحظة هنا أن الدالات التي ستستخدمها هنا يجب أن تكون Shared أو أن تقوم بتضمينها في Module بدلا من Class وذلك لأن جميع الدالات والخصائص الموجود في Module تكون Shared دائما.


 


كما يمكنك اعتماد على الميزة الجديدة وهي الفئات الجزئية Partial Class أيضا إضافة عناصر أخرى لبعض فئات مجال الأسماء My مثل الفئة My.Computer أو الفئة My.Application ولفعل ذلك نقوم بإنشاء فئة جزئية بالاسم الصحيح وإضافة العناصر الجديدة التي نريد حيث يجب عليك تعريف هذه الفئة باستخدام Friend حتى تتطابق مع الفئة الأصلية الموجودة سابقا


Namespace My


 


    ' Extend My.Application Class


    Partial Friend Class MyApplication


 


        Public Function AppTest() As String


            Return "For Test Purposes"


        End Function


 


    End Class


 


 


End Namespace


 


واستخدامه أيضا كبقية الفئات الموجودة سابقا


 


        TextBox3.Text = My.Application.AppTest


 


وبهذا يصبح الكود الكامل لمثالنا هنا كالتالي


Public Class Form1


 


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



Button1.Click


        TextBox2.Text = My.TestClass.JustForTest(TextBox1.Text(


        TextBox3.Text = My.Application.AppTest


    End Sub


 


End Class


 


Namespace My


 


    ' Add New Class


    Public Class TestClass


 


        Public Shared Function JustForTest(ByVal SomeText As String) As String


            Return SomeText & ",   " & Now.ToString("dddd dd/MM/yyyy")


        End Function


 


    End Class


 


    ' Extend My.Application Class


    Partial Friend Class MyApplication


 


        Public Function AppTest() As String


            Return "For Test Purposes"


        End Function


 


    End Class


 


End Namespace


 


ويمكنك الآن توسيع مجال الأسماء My بحسب حاجتك وهذا ليس محدودا بتطبيق معين حيث يمكنك إنشاء مكتبة Class Library خاصة بك تضيف بعض الأشياء لمجال الأسماء My واستخدامها في تطبيقاتك وذلك بإضافة مرجع لهذه المكتبة من داخل التطبيق


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة samerselo @ 09:09 م   0 تعقيبات
مقدمة إلى Linq في فيجول بايزيك

            تضيف Linq إمكانيات استعلامية لفيجول بايزيك وتقدم إمكانيات بسيطة وقوية عندما تتعامل مع العديد من أنواع البيانات إضافة إلى إرسال الاستعلام إلى قاعدة بيانات كي تتم معالجته أو العمل مع صيغة مختلفة للاستعلام لكل نوع من أنواع البيانات التي تقوم بالبحث عنها. حيث تقدم Linq الاستعلامات كجزء من لغة فيجول بايزيك مستخدمة صيغة موحدة بغض النظر عن نوع البيانات الذي تستخدمه. كما أنها تمكنك من الاستعلام عن البيانات من قاعدة بيانات SQL Server أو Xml أو المجموعات والمصفوفات في الذاكرة أو ADO .net Datasets أو أي مصدر بيانات محلي أو بعيد يدعم Linq حيث يمكنك عمل ذلك كله باستخدام عناصر لغة فيجول بايزيك الشائعة لأن استعلاماتك أصبحت مكتوبة بلغة فيجول بايزيك ونتائج الاستعلام تعاد كأغراض أنواع بيانات قوية داعمة IntelliSense مما يجعل كتابتك للكود أسرع واكتشافك للأخطاء في الاستعلامات عند ترجمة المشروع بدلا من وقت التنفيذ كما أن استعلامات Linq يمكن أن تكون مصدرا لاستعلامات إضافية لمزيد من الدقة في البحث. كما يمكن ربطها مع التحكمات ممكنا المستخدم من استعراض وتعديل نتائج استعلامك بسهولة. فمثلا يظهر الكود التالي استعلام Linq يعيد قائمة Customers من مجموعة ويقوم بتجميعهم حسب الموقع



Dim customers As List(Of Customer) = GetCustomerList()


Dim customersByCountry = From cust In customers _


                         Order By cust.Country, cust.City _


                         Group By CountryName = cust.Country _


                         Into RegionalCustomers = Group, Count() _


                         Order By CountryName


For Each country In customersByCountry


  Console.WriteLine(country.CountryName & _


                    " (" & country.Count & ")" & vbCrLf)


  For Each customer In country.RegionalCustomers


    Console.WriteLine(vbTab & customer.CompanyName & _


                      " (" & customer.City & ")")


  Next


Next


مزودات Linq  - LINQ Providers


يقوم مزود Linq بتنظيم استعلامات Linq في فيجول بايزيك بحسب مصدر البيانات الذي تستخدمه فعندما تكتب استعلام Linq يأخذ المزود ذلك الاستعلام ويترجمه إلى أوامر يستطيع مصدر البيانات تنفيذها ويقوم أيضا بتحويل البيانات من الأغراض المصدرية ليشكل نتائج الاستعلام وأخيرا يقوم بتحويل الأغراض إلى بيانات عندما ترسل التحديثات للمصدر. ويضم فيجول بايزيك مزودات Linq التالية:


·         Linq to Objects يمكنك هذا المزود من الاستعلام في المجموعات والمصفوفات في الذاكرة إذا كانت غرضك يدعم الواجهة IEnumerable أو الواجهة IEnumerable(T) بحيث يمكنك المزود من الاستعلام عنها ويمكنك تمكين هذا المزود باستيراد المجال System.Linq والذي يكون مستوردا بشكل افتراضي في مشاريع فيجول بايزيك


·         Linq to SQL يمكنك هذا المزود من الاستعلام من قواعد بيانات SQL Server والتحديث إليها ويجعل من السهل ربط أغراض التطبيق مع الجداول والأغراض في قواعد البيانات. ويسهل فيجول بايزيك العمل مع Linq to SQL بتقديم Object Relational Designer والذي يمكنك من إنشاء Object Model في التطبيق يرتبط مع الأغراض في قاعدة البيانات ويقدم الـ O/R Designer إمكانية التعامل مع الإجراءات والوظائف المخزنة وإجراءات الغرض DataContext الذي يدير الاتصال مع قاعدة البيانات ويخزن الحالة من أجل تصادم البيانات التفاؤلي


·         Linq to Xml يمكنك من الاستعلام من Xml والتعديل عليها بحيث يمكنك تعديل محتويات Xml الموجودة في الذاكرة أو يمكنك تحميل ملف Xml أو حفظه


·         Linq to Dataset يمكنك من الاستعلام من ADO .net Datasets والتعديل عليها وإضافة قوة Linq للتطبيقات التي تستخدم Datasets تسهل وتوسع إمكانيات الاستعلام والتجميع والتحديث في الـ Dataset في تطبيقك


بنية استعلام Linq - The Structure of a LINQ Query


            يشار عادة إلى استعلام Linq بتعبير الاستعلام وهو يتألف من توليفة من تراكيب الاستعلام التي تحدد مصدر البيانات ومتغيرات التكرار الخاصة بالاستعلام كما يمكنه أن يتضمن تعليمات من أجل الفرز أو التصفية أو التجميع أو الضم أو الحساب ليتم تطبيقها على البيانات المصدرية وصيغتها تكون مشابهة لصيغة الـ SQL ولهذا ستجد أن معظم الصيغة مألوفة.


يبدأ الاستعلام بقسم From الذي يحدد مصدر البيانات والمتغيرات التي تشير إلى كل عنصر من البيانات المصدرية بشكل مستقل وهي تدعى بمتغيرات المجال أو متغيرات التكرار وقسم From مطلوب من أجل الاستعلام إلا في استعلامات التجميع Aggregate حيث يكون قسم From فيها اختياري وبعد تعريف مجال ومصدر الاستعلام في قسم From أو في قسم Aggregate يمكنك تضمين أي تركيب من أقسام الاستعلام. فمثلا الاستعلام التالي يحدد مصدر مجموعة من بيانات الزبائن بالمتغير Customers ومتغير التكرار cust


Dim queryResults = From cust In customers _


                   Select cust.CompanyName


وهذا المثال يشكل استعلام مقبول بذات نفسه ومع ذلك يصبح الاستعلام أقوى عندما تضيف أقسام استعلام أخرى لتحديد النتائج فمثلا يمكنك إضافة قسم Where لتصفية النتائج إلى قيمة أو أكثر وتكون تعابير الاستعلام عبارة عن سطر واحد من الكود بحيث يمكنك إضافة أقسام استعلام جديدة لنهاية الاستعلام كما يمكنك فصل الاستعلام إلى عدة أسطر لتحسين قراءة كودك باستخدام المحرف _ ويمثل الكود التالي استعلاما يستخدم قسم Where


Dim queryResults = From cust In customers _


                   Where cust.Country = "USA"


ويمثل قسم select قسم قوي آخر في الاستعلام حيث يمكنك من إعادة الحقول المختارة فقط من مصدر البيانات وتعيد استعلامات Linq مجموعة تعدادية من الأغراض القوية النوع كما يمكنها إعادة أنواع مجهولة أو أنواع معروفة. ويمكن استخدام قسم select للعودة بحقل واحد فقط من مصدر البيانات وعندما تفعل هذا يكون نوع المجموعة المعادة هو نوع بيانات ذلك الحقل. وعندما يعيد قسم Select مجموعة من الحقول من مصدر البيانات تكون المجموعة المعادة من النوع المجهول ويمكنك مطابقة الحقول المعادة من الاستعلام مع حقول من نوع معروف محدد ويظهر الكود التالي تعبير استعلام يعيد مجموعة نوعها مجهول تضم أرقاما مع بيانات من الحقل المحدد من مصدر البيانات


Dim queryResults = From cust In customers _


                   Where cust.Country = "USA" _


                   Select cust.CompanyName, cust.Country


يمكن استخدام استعلامات Linq لدمج عدة مصادر من البيانات في نتيجة واحدة حيث يمكن عمل هذا باستخدام قسم From واحد أو أكثر أو باستخدام أقسام Join أو Group Join ويظهر الكود التالي تعبير استعلام يضم بيانات Customer و Order ويعيد مجموعة من نوع مجهول تحتوي بيانات من Customer و Order


Dim queryResults = From cust In customers, ord In orders _


                   Where cust.CustomerID = ord.CustomerID _


                   Select cust, ord


يمكنك استخدام قسم Group Join لبناء استعلامات شجرية تحتوي مجموعة من أغراض Customer وكل غرض Customer يمتلك خاصية تحتوي مجموعة تتضمن جميع أغراض order لذلك الزبون. ويظهر المثال التالي تعبير استعلام يدمج بيانات Customer و Order كنتيجة شجرية ويعيد مجموعة من نوع مجهول ويعيد الاستعلام نوعا يتضمن الخاصية CustomerOrders تحتوي على مجموعة تحتوي على مجموعة من بيانات Order وبيانات Customer وتتضمن أيضا الخاصية OrderTotal تحتوي على مجموع إجمالي الطلبات لذلك الزبون


Dim queryResults = From cust In customers _


                   Group Join ord In orders On _


                   cust.CustomerID Equals ord.CustomerID _


                   Into CustomerOrders = Group, _


                        OrderTotal = Sum(ord.Total) _


                   Select cust.CompanyName, cust.CustomerID, _


                          CustomerOrders, OrderTotal


معاملات استعلام Linq - Visual Basic LINQ Query Operators


            تتضمن الفئات في المجال System.Linq والمجالات التي تدعم Linq طرائق يمكنك استدعاؤها لإنشاء الاستعلامات وتوليها بحسب حاجة التطبيق ويتضمن فيجول بايزيك كلمات مفتاحية لأقسام الاستعلام الشائعة


From Clause


يجب أن يبدأ الاستعلام بقسم From أو Aggregate ويحدد قسم From المجموعة المصدر أو متغير التكرار للاستعلام


' Returns the company name for all customers for whom


' State is equal to "WA".


Dim names = From cust In customers _


            Where cust.State = "WA" _


            Select cust.CompanyName


Select Clause


اختياري يحدد مجموعة من متغيرات التكرار للاستعلام


' Returns the company name and ID value for each


' customer as a collection of a new anonymous type.


Dim customerList = From cust In customers _


                   Select cust.CompanyName, cust.ID


و إن لم يكن قسم Select موجودا في الاستعلام فتتألف متغيرات التكرار للاستعلام من تلك المحددة في قسم From أو Aggregate


Where Clause


اختياري ويحدد شرط التصفية للاستعلام


' Returns all product names for which the Category of


' the product is "Beverages".


Dim names = From product In products _


            Where product.Category = "Beverages" _


            Select product.Name


Order By Clause


اختياري ويحدد ترتيب الفرز للأعمدة في الاستعلام


' Returns a list of books sorted by price in


' ascending order.


Dim titlesAscendingPrice = From b In Books _


                           Order By b.Price


Join Clause


اختياري ويدمج مجموعتين ضمن مجموعة واحدة


' Returns a list of books sorted by price in


' ascending order.


Dim titlesAscendingPrice = From b In Books _


                           Order By b.Price


Group by Clause


اختياري ويقوم بتجميع عناصر نتيجة الاستعلام ويمكن استعماله لتطبيق إجراءات تجميع لكل مجموعة


' Returns a list of orders grouped by the order date


' and sorted in ascending order by the order date.


Dim orders = From order In orderList _


             Order By order.OrderDate _


             Group By OrderDate = order.OrderDate _


             Into OrdersByDate = Group


Group Join Clause


اختياري ويجمع مجموعتين ضمن مجموعة شجرية واحدة


' Returns a combined collection of customers and


' customer orders.


Dim customerList = From cust In customers _


                   Group Join ord In orders On _


                   cust.CustomerID Equals ord.CustomerID _


                   Into CustomerOrders = Group, _


                        OrderTotal = Sum(ord.Total) _


                   Select cust.CompanyName, cust.CustomerID, _


                          CustomerOrders, OrderTotal


Aggregate Clause


يجب بدء الاستعلام دوما إما بقسم From أو قسم Aggregate وقسم Aggregate يطبق واحدة أو أكثر من وظائف التجميع على المجموعة فمثلا يمكن استخدام قسم Aggregate لحساب مجموع جميع العناصر المعادة بالاستعلام


' Returns the sum of all order totals.


Dim orderTotal = Aggregate order In Orders _


                 Into Sum(order.Total)


كما يمكنك استخدام قسم Aggregate لتعديل الاستعلام فمثلا يمكن استخدام قسم Aggregate لإجراء عملية حسابية على مجموعة استعلام


' Returns the customer company name and largest


' order total for each customer.


Dim customerMax = From cust In customers _


                  Aggregate order In cust.Orders _


                  Into MaxOrder = Max(order.Total) _


                  Select cust.CompanyName, MaxOrder


Let Clause


اختياري ويقوم بحساب قيمة ويضعها في متغير جديد


' Returns a list of products with a calculation of


' a ten percent discount.


Dim discountedProducts = From prod In products _


                         Let Discount = prod.UnitPrice * 0.1 _


                         Where Discount >= 50 _


                         Select prod.ProductName, prod.UnitPrice, Discount


Distinct Clause


اختياري وهو يضبط القيم المعادة من الاستعلام بحيث لا يجلب قيما مكررة


' Returns a list of cities with no duplicate entries.


Dim cities = From item In Customers _


             Select customer.City_


             Distinct


Skip Clause


اختياري يتجاوز عددا معينا من العناصر في المجموعة ويعيد الباقي


' Returns a list of customers. The first 10 customers


' are ignored and the remaining customers are


' returned.


Dim customerList = From cust In customers _


                   Skip 10


Skip While Clause


اختياري يتجاوز عناصر المجموعة طالما قيمة الشرط True ثم يعيد باقي العناصر


' Returns a list of customers. The query ignores all


' customers until the first customer for whom


' IsSubscriber returns false. That customer and all


' remaining customers are returned.


Dim customerList = From cust In customers _


                   Skip While IsSubscriber(cust)


Take Clause


اختياري ويعيد عددا من العناصر المتجاورة في بداية المجموعة


' Returns the first 10 customers.


Dim customerList = From cust In customers _


                   Take 10


Take While Clause


اختياري يقوم بتضمين عناصر المجموعة طالما قيمة الشرط True ويتجاهل بقية العناصر


' Returns a list of customers. The query returns


' customers until the first customer for whom


' HasOrders returns false. That customer and all


' remaining customers are ignored.


Dim customersWithOrders = From cust In customers _


                          Order By cust.Orders.Count Descending _


                          Take While HasOrders(cust)


كما يمكنك استخدام خصائص إضافية لاستعلام Linq باستدعاء عناصر المجموعات والأنواع المستعلم عنها التي يوفرها Linq حيث يمكنك استخدام هذه الإمكانيات الإضافية باستدعاء معامل استعلام على نتيجة الاستعلام فمثلا الكود التالي يستخدم الطريقة Union لدمج ناتج استعلامين في نتيجة استعلام واحدة ويستخدم الطريقة ToList(TSource) لإعادة ناتج الاستعلام كقائمة


Public Function GetAllCustomers() As List(Of Customer)


    Dim customers1 = From cust In domesticCustomers


    Dim customers2 = From cust In internationalCustomers


 


    Dim customerList = customers1.Union(customers2)


    Return customerList.ToList()


End Function


 


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة samerselo @ 09:04 م   1 تعقيبات
الصفحة الرئيسية
Google Search
Google
       

كتاب المدونة
من نحن ؟
مجموعة من الكتاب باللغة العربية بلغة الدوت نت ، نلتقي هنا لكي نتشارك الخبرات والمعلومات حول الجديد في عالم الدوت نت
ارشيف المواضيغ والمقالات السابقة
VB.net <> C#

الفروقات بين سي شارب و في بي . نت
روابط ومواقع تقنية عربية
عداد الزيارات
Locations of visitors to this page
أشخاص شرفونا بزيارتهم
مركز التحميل
© 2005 DotNet4Arab Blogspot Template by Isnaini Dot Com