|
|
آموزش ساخت ActiveX Control - قسمت سوم |
|
|
باز هم سلام. از آقا افشين هم واقعاً تشكر ميكنم. در مورد سؤال آقا مهران، يكي از دوستانم راهحلي پيشنهاد كردند. اگر كنترل شما طوري است كه هنگام گذاشتن روي فرم، يك پنجره باز ميكند و كد ميخواهد و هيچ محدوديت ديگري ندارد، ميتوانيد با استفاده از روشي كه در مقاله «آموزشي فارسيسازي نرمافزارها» در سايت تككليك معرفي كردهام، با Visual C اكتيوايكس را باز كنيد و «پنجره محاوره» مربوطه را پيدا كنيد و آن را پاك كنيد. البته اين روش خيلي هم علمي نيست و همانطور كه گفتم، فقط مواقعي كاربرد دارد كه محدوديت ذكر شده وجود داشته باشد. در صورت وجود محدوديتهاي ديگر كارساز نيست. امروز ميخواهم چند تا از Propertyهاي مهم خود UserControl را براي شما آموزش بدهم. پروژه كنترلي كه در جلسات قبل ساختيم را باز كنيد. پنجره مربوط به UserControl را باز كنيد. همانطور كه ميبينيد در پنجره Properties، ويژگيهاي زيادي وجود دارد كه بسياري از آنها را در حالت عادي VB ديدهايد. ويژگي CanGetFocus: در حالت پيشفرض فعال است. اگر غيرفعال كنيد، كنترل شما در هنگام اجرا Focus قبول نميكند و همچنين در اين حالت، از كنترلهايي كه Focus قبول ميكنند، مانند CommandButton، نميتوانيد در كنترلتان استفاده كنيد. (همانطور كه ميبينيد، اين كنترلها در جعبه ابزار VB غيرفعال ميشوند.) ويژگي ControlContainer: در حالت پيشفرض غير فعال است. اگر فعال كنيد، كنترل شما خاصيت قاب بودن به خود ميگيرد، يعني كنترلهاي ديگر ميتوانند در داخل كنترل شما قرار بگيرند. مثل كنترل Frame. هر دو حالت اين ويژگي را امتحان كنيد و نتيجه را ببينيد. ويژگي DefaultCancel: در حالت پيشفرض غير فعال است. اگر فعال كنيد، دو ويژگي به كنترل شما اضافه ميشود كه عبارتند از Defaut و Cancel كه هر دو از نوع True-False هستند. اين ويژگيها در كنترل CommandButton وجود دارند، ميتوانيد آنها را آزمايش كنيد. توضيح در مورد اين دو ويژگي: اگر كاربر خاصيت Default يكي از كنترلها را فعال كند، خاصيت Default كنترلهاي ديگر غير فعال ميشود. هنگامي كه اين خاصيت براي يك كنترل، فعال است، موقعي كه فوكوس در آن كنترل قرار ندارد، كاربر ميتواند با فشار دادن كليد Enter، رويداد Click از آن كنترل را اجرا كنيد. اين موضوع را در پنجرههاي تنظيمات ويندوز، بسيار ديدهايد، مثلاً تنظيمات را انجام ميدهيد و با زدن Enter پنجره را OK ميكنيد. ويژگي Cancel نيز دقيقاً مانند Default است فقط با اين تفاوت كه در آن به جاي Enter، كليد Cancel كار ميكند. ويژگي InvisibleAtRunTime: اگر اين ويژگي را فعال كنيد، كنترل شما در هنگام اجرا نامرئي ميشود. مثل كنترل Timer. مثلاً اگر ميخواهيد كنترلي طراحي كنيد كه كاربر، بيشتر، از توابع (متدها)ي آن استفاده خواهد كرد، از اين خاصيت استفاده كنيد. مثلاً بنده در حال طراحي يك كنترل MessageBox پيشرفته هستم كه امكانات زيادي نسبت به تابع MsgBox ويژوال بيسيك دارد. در اين كنترل (كه خاصيت بالا در آن فعال است)، يك متد گذاشتهام كه با فراخواني آن توسط كاربر، يك فرم در صفحه ظاهر ميشود كه حاوي متن تذكر و تصوير و خيلي مشخصات ديگر است. ويژگي PropertyPages: اگر دكمه داخل اين ويژگي را بزنيد و موارد آنجا را تيك بزنيد، يك ويژگي Custome به كنترل شما اضافه ميشود و همچنين چندين «صفحه ويژگي» هم اضافه ميشود. توسط اين صفحات ويژگي، كاربر ميتواند ويژگيهاي كنترل شما را از اين صفحات و بدون نياز به پنجره Properties وارد كند. امتحانش ضرر نداره. ويژگي ToolBoxBitmap: توسط ويژگي ميتوانيد يك تصوير را لود كنيد. در آن صورت اين تصوير در پنجره ابزار نشان داده خواهد شد (در صورتي كه هيچ تصويري انتخاب نكنيد، عكس يك قلم نمايش داده ميشود). توصيه ميكنيم براي اين ويژگي از تصاوير كوچك مثلاً 16 * 16 پيكسل استفاده كنيد. بقيه كنترلها را ميشناسيد. تا اينجا چندتا Property و يك Event تعريف كردهايم و با آنها آشنا شدهايد. الان فقط تعريف «مِتُد» باقي مانده است كه آن را هم توضيح ميدهم. تعريف متد از تمام موارد بالا سادهتر و راحتتر است. براي تعريف متد كافي است كه يك Sub يا يك Function در پروژه تعريف كنيم. به همين راحتي. فقط يك نكته مهم باقي ميماند و آن هم اينكه اگر Sub و يا تابع را با كلمه Public تعريف كنيد، آنوقت آن تابع به يك متد تبديل ميشود و كاربر هنگام استفاده از كنترل شما، ميتواند از آن به عنوان يك متد استفاده كند، در ضمن شما ميتوانيد يك يا چند آرگومان براي متد در نظر بگيريد. ولي اگر با كلمه Private تعريف كنيد، آنوقت آن ديگر يك متد نيست، بلكه فقط يك Sub و يا تابع داخلي است كه فقط خودتان ميتوانيد در همان پروژه استفاده كنيد، مثل همان تابع SetCaptionPos كه قبلاً تعريف كرديم. حالا كلمه Private را در ابتداي آن تابع به Public تبديل كنيد و فايل OCX را بسازيد و نتيجه را ببينيد؛ بله! تابع SetCaptionPos به يك متد تبديل شده است. (يادتان نرود Public را به حالت اولش برگردانيد.) يك مطلب ديگر؛ ميخواهيم براي كنترل، فوكوس طراحي كنيم. برنامهنويسي اين بخش را به شما واگذار ميكنم و فقط شما را راهنمايي ميكنم. نگران نباشيد كار بسيار راحتي است. ابتدا يك Shape روي UserControl بگذاريد. ويژگي BorderStyle آن را روي 3-Dot تنظيم كنيد و Visible آن را False كنيد. برايش نام مناسبي تعيين كنيد. به رويداد Resize از UserControl برويد. در اينجا دستوراتي بنويسيد كه هنگامي كه UserControl تغيير اندازه ميكند، Shape هم متناسب با آن تغيير كند. دقيقاً مثل فوكوس CommandButton. حالا به رويداد GotFocus از UserControl برويد و در آنجا بنويسيد: Shape1.Visible = True (البته اگر نام Shape شما Shape1 باشد.) و در رويداد LostFocus از UserControl هم بنويسيد: Shape1.Visible = False. خودتان فهميديد كه چكار كرديم... در مقاله بعد، در مورد كار با فايلهاي Resource خواهم نوشت. منتظر باشيد، نظراتتان را هم بگوييد. ضمناً اگر كسي از دوستان سايتي سراغ دارد كه فضاي مجاني ميدهد، لطفاً به من هم بگويد، ميخواهم در وبلاگ، تصاوير و همچنين چند تا برنامه نمونه براي هر مبحث بگذارم. |
||
|
2
نوشته شده در یکشنبه 11 اردیبهشت1384ساعت 15:44 توسط موسي مرادي
|
||