|
|
آموزش ساخت ActiveX Control- قسمت دوم |
|
|
سلام خدمت دوستان. در ابتدا از دوستان، امير حسين حسنيني و آقا كامران و آقا مهران واقعاً به خاطر لطفي كه نسبت به ما داشتند، تشكر ميكنم. در مورد سؤال آقا مهران هم، راستشو بخواين تا حالا امتحان نكردهام و بلد نيستم! اگه برات مقدور بود و حجمش كم بود، برام بفرست شايد بتونم! در ادامه قسمت قبل، ميخواهيم چند Property به كنترل اضافه كنيم. اگر يادتان باشد، رنگ دكمه ما در حالت عادي سبز و در حالت فشرده، قرمز بود، حالا ميخواهيم رنگ در حالت فشرده شدن را از كاربر بگيريم. پس یک Property تعريف ميكنيم و از طريق آن, رنگ مورد نظر را به دست ميآوريم. ويزارد رابط كنترل ActiveX را اجرا كنيد. اين دفعه يك راه سريعتر براي آوردن اين ويزارد معرفي ميكنم. منوي Add-ins و سپس زيرمنوي Add-in Manager… را باز كنيد. در ليست، مورد VB 6 ActiveX Ctrl Interface Wizard را انتخاب كنيد. در فريم Load Behavior، دو جعبه اولي را علامت بزنيد. OK را كليك كنيد. دوباره به منوي Add-ins برويد. خواهيد ديد كه يك فرمان به موارد قبلي اضافه شده است كه همان VB 6 ActiveX… است. آن را اجرا كنيد. همان ويزارد قبلي است. به صفحه سوم برويد و New… را بزنيد. در كادر Name، نام Property، (مثلاً OnPressedBackColor) را وارد كنيد. OK را بزنيد. به صفحه بعدي برويد. دوباره به صفحه بعدي برويد. OnPressedBackColor را انتخاب كنيد. از قسمت DataType مورد OLE_Color را انتخاب كنيد. در كادر Default Value مقدار 255 را وارد كنيد. اين عدد، رنگ قرمز را مشخص ميكند به اين معني كه رنگ پيشفرض ما براي اين ويژگي، رنگ قرمز است. در كادر Description ميتوانيد توضيحي در مورد اين ويژگي بنويسيد. Finish را بزنيد در صورت ظاهر شدن پنجره Summary، Close را بزنيد. پنجره كد را باز كنيد و تغييرات حاصل را ببينيد. به رويداد Mousedown برويد و آن را به اين صورت اصلاح كنيد: Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) UserControl.BackColor = m_OnPressedBackColor End Sub همانطور كه ميبينيد، براي هر Property كه تعريف میکنیم، دو تابع وجود دارد، يكي با نام Property Get و ديگري با نام Property Let كه در بعضي موارد تبديل به Property Set ميشود. تابع Property Get، ويژگي را ميگيرد و آن را در پنجره ويژگيها نمايش ميدهد؛ براي موارد ديگر هم استفاده ميكند. تابع Property Let نيز ويژگي را از كاربر ميگيرد و آن را ذخيره ميكند، براي برنامهنويسي نيز بايد از اين تابع استفاده كنيم، چون هنگامي كه كاربر، ويژگيها را تغيير ميدهد، بايد كارهاي لازم را انجام دهيم؛ مثلاً فرض كنيد يك ويژگي عددي داريم و ميخواهيم كاري كنيم كه اگر كاربر اعداد غير مجاز وارد كرد، به او تذكر دهيم، در آن صورت در تابع Property Let در اول، ابتدا با يك شرط، غير مجاز بودن مقدار ورودي را تشخيص ميدهيم، سپس در صورت غير مجاز بودن، با MessageBox اخطار ميدهيم و سپس با دستور Exit Property از تابع بدون ذخيره كردن مقدار ورودي خارج ميشويم. اکنون میتوانید فایل OCX را دوباره بسازید و استفاده کنید. یک Property دیگر هم اضافه میکنیم. میخواهیم برای کنترلمان، خاصیت Caption (عنوان) هم بگذاریم. برای این کار ابتدا یک Lablel روی UserControl بگذارید. نام آن را lblCaption بگذارید و خاصیت AutoSize آن را True کنید. عنوان آن را به MyButton تغییر دهید. میخواهیم این Label همیشه در وسط دکمه باشد، برای این کار یک Sub تعریف میکنیم که موقعیت Label را تنظیم میکند سپس آن را از جاهای مختلف صدا میزنیم. به انتهای پنجره ویرایش کد بروید و دستورات زیر را در آنجا بنویسید: Private Sub SetCaptionPos () lblCaption.Move (UserControl.Width – lblCaption.Width) / 2, (UserControl.Height – lblCaption.Height) / 2 End Sub این تابع را در رویدادهای Initialize و Resize از UserControl و همچنین Change از lblCaption صدا بزنید. (یعنی در این رویدادها بنویسید: Call SetCaptionPos و یا: SetCaptionPos، از افراد حرفهای به خاطر این توضیح معذرت میخواهم.) اکنون دوباره ویزارد رابط ActiveX Control را باز کنید. به صفحه دوم بروید و Caption را Add کنید. به صفحه پنجم بروید و Caption را انتخاب کنید و در کادر Default Value عبارت MyButton (به سلیقه خود میتوانید عبارت دیگری وارد کنید) را وارد کنید و Finish را بزنید. به تابع Property Let Caption بروید و بین دو خط کُدی که وجود دارد، عبارت زیر را وارد کنید: lblCaption.Caption = m_Caption حال Run را بزنيد و آن را امتحان كنيد. اگر دقت كنيد، متوجه ميشويد كه دو اشكال بزرگ در كنترل وجود دارد؛ اولي اين كه رنگ زمينه Label با رنگ زمينه UserControl متفاوت است و ديگري هم اينكه در صورتي كه روي Label كليك كنيد، كنترل كار نميكند. اين دو مشكل را با هم رفع ميكنيم. براي اينكه رنگ Label با UserControl برابر باشد، دو راه پيش رو داريم، اول اينكه براي آن برنامه بنويسيم و راه دوم (كه خيلي راحتتر است) اين كه خاصيت BackStyle از Label را روي Transparent تنظيم كنيم. راه دوم را انجام دهيد (اگر هم خواستيد راه اول را انجام دهيد، ولي زحمتش با خودتان است)، با اين كار، Label به صورت شفاف درميآيد و پشت آن ديده ميشود. براي حل مشكل دوم، روي Label دابلكليك كنيد و در رويداد Click از Label كد زير را بنويسيد: UserControl_Click يعني هر موقع كه روي Label كليك شود، تابع UserControl_click اجرا شود، يعني مثل اينكه روي خود UserControl كليك شده است. و همچنين در رويداد MouseDown از Label عبارت زير را بنويسيد: UserControl_MouseDown 0, 0, 0, 0 و در رويداد MouseUp از Label هم عبارت زير را: UserControl_MouseUp 0, 0, 0, 0 اعداد صفر را به عنوان آرگومانهاي تابع MouseUp و MouseDown وارد ميكنيم. اكنون اگر برنامه را اجرا كنيد، متوجه ميشويد كه هر دو اشكال رفع شدهاند. درس امروز هم تمام شد. در ادامه مقاله نيز درباره ActiveX Control صحبت خواهيم كرد، براي اينكه مقدار يادگيري خودتان را ارزيابي كنيد، چند تمرين به شما ميگويم: 1) يك ويژگي ForeColor براي كنترل بگذاريد و با آن، رنگ Caption كنترل (يا همان رنگ متن Label) را از كاربر بگيريد و اعمال كنيد. 2) براي كنترل، يك خاصيت Font بگذاريد و با آن، فونت را از كاربر بگيريد و روي Label اعمال كنيد. در صورتي كه اشكالي داشتيد، در بخش نظرات بگوييد تا در صورت امكان جواب دهم. تا بعد، خدا يار و نگهدارتان باد. |
||
|
2
نوشته شده در جمعه 9 اردیبهشت1384ساعت 15:10 توسط موسي مرادي
|
||