khazaei
11-10-2008, 06:42 PM
اين مقاله براي برنامه نويسان سطح متوسط و پيشرفته مي باشد ؛ در اين مقاله سعي شده روش طراحي Windows Control را با چند مثال نشان داده شود . کدهاي اين مقاله به زبان VB.NET مي باشد ولي بدليل شباهت روند طراحي Windows Control در زبان هاي مبتني بر .NET کاربران C# و ديگر زبان هاي مبتني بر .NET مي توانند از آن استفاده کنند .براي انجام مثال هاي قدم به قدم اين مقاله نياز به نصب Visual Studio .NET 2003 داريد . Windows Control Library ، مجموعه اي از يک چند کنترل است که برنامه نويس خود ، آن را طراحي مي کند . مثلا شما مي خواهيد يک TextBox طراحي کنيد که فقط عدد قبول کند يا يک progress bar طراحي کنيد که به دلخواه شما طراحي شده باشد و ... بطوري که بتوانيد مانند کنترل هاي معمولي مثل TextBox ، Button و ... در برنامه هايتان از آن استفاده کنيد.
انواع روش هاي ساخت Windows Control :
1ـ ساخت يک Windows Control بر اساس يک کنترل استاندارد موجود
مثلا شما يک Windows Control بر اساس TextBox استاندارد .NET طراحي مي*کنيد که يک سري قابليت*هاي ديگري اضافه بر TextBox معمولي داشته باشد يا دکمه نسبت حرکت mouse حساس باشد يا صدها نمونه ديگر .
به اينگونه کنترل ها اصطلاحا Inherited Control مي*گويند يعني Windows Control کنترلي که بر پايه کنترل ديگري ساخت شده است يا به عبارت ديگر از کنترل پدر ارثبري (Inheritance) کرده است .
2ـ ساخت Windows Control ترکيبي
Windows Control ترکيبي از دو يا چند کنترل استاندارد موجود است و طراحي آن شبيه نوشتن يک Application است . مثلا شما مي*خواهيد يک کنترل طراحي کنيد که حاوي 3 TextBox باشد و وقتي کاربر درون يکي از آنها عددي وارد مي*کند همزمان جذر آن عدد و مربع آن عدد در 2 TextBox ديگر نوشته شود . چنين کنترلي ، کنترل ترکيبي مي*باشد و ساده ترين روش ساخت را داراست.
3ـ ساخت Windows Control از ابتدا تا انتها
بدين معني که شما يک کنترل را از لحاظ رويدادها، متدها ، ظاهر و ... خودتان طراحي مي*کنيد و از هيچ کنترل ديگري چيزي به ارث نمي*بريد يعني همه و همه کارها با خودتان است!
مثلا يک دکمه چند حالته !
پس از ساخت Windows Control به هر کدام از روش هاي فوق و کامپايل کردن آن يک DLL داريد که مي توانيد آنرا به Reference هاي ساير Application هاي نوشته شده بر پايه .NET اعم از C#، VB، J# و . . . اضافه کرده و از آن استفاده کنيد .
اکنون با سه مثال ساده هر سه روش فوق را بکار مي گيريم و سپس هر سه را در يک application کنترل هايي را که ساخته ايم بکار مي*گيريم
مثال روش اول :
يک TextBox بسازيد که فقط عدد قبول کند و در صورت ورود کارکتر غير عددي به کاربر پيغام خطا دهد.
طريقه ساخت:
• Visual Studio را اجرا کرده از منوي File گزينه New > New Project را انتخاب کنيد از کليد ميانبر CTRL+SHIFT+N پنجره NEW Project را باز کنيد.
• از tree View سمت چپ Visual Basic Projects را انتخاب کرده و از List View سمت راست گزينه Windows Control Library را انتخاب کنيد نام پروژه را MyControl قرار دهيد و ok را بزنيد
پنجره Solution Explorer روي UserControl1.vb کليک راست کرده گزينه Rename را انتخاب کنيد و نام آن را OnlyNumber.vb بناميد
به قسمت کد OnlyNumber.vb برويد و در قسمت تعريف Class (ابتداي فايل کد) کد1 را به کد2 تغيير دهيد و يک بار پروژه را Build کنيد:
کد 1
کد 2
• تابع UserControl1_load را حذف کنيد.
• خب اکنون بايد در زمان اجراي برنامه هنگامي که Handle کنترل ساخته مي*شود در صورتي مقدار متن پيش فرض کنترل عددي نباشد آن را به يک عدد پيش فرض تبديل کنيم ؛ مثلا 0 را متن پيش فرض قرار دهيم براي اين کار کد 3 را به قسمت کد کنترل تان اضافه کنيد.
کد 3
• و در نهايت هنگامي که متن درون کنترل تغيير مي*کند بايد چک کنيم که آيا رشته درون TextBox عددي است يا خير ، در صورت عددي بودن کار خاصي نمي*کنيم و در صورت غير عددي بودن بايد عدد قبل از تغيير را جايگزين کنيم ؛ براي اين کار چند روش وجود دارد اول اينکه متن درون TextBox را که صحيح است در يک متغير نگهداري کنيم و پس از هر تغيير در عددي نبودن رشته ورودي رشته قبلي را جايگزين کنيم و در صورت عددي بودن رشته ورودي آنرا در متغيرمان نگهداري کنيم که يک مقدار خسته کننده است يک راه ساده تر اين است که از متد Undo و Clear Undo خود TextBox استفاده کنيم ، من نيز از همين روش استفاده کرده ام .اکنون کد 4 را به کد کنترل تان اضافه کنيد.
کد 4
• پروژه را کامپايل کنيد ، اکنون کنترلتان آماده استفاده است .
پس از ساخت 3 کنترل مورد نظر ، استفاده آنها را يکجا با يک مثال تشريح مي*کنيم.
مثال روش دوم:
يک کنترل طراحي کنيد که وقتي کاربر متني را درون يک TextBox آن وارد مي*کند همزمان متن آن به صورت Uppercase و Lowercase در دو قسمت ديگر نمايش داده شود و همچنين طول رشته ورودي نيز در محل ديگر کنترل نمايش داده شود.
طريقه ساخت:
• فايل Solution قبلي را دوباره باز کنيد روي نام پروژه MyControl کليک راست کرده و از منوي زمينه آن Add و از آنجا Add User Control را انتخاب کنيد
در پنجره ظاهر شده نام کنترل را StringShow بناميد و دکمه Open را بزنيد.
• کنترل هاي مورد نظر را مطابق جدول 1 روي حالت Design کنترل StringShow قرار دهيد.
جدول 1
اکنون بايد حالت Design کنترلتان شبيه شکل 4 شده باشد.
شکل 4
• اکنون به قسمت کد کنترل StringShow برويد و کد 5 را وارد کنيد.
کد 5
• پروژه را مجددا کامپايل کنيد.
اکنون کنترل دوم نيز کار ساختش تمام شد!
مثال روش سوم:
يک کنترل BusyBar طراحي کنيد که با فراخاني يک متد آن حالت Busy بودن را بصورت حرکت گرافيکي رفت و بر گشتي انجام و با فر اخواني متد ديگر از حالت Busy خارج شود.
همان طور که مي*بينيد چنين کنترلي را نه بر اساس يک کنترل موجود مي*توان ساخت و نه از ترکيب آنها؛ اکنون روند ساخت آنرا تشريح مي*کنيم .
طريقه ساخت:
• مانند روش دوم فايل Solution قبلي را دوباره باز کنيد روي نام پروژه MyControl کليک راست کرده و از منوي زمينه آن Add و از آنجا Add User Control را انتخاب کنيد ( شکل3 ).
• در پنجره ظاهر شده نام کنترل را MyProg بناميد و دکمه Open را بزنيد.
• يک Timer روي حالت Design کنترلتان قرار دهيد ، نام آنرا MyTimer و خصوصيت Interval آنرا 5 قرار دهيد.
• به قسمت کد کنترلتان برويد و کد 6 را در آن تايپ کنيد:
کد 6
• پروژه را يک با را کامپايل کنيد.
اکنون هر سه کنترل را ساختيم و نوبت به آزمايش کنترل ها رسيده !
براي آزمايش کنترل ها مراحل زير را دنبال کنيد :
1ـ مانند مثال 3 دوم فايل Solution قبلي را دوباره باز کنيد روي Sulotion کليک راست کرده از منوي زمينه Add و از آنجا New Project را انتخاب کنيد
2ـ از tree View سمت چپ Visual Basic Projects را انتخاب کرده و از List View سمت راست گزينه Window Application را انتخاب کنيد نام پروژه را TestMyControls قرار دهيد و ok را بزنيد.
3ـ از پنجره ToolBox ، برگه (Tab) General را انتخاب کنيد ، درون برگه General کليک راست کرده از منوي زمينه، گزينه Add/Remove Items … را انتخاب کنيد
4ـ در پنجره Customize Toolbox روي دکمه Browse کليک کرده و از آنجا فايل Mycontrol.Dll مربوط به پروژه MyControl را انتخاب کنيد که به صورت پيش فرض درون مسير
My Documents > Visual Studio Projects > MyControl > Bin > Mycontrol.Dll
قرار دارد. سپس دکمه OK را زده تا سه کنترلي را که ساخته ايم به برگه General اضافه شود
5ـ هر سه کنترل ClsOnlyNumber , MyProg , StringShow را روي فرم پروژه TestMyControls قرار دهيد .
6ـ دو Button به فرم اضافه کنيد و خاصيت Text يکي را Start و ديگري را Stop قرار دهيد
7ـ روي به قسمت کد فرمتان برويد و کد 7 را تايپ کنيد:
کد 7
8ـ در پنجره Solution Explorer روي پروژه TestMyControls کليک راست کرده از منوي زمينه Debug و ازآنجا Start New Instance را انتخاب کنيد تا پروژه اجرا شود يا اينکه در پنجره Solution Explorer روي پروژه TestMyControls کليک راست کرده از منوي زمينه Set As Startup Project را انتخاب کنيد و سپس با زدن دکمه F5 پروژه را اجرا کنيد.
9ـ با زدن روي دکمه Start کنترل BusyBar شروح به فعاليت مي*کند و با زدن دکمه Stop از حرکت باز مي*ماند، وقتي متني درون TextBox ي که با Label ، String مشخص شده است تايپ مي*کنيد همان متن به صورت Uppercase و Lowercase در دو TextBox ديگر نمايش داده مي*شود و طول رشته ورودي در مکان ديگر و در نهايت وقتي رشته غير عددي درون TextBox ، ClsOnlyNumber تايپ مي*کنيد پيغام خطا به شما داده مي*شود
هر چند که کنترل هايي که ما ساخته ايم خيلي ساده بودند ولي اساس کار براي ساخت کنترل هاي پيچيده تر نيز به همين ترتيب مي*باشد ، شما مي*توانيد با اضافه کردن Event و Property و ... به کنترلهايتان ، کنترل هاي بهتري بسازيد و از آنها در ساير برنامه هاي تان استفاده کنيد .
در پايان به چند مزيت و دليل براي ساخت Windows Control Library ها اشاره مي*کنم:
• هميشه کنترل هاي استاندارد پاسخگوي نياز هاي شما نيستند .
• در اکثر مواقع برخي از قسمت هاي UI و کنترلهاي سفارشي موجود در يک Application مورد نياز در Application هاي ديگر نيز مي*باشد.
• کنترل هاي شما پس از ساخته شدن مستقل از زبان هستند و شما مي*توانيد از آنها در هر زبان مبتني بر .NET استفاده کنيد.
انواع روش هاي ساخت Windows Control :
1ـ ساخت يک Windows Control بر اساس يک کنترل استاندارد موجود
مثلا شما يک Windows Control بر اساس TextBox استاندارد .NET طراحي مي*کنيد که يک سري قابليت*هاي ديگري اضافه بر TextBox معمولي داشته باشد يا دکمه نسبت حرکت mouse حساس باشد يا صدها نمونه ديگر .
به اينگونه کنترل ها اصطلاحا Inherited Control مي*گويند يعني Windows Control کنترلي که بر پايه کنترل ديگري ساخت شده است يا به عبارت ديگر از کنترل پدر ارثبري (Inheritance) کرده است .
2ـ ساخت Windows Control ترکيبي
Windows Control ترکيبي از دو يا چند کنترل استاندارد موجود است و طراحي آن شبيه نوشتن يک Application است . مثلا شما مي*خواهيد يک کنترل طراحي کنيد که حاوي 3 TextBox باشد و وقتي کاربر درون يکي از آنها عددي وارد مي*کند همزمان جذر آن عدد و مربع آن عدد در 2 TextBox ديگر نوشته شود . چنين کنترلي ، کنترل ترکيبي مي*باشد و ساده ترين روش ساخت را داراست.
3ـ ساخت Windows Control از ابتدا تا انتها
بدين معني که شما يک کنترل را از لحاظ رويدادها، متدها ، ظاهر و ... خودتان طراحي مي*کنيد و از هيچ کنترل ديگري چيزي به ارث نمي*بريد يعني همه و همه کارها با خودتان است!
مثلا يک دکمه چند حالته !
پس از ساخت Windows Control به هر کدام از روش هاي فوق و کامپايل کردن آن يک DLL داريد که مي توانيد آنرا به Reference هاي ساير Application هاي نوشته شده بر پايه .NET اعم از C#، VB، J# و . . . اضافه کرده و از آن استفاده کنيد .
اکنون با سه مثال ساده هر سه روش فوق را بکار مي گيريم و سپس هر سه را در يک application کنترل هايي را که ساخته ايم بکار مي*گيريم
مثال روش اول :
يک TextBox بسازيد که فقط عدد قبول کند و در صورت ورود کارکتر غير عددي به کاربر پيغام خطا دهد.
طريقه ساخت:
• Visual Studio را اجرا کرده از منوي File گزينه New > New Project را انتخاب کنيد از کليد ميانبر CTRL+SHIFT+N پنجره NEW Project را باز کنيد.
• از tree View سمت چپ Visual Basic Projects را انتخاب کرده و از List View سمت راست گزينه Windows Control Library را انتخاب کنيد نام پروژه را MyControl قرار دهيد و ok را بزنيد
پنجره Solution Explorer روي UserControl1.vb کليک راست کرده گزينه Rename را انتخاب کنيد و نام آن را OnlyNumber.vb بناميد
به قسمت کد OnlyNumber.vb برويد و در قسمت تعريف Class (ابتداي فايل کد) کد1 را به کد2 تغيير دهيد و يک بار پروژه را Build کنيد:
کد 1
کد 2
• تابع UserControl1_load را حذف کنيد.
• خب اکنون بايد در زمان اجراي برنامه هنگامي که Handle کنترل ساخته مي*شود در صورتي مقدار متن پيش فرض کنترل عددي نباشد آن را به يک عدد پيش فرض تبديل کنيم ؛ مثلا 0 را متن پيش فرض قرار دهيم براي اين کار کد 3 را به قسمت کد کنترل تان اضافه کنيد.
کد 3
• و در نهايت هنگامي که متن درون کنترل تغيير مي*کند بايد چک کنيم که آيا رشته درون TextBox عددي است يا خير ، در صورت عددي بودن کار خاصي نمي*کنيم و در صورت غير عددي بودن بايد عدد قبل از تغيير را جايگزين کنيم ؛ براي اين کار چند روش وجود دارد اول اينکه متن درون TextBox را که صحيح است در يک متغير نگهداري کنيم و پس از هر تغيير در عددي نبودن رشته ورودي رشته قبلي را جايگزين کنيم و در صورت عددي بودن رشته ورودي آنرا در متغيرمان نگهداري کنيم که يک مقدار خسته کننده است يک راه ساده تر اين است که از متد Undo و Clear Undo خود TextBox استفاده کنيم ، من نيز از همين روش استفاده کرده ام .اکنون کد 4 را به کد کنترل تان اضافه کنيد.
کد 4
• پروژه را کامپايل کنيد ، اکنون کنترلتان آماده استفاده است .
پس از ساخت 3 کنترل مورد نظر ، استفاده آنها را يکجا با يک مثال تشريح مي*کنيم.
مثال روش دوم:
يک کنترل طراحي کنيد که وقتي کاربر متني را درون يک TextBox آن وارد مي*کند همزمان متن آن به صورت Uppercase و Lowercase در دو قسمت ديگر نمايش داده شود و همچنين طول رشته ورودي نيز در محل ديگر کنترل نمايش داده شود.
طريقه ساخت:
• فايل Solution قبلي را دوباره باز کنيد روي نام پروژه MyControl کليک راست کرده و از منوي زمينه آن Add و از آنجا Add User Control را انتخاب کنيد
در پنجره ظاهر شده نام کنترل را StringShow بناميد و دکمه Open را بزنيد.
• کنترل هاي مورد نظر را مطابق جدول 1 روي حالت Design کنترل StringShow قرار دهيد.
جدول 1
اکنون بايد حالت Design کنترلتان شبيه شکل 4 شده باشد.
شکل 4
• اکنون به قسمت کد کنترل StringShow برويد و کد 5 را وارد کنيد.
کد 5
• پروژه را مجددا کامپايل کنيد.
اکنون کنترل دوم نيز کار ساختش تمام شد!
مثال روش سوم:
يک کنترل BusyBar طراحي کنيد که با فراخاني يک متد آن حالت Busy بودن را بصورت حرکت گرافيکي رفت و بر گشتي انجام و با فر اخواني متد ديگر از حالت Busy خارج شود.
همان طور که مي*بينيد چنين کنترلي را نه بر اساس يک کنترل موجود مي*توان ساخت و نه از ترکيب آنها؛ اکنون روند ساخت آنرا تشريح مي*کنيم .
طريقه ساخت:
• مانند روش دوم فايل Solution قبلي را دوباره باز کنيد روي نام پروژه MyControl کليک راست کرده و از منوي زمينه آن Add و از آنجا Add User Control را انتخاب کنيد ( شکل3 ).
• در پنجره ظاهر شده نام کنترل را MyProg بناميد و دکمه Open را بزنيد.
• يک Timer روي حالت Design کنترلتان قرار دهيد ، نام آنرا MyTimer و خصوصيت Interval آنرا 5 قرار دهيد.
• به قسمت کد کنترلتان برويد و کد 6 را در آن تايپ کنيد:
کد 6
• پروژه را يک با را کامپايل کنيد.
اکنون هر سه کنترل را ساختيم و نوبت به آزمايش کنترل ها رسيده !
براي آزمايش کنترل ها مراحل زير را دنبال کنيد :
1ـ مانند مثال 3 دوم فايل Solution قبلي را دوباره باز کنيد روي Sulotion کليک راست کرده از منوي زمينه Add و از آنجا New Project را انتخاب کنيد
2ـ از tree View سمت چپ Visual Basic Projects را انتخاب کرده و از List View سمت راست گزينه Window Application را انتخاب کنيد نام پروژه را TestMyControls قرار دهيد و ok را بزنيد.
3ـ از پنجره ToolBox ، برگه (Tab) General را انتخاب کنيد ، درون برگه General کليک راست کرده از منوي زمينه، گزينه Add/Remove Items … را انتخاب کنيد
4ـ در پنجره Customize Toolbox روي دکمه Browse کليک کرده و از آنجا فايل Mycontrol.Dll مربوط به پروژه MyControl را انتخاب کنيد که به صورت پيش فرض درون مسير
My Documents > Visual Studio Projects > MyControl > Bin > Mycontrol.Dll
قرار دارد. سپس دکمه OK را زده تا سه کنترلي را که ساخته ايم به برگه General اضافه شود
5ـ هر سه کنترل ClsOnlyNumber , MyProg , StringShow را روي فرم پروژه TestMyControls قرار دهيد .
6ـ دو Button به فرم اضافه کنيد و خاصيت Text يکي را Start و ديگري را Stop قرار دهيد
7ـ روي به قسمت کد فرمتان برويد و کد 7 را تايپ کنيد:
کد 7
8ـ در پنجره Solution Explorer روي پروژه TestMyControls کليک راست کرده از منوي زمينه Debug و ازآنجا Start New Instance را انتخاب کنيد تا پروژه اجرا شود يا اينکه در پنجره Solution Explorer روي پروژه TestMyControls کليک راست کرده از منوي زمينه Set As Startup Project را انتخاب کنيد و سپس با زدن دکمه F5 پروژه را اجرا کنيد.
9ـ با زدن روي دکمه Start کنترل BusyBar شروح به فعاليت مي*کند و با زدن دکمه Stop از حرکت باز مي*ماند، وقتي متني درون TextBox ي که با Label ، String مشخص شده است تايپ مي*کنيد همان متن به صورت Uppercase و Lowercase در دو TextBox ديگر نمايش داده مي*شود و طول رشته ورودي در مکان ديگر و در نهايت وقتي رشته غير عددي درون TextBox ، ClsOnlyNumber تايپ مي*کنيد پيغام خطا به شما داده مي*شود
هر چند که کنترل هايي که ما ساخته ايم خيلي ساده بودند ولي اساس کار براي ساخت کنترل هاي پيچيده تر نيز به همين ترتيب مي*باشد ، شما مي*توانيد با اضافه کردن Event و Property و ... به کنترلهايتان ، کنترل هاي بهتري بسازيد و از آنها در ساير برنامه هاي تان استفاده کنيد .
در پايان به چند مزيت و دليل براي ساخت Windows Control Library ها اشاره مي*کنم:
• هميشه کنترل هاي استاندارد پاسخگوي نياز هاي شما نيستند .
• در اکثر مواقع برخي از قسمت هاي UI و کنترلهاي سفارشي موجود در يک Application مورد نياز در Application هاي ديگر نيز مي*باشد.
• کنترل هاي شما پس از ساخته شدن مستقل از زبان هستند و شما مي*توانيد از آنها در هر زبان مبتني بر .NET استفاده کنيد.