|
|
يك كنترل |
|
|
سلام دنبال يك موضوع براي نوشتن بودم كه كنترل Common Dialog يادم افتاد. اين كنترل يكي از پركاربردترين كنترلها در برنامهنويسي ويندوز است. كار اين كنترل، همانطور كه از اسمش معلوم است، نمايش دادن پنجرههاي معمول در ويندوز است. شايد شما تا حالا برايتان پيش آمده باشد كه بخواهيد در يك برنامه دستور Open قرار دهيد به طوري كه اجراي آن، پنجرهاي باز شود و كاربر بتواند فايل مورد نظر را انتخاب كند. خب، لازم نيست كه شما يك فرم طراحي كنيد، بلكه به راحتي ميتوانيد از اين كنترل استفاده كنيد. حالا يك پروژه vb باز كنيد. در جعبه ابزار راست كليك كرده و Components… را برگزينيد. مورد Microsoft Common Dialog Control را تيك بزنيد و OK را كليك كنيد. حالا يك CommonDialog و يك دكمه روي فرم بگذارید. ويژگي CancelError مربوط به CommonDialog را True كنيد. در رویداد كليك دکمه، كد زیر را بنویسید: CommonDialog1.Filter = "All Executable files|*.exe|All files|*.*" CommonDialog1.ShowOpen Shell CommonDialog1.FileName حالا اگر برنامه را اجرا كنيد و Open را بزنيد، پنجره Open ویندوز را خواهید دید. توضيح: ويژگي Filter همانطور كه از نامش برميآيد، براي فیلتر کردن فايلهاي قابل رؤیت به كار ميرود. در بالا ما دو انتخاب به كاربر داديم كه اولي فقط فايلهاي اجرايی را نشان ميدهد و دومي تمام فايلها را. متد ShowOpen هم كه پنجره Open را نشان ميدهد. تابع shell هم كه از توابع داخلي ويژوال بيسيك است، براي اجراي يك برنامه به كار ميرود. حالا يك دكمه ديگر روي فرم بگذاريد. در كليك اين دكمه بنويسيد: CommonDialog1.ShowColor Me.BackColor = CommonDialog1.Color برنامه را اجرا كنيد و نتيجه را ببينيد. حالا اگر دقت كرده باشيد، كدهاي بالا يك اشكال دارند و آن هم اين است كه هنگام زدن Cancel، با error مواجه ميشويم. براي رفع اين مشكل كد اول را به شكل زير تغيير دهيد: On Error Resume Next CommonDialog1.Filter = "All Executable files|*.exe|All files|*.*" CommonDialog1.ShowOpen If Err Then Exit Sub Shell CommonDialog1.FileName ميبينيد كه دو خط كد اضافه كرديم. در خط اول به كامپايلر ميگوييم كه هنگام به وجود آمدن error، اجراي برنامه را قطع نكند و خط بعدي را اجرا كند. بعد از دستور ShowOpen هم بررسي ميكنيم كه اگر error به وجود آمده باشد (يعني اگر دكمه Cancel زده شده باشد) اجراي دستورات را متوقف كند. حالا كد دوم را هم خودتان اصلاح كنيد. حالا ويژگيها و متدها و ايونتهاي مهم اين كنترل را توضيح ميدهم. اول از همه خيالتان را راحت كنم كه اين كنترل، هيچ رويدادي ندارد. ويژگي CancelError: در صورت فعال بودن، هنگام فشرده شدن Cancel، يك error به وجود ميآورد. ويژگي DialogTitle: نام پنجره محاوره را مشخص ميكند. ميتوانيد به دلخواه خود آن را تغيير دهيد. ويژگي FileName: آدرس كامل آخرين فايل انتخاب شده را برميگرداند. ويژگي FileTitle: نام آخرين فايل انتخاب شده را برميگرداند. ويژگي Filter: قبلاً توضيح داده شد. متد ShowColor: پنجره انتخاب رنگ ويندوز را نشان ميدهد. متد ShowFont: پنجره انتخاب فونت ويندوز را نشان ميدهد. متد ShowHelp: در صورتي كه براي اين كنترل فايل Helpي مشخص كرده باشد، آن را نشان ميدهد. متد ShowOpen: پنجره Open ويندوز را نشان ميدهد. متد ShowPrinter: پنجره انتخاب چاپگر ويندوز را نشان ميدهد. متد ShowSave: پنجره Save as ويندوز را نشان ميدهد. اگر سؤالي در مورد اين كنترل داشتيد، در نظرات بگوييد. البته از همين حالا بگويم كه من كار كردن با Printer انتخاب شده توسط پنجره ShowPrinter را بلد نيستم؛ اگر سؤالتان در اين مورد بود، نپرسيد. البته اگر خودتان بلد هستيد، لطف كنيد و به من هم بگوييد.
ضمناً همانطور كه ميبينيد وبلاگ را مقداري تغيير دادم تا شما راحتتر نظر بدهيد، اميدوارم تعداد نظرات بيشتر شود. خدا نگهدار |
||
|
2
نوشته شده در جمعه 1 مهر1384ساعت 21:49 توسط موسي مرادي
|
||
|
|
يك تابع |
|
|
بازم سلام. امروز يه تابع جالب براتون ميذارم. توسط اين تابع ميتونين اعداد را به صورتي حروفي تبديل كنين. Function Adad(ByVal Number As Double) As String خدا حافظ. |
||
|
2
نوشته شده در چهارشنبه 2 شهریور1384ساعت 14:7 توسط موسي مرادي
|
||
|
|
معرفي API |
|
|
سلام امروز با يه API آشنا شدم كه خيلي جالب بود، گفتم به شما هم ياد بدم. توسط اين API كه اسمش ClipCursor هست، ميتونيد نشانگر ماوس رو در يك مستطيل زنداني كنيد. معطل نكنيد. يه پروژه باز كنيد و كدهاي زير رو بهش اضافه كنيد. Private Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type ميبينيد كه اين API فقط يه پارامتر داره و كار باهاش راحته. حالا دو تا دكمه تو فرم بذاريد و كد زير رو تو رويداد click اولين دكمه بنويسيد: Dim rcRect As RECT rcRect.Left = Me.Left / 15 rcRect.Top = Me.Top / 15 rcRect.Right = Me.Width / 15 + rcRect.Left rcRect.Bottom = Me.Height / 15 + rcRect.Top ClipCursor rcRect تو كليك دكمه دوم هم بنويسيد: Dim rcRect As RECT rcRect.Left = 0 rcRect.Top = 0 rcRect.Right = Screen.Width / 15 rcRect.Bottom = Screen.Height / 15 ClipCursor rcRect حلا برنامه رو اجرا كنيد و دكمه اول رو كليك كنيد. حالا نشانگر ماوس رو تكون بديد. جالب بود. نه؟ اگه رو دكمه دوم كليك كنيد، نشانگر آزاد ميشود. (البته آزاد نميشود، فقط زندانش بزرگتر ميشود!) توضيح: چهار متغير موجود در ساختار RECT، ابعاد مستطيل را مشخص ميكنند. ميتونيد به داخواه خود اونا رو تغيير بديد و امتحان كنيد. فقط به ياد داشته باشيد كه ابعاد داده شده بايد بر حسب پيكسل باشند، به همين خاطر بود كه من اونا رو به 15 تقسيم كردم، چون هر پيكسل 15 تويپ هست. البته اگه يادتون رفت كه قبل از بستن پنجره، نشانگر رو آزاد كنيد، نگران نباشيد، دكمه ويندوز را از صفحه كليد بزنيد، آزاد ميشود. ضمناً در مورد سؤال يكي از دوستان كه پرسيده بودند چطر ميتونيم با دكمه وسط ماوس، اسكرولبار رو كنترل كنيم، هر چي فكر كردم، راه حلي به ذهنم نرسيد. دوستان اگه ميدونن، لطف كنن. |
||
|
2
نوشته شده در سه شنبه 1 شهریور1384ساعت 15:35 توسط موسي مرادي
|
||
|
|
يك ترفند كوچك |
|
|
باز هم سلام اين دفعه يك ترفند كوچك ياد ميدهم و ميروم. اگر شما در يك فرم منوهاي زيادي درست كرده باشيد و بخواهيد همان منوها را در فرم ديگري هم درست كنيد، چه كار ميكنيد، آيا دوباره همه آنها را خودتان ايجاد ميكنيد؟ يك راه خيلي راحت هم وجود دارد. يك شورتكات از برنامه Notepad در پوشه يا دسكتاپ ايجاد كنيد. فايل frm مربوط به فرم اولي را به داخل آن درگ كنيد. حالا شما شكل واقعي فايل frm را ميبينيد. (البته به جاي اين كار، ميتوانيد روي فايل frm، راستكليك كرده و از Open With… مورد Notepad را انتخاب كنيد.) حالا در اين فايل، دنبال سطرهايي كه مربوط به منوها هستند، بگرديد و آنها را انتخاب كرده و كپي كنيد. مثلاً اگر نام اولين منوتان mnufile باشد و آخرين زير منو از آخرين منو، mnuabout باشد، از سطر begin vb.menu mnufile شروع كرده و تا كلمه End بعد از سطر موبوط به mnuabout كپي كنيد. (دقت داشته باشيد كه بعد از آخرين منو، ممكن است چند تا كلمه End وجود داشته باشد شما همه را به جز آخري انتخاب و كپي كنيد.) حالا فايل frm دوم را در notepad (با يكي از روشهاي گفته شده) باز كنيد. حالا بلوكي كه با نام مثلاً begin vb.form form2 شروع و با End تمام ميشود را پيدا كنيد. به قبل از كلمه End برويد و محتويات كليپبرد را Paste كنيد. حالا تغييرات را ذخيره كنيد و به فرمتان در vb نگاه كنيد. اميدوارم خوشتان آمده باشد، خدانگهدار. |
||
|
2
نوشته شده در چهارشنبه 19 مرداد1384ساعت 22:57 توسط موسي مرادي
|
||
|
|
|
|
|
سلام. راستشو بخواين يكم وقت پيدا كردم، گفتم يه مطلب براي اين وبلاگ بنويسم. شايد شما هم تا حالا در اكثر كنترلهاي vb، ايونتهايي را با پيشوند OLE ديدهايد، ولي آيا كاربرد آنها را هم ميدانيد. من خودم هم بلد نبودم، ولي از وقتي ياد گرفتم، ديدم خيلي جالب هستند و خيلي هم به درد ميخورند. اگر در بعضي از نرمافزارها، مثل Windows media player يك فايل را از خارج برنامه به داخل پنجره درگ كنيد، خواهيد ديد كه همان فايل را پخش خواهد كرد. ايونتهاي OLE هم دقيقاً براي اين كار ايجاد شدهاند. خب حالا يك پروژه vb ايجاد كنيد. و داخل فرم، فقط يك ليستباكس قرار دهيد. خاصيت OLEDropMode فرم را به Manual تغيير دهيد. حالا در پنجره كد، كدهاي زير را وارد كنيد: Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) List1.Clear For I = 1 To Data.Files.Count List1.AddItem Data.Files.Item(I) Next End Sub Private Sub List1_Click() Me.Picture = LoadPicture(List1.List(List1.ListIndex)) End Sub حالا برنامه را اجرا كنيد و يك پوشه كه در آن چند تا عكس داريد، باز كنيد و چند تا از عكسها را به داخل برنامهمان درگ كنيد. سپس روي نام آنها در ليستباكس كليك كنيد. جالب بود مگه نه!؟ حالا كد برنامه را بررسي ميكنيم. رويداد OLEDragDrop زماني اجرا ميشود كه كاربر چند فايل را به داخل برنامه درگ كند. پارامتر Data از اين رويداد، فايلهاي درگ شده را به ما برميگرداند. در بالا، ما يك حلقه به تعداد فايلهاي درگ شده ايجاد كرديم و به وسيله آن، نام تمام فايلها را به ليستباكس اضافه كرديم. بقيهاش هم كاملاً واضح است. فقط يادتان باشد كه OLEها تقريباً در تمام كنترلها وجود دارند. براي درك بهتر اين مطلب يك ليستباكس با نام lstFiles و يك دكمه با عنوان &Stop… و با نام cmdStop داخل آن بگذاريد. ويژگي OLEDropMode ليستباكس را به Manual تغيير دهيد. در پنجره كد، كدهاي زير را وارد كنيد: Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long Private Const SND_ASYNC = &H1 ' play asynchronously Private Sub cmdStop_Click() sndPlaySound " ", SND_ASYNC End Sub Private Sub LstFiles_Click() sndPlaySound LstFiles.List(LstFiles.ListIndex), SND_ASYNC End Sub Private Sub LstFiles_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) LstFiles.Clear For I = 1 To Data.Files.Count LstFiles.AddItem Data.Files.Item(I) Next I End Sub حالا برنامه را اجرا كنيد و چند تا فايل wav (به ياد داشته باشيد كه تابع sndPlaySound فقط فايلهاي wav را ميخواند) به داخل ليستباكس درگ كنيد. حالا اگر روي يكي از فايلها كليك كنيد، آن فايل اجرا ميشود و دكمه stop هم اجراي فايل را متوقف ميكند. كد برنامه هم نيازي به توضيح ندارد؛ اگر يكمي دقت كنيد، متوجه ميشويد كه چكار كردهايم. اميدوارم برايتان مفيد واقع شده باشد. منتظر نظراتتان هم هستم. ضمناً در صورت نظر دادن، به اين سؤال من هم جواب دهيد: به نظر شما نوشتن وبلاگ با زبان محاوره بهتر است يا با زبان معيار؟ خدا نگهدار.
|
||
|
2
نوشته شده در دوشنبه 17 مرداد1384ساعت 14:30 توسط موسي مرادي
|
||
|
|
جواب |
|
|
خدمت امير خان عرض كنم كه من راه استانداردي براي اين كار بلد نيستم، ولي يه راه حلي پيشنهاد كه خودم تا حالا امتحان نكردم، خودت امتحان كن شايد جواب داد. ميدونيم كه استايلهاي ويندوزها (XP يا لانگهورن) در مرحله اول مربوط به theme آنها است. در لانگهورن يه theme جديد به نام plex وجود دارد. شما فايلهاي مربوط به اون رو به xp كپي كن. (الان حضور ذهن ندارم، اگه بگردي ميتوني پوشه مربوط به اونو پيدا كني). در مرحله دوم، ميدونيم كه استايلهاي مربوط به كنترلهاي در دو فايل comctl32.ocx و comctl32.dll قرار دارند. شما اين دو تا فايل رو از پوشه system32 لانگهورن به system32 ايكسپي، كپي كن (البته در حالت safe mode) بعد ريستارت كن. شايد موفق بشي. |
||
|
2
نوشته شده در جمعه 27 خرداد1384ساعت 16:45 توسط موسي مرادي
|
||
|
|
عرض معذرت |
|
|
متأسفانه به علت شروع فصل امتحانات، اين وبلاگ را بعد از پايان امتحانات آپديت خواهم كرد.
منتظر باشيد. |
||
|
2
نوشته شده در شنبه 31 اردیبهشت1384ساعت 10:58 توسط موسي مرادي
|
||
|
|
كار با فايلهاي Resource |
|
|
فايلهاي Resource همانطور كه از نامشان معلوم است، منابعي هستند كه فايلها و اطلاعات ديگر با فرمتهاي مختلف، مورد نياز براي برنامه را در خود جمع ميكنند. كار با اين فايلها در VB بسيار آسان است. فرض كنيد تصويري داريم كه در حين اجراي برنامه ميخواهيم آن را به داخل يك PictureBox، لود كنيم. ابتدا فايل Resource را ايجاد ميكنيم و تصوير را در آن قرار ميدهيم. در منوي Add-ins، به قسمت Add-In Manager… برويد. در داخل ليست، VB 6 Resource Editor را پيدا كرده و انتخاب كنيد. جعبههاي Loaded/UnLoaded و Load on startup را علامت بزنيد. OK را بزنيد. به نوار ابزار استاندارد و همچنين منوي Tools يك آيكن با عكس يك جعبه سبز رنگ و با نام Resource Editor اضافه شده است. آن را بزنيد. يك پنجره كوچك باز خواهد شد. دكمه Add Bitmap… را در اين پنجره بزنيد. فايل تصوير خود را انتخاب كرده و Open كنيد. كليد Save را در اين پنجره فشار دهيد. براي فايل Resource خود يك نام انتخاب كنيد و آن را در مسير پروژهتان ذخيره كنيد. اين پنجره را ببنديد. يك PictureBox و يك دكمه در فرم قرار دهيد و در رويداد Click دكمه بنويسيد: Picture1.Picture = LoadResPicture(101, 0) عدد 101 كد تصوير مورد نظر در فايل Resource است كه در صورتي كه آن را تغيير دادهايد در كد بالا هم تغيير دهيد، و عدد 0 هم مشخص كننده اين است كه شما ميخواهيد يك تصوير را Load كنيد. كار با تصاوير را ياد گرفتيد. اكنون به كار با متنها ميپردازيم. آيكن Resource Editor را كليك كنيد. در اين پنجره، دكمه Edit String Tables… را كليك كنيد. يك پنجره جديد باز خواهد شد. در بالاي جدول، زبان مورد نظر خود را انتخاب كنيد. بر روي خانه خالي روبروي عدد 101 دابلكليك كنيد تا به حالت ويرايش وارد شويد. عبارت مورد نظر خود را وارد كنيد. (مثلاً عبارت «برنامه نمونه كار با رشتهها در فايلهاي منبع») درصورتي كه ميخواهيد عبارتهاي ديگري هم وارد كنيد، Enter را فشار دهيد و در خانه بعدي وارد كنيد. پس از اتمام كار، پنجره را ببنديد و در پنجره بعدي هم تغييرات را ذخيره كنيد و آن را هم ببنديد. يك دكمه ديگر در فرم قرار دهيد و در رويداد Click آن بنويسيد: Me.Caption = LoadResString(101) برنامه را اجرا و امتحان كنيد. به همين روش ميتوانيد Icon و Cursor هم در فايل منبع قرار دهيد و از آن در برنامه استفاده كنيد. با اين تفاويت كه براي Load كردن اين دو، از همان تابع LoadResPicture استفاده خواهيم كرد، ولي براي آرگومان دوم تابع، براي Icon مقدار 1 و براي Cursor، مقدار 2 را قرار خواهيم داد. براي فايلهاي با فرمتهاي ديگر، ميتوانيد از گزينه آخر يعني Add Custome Resource… استفاده كنيد. در اين صورت آنها با تابع LoadResData، قايل لود خواهند بود. موفق باشيد نظر يادتون نره |
||
|
2
نوشته شده در یکشنبه 18 اردیبهشت1384ساعت 17:50 توسط موسي مرادي
|
||
|
|
آموزش ساخت 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 توسط موسي مرادي
|
||
|
|
آموزش ساخت 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 توسط موسي مرادي
|
||
|
|
آموزش ساخت ActiveX Control |
|
|
به عنوان اولين موضوع در اين وبلاگ ميخواهيم در مورد ActiveX Control صحبت كنيم. مقداري مقدمه و بعد شروع! شما تا حالا خيلي با كنترلهاي موجود در vb كار كردهايد مثل CommandButton، Label، PictureBox و همچنين شايد با كنترلهاي خارجي مثل WindowsMwdiaPlayer، Common Dialog Control، Microsoft Windows Common Controls و... كار كرده باشيد، ولي آيا تا به حال از خودتون پرسيديد كه خود اينها چطور درست ميشن؟ شايد فكر كنيد كه براي نوشتن اينها از يك زبان ديگر مثل C و يا چيز ديگري استفاده ميشود و همچنين شايد فكر كنين كه ساختن آنها يك كار سختي است. ولي اين طور نيست، اكثر اين كنترلها را ميشود با خود VB ساخت. نحوة ساخت آنها هم دقيقاً مثل اين است كه يك فرم VB طراحي ميكنيد و شايد هم راحتتر از آن، پس تا پايان اين مقاله با ما همراه باشيد. ميخواهيم يك كنترل ساده بسازيم. اين كنترل يك دكمة ساده است كه هنگام فشرده شدن رنگ خود را عوض ميكند و پس از رها شدن دكمه ماوس توسط كاربر به رنگ اوليه خود بازميگردد. پنجره VB را باز كنيد و از پنجره محاوره New Project گزينه ActiveX Control را برگزينيد. يك صفحة خالي، دقيقاً مثل فرمهاي VB خواهيد ديد. اين پنجره، همان كنترل ما است. پروژه را ذخيره كنيد. حتمآ ديدهايد كه هنگامي كه يك كنترل را در روي فرم ميگذاريد، در پنجرة Properties در سمت چپ پنجره اصلي VB، ويژگيهاي آن كنترل ديده ميشوند و بعضي از آنها قابل تغيير هستند و بعضي نيستند، همچنين انواع مختلفي دارند، بعضي عددي هستند، بعضيها True – False هستند، بعضيها تصوير قبول ميكنند و ... . ما هم در هنگام طراحي كنترل، بايد تعدادي ويژگي يا Property براي آن تعريف كنيم، مثلاً رنگ زمينه در حالت معمولي، رنگ زمنيه در حالت فشرده شدن و ... . خود VB خيلي از Propertyهاي مورد نياز و ضروري را (مثل Name) به طور پيشفرض براي كنترل ما قرار ميدهد. براي ديدن كنترلي كه ميسازيد، ميتوانيد مانند حالت عادي از كليد F5 و يا گزينة Start از منوي Run استفاده كنيد، در اين صورت كنترل در يك پنجره Internet Explorerديده خواهد شد؛ ولي اگر بخواهيد به طور كلي آزمايش كنيد، مثلاً Propertyهاي آن را ببينيد، بايد فايل OCX بسازيد. اكنون اين عمل را بر روي كنترلي كه ساختيم انجام ميدهيم: از منوي File گزينه Make YourContrl.ocx… را انتخاب كنيد. مسير مورد نظر را انتخاب كنيد. (بهتر است يك پوشه جديد ايجاد كنيد و كنترل OCX را در آن ايجاد كنيد.) ميتوانيد با زدن كليد Options… تنظيمات بيشتري انجام دهيد. نام مورد نظر را انتخاب كرده و OK را بزنيد. كنترل مورد نظر ساخته ميشود. اكنون يك vb جديد باز كنيد و از پنجره New Project، Standard EXE را انتخاب كنيد. بر روي يكي از كنترلهاي ToolBox راستكليك كنيد و گزينة Components… را انتخاب كنيد. (ميتوانيد كليدهاي Ctrl+T را فشار دهيد.) كليد Browse… را بزنيد و مسيري كه در آن كنترل را ساختيد، باز كنيد و كنترل خود را انتخاب كرده و Open كنيد. كنترل شما به ليست اضافه خواهد شد. (احتمالاً با نام Project1). آن را تيك زده و OK كنيد. يك كنترل با عكس يك قلم به كنترلهاي موجود اضافه خواهد شد. اين كنترل، همان كنترل ما است. (در صورت Load نشدن كنترل، دوباره به Components… رفته و گزينههاي Project1 ديگر را امتحان كنيد. بعدآً نام آن را عوض خواهيم كرد.) كنترل جديد را روي فرم بگذاريد، اين كنترل بيرنگ و بياسم و بينشان، همان كنترل ما است كه Propertyهايي كه VB به صورت اتوماتيك براي آن گذاشته است در پنجره Properties قابل رؤيت هستند. اكنون اين پنجره را بسته و به پنجره طراحي كنترل خودمان بازگرديد. برنامهنويسي را شروع ميكنيم. ميخواهيم دكمه ما در حالت عادي سبز باشد و در حالت فشرده شدن، قرمز شود. روي پنجره كليد F7 را فشار دهيد تا پنجره كد باز شود. رويداد Initialize به طور پيشفرض ظاهر خواهد شد. اين رويداد هنگامي اجرا ميشود كه كاربر، كنترل ما را در روي فرم خود قرار دهد. در داخل اين Event (رويداد) كد زير را بنويسيد: UserControl.BackColor = vbGreen همانطور كه ميدانيد، اين كد رنگ زمينه را به رنگ سبز درميآورد. پنجره كد را ببنديد و با زدن كليد F5 برنامه را اجرا كنيد. در صورت ظاهر شدن پنجره محاوره Project1-Project Properties، كليد OK را فشار دهيد. كنترل را به رنگ سبز در IE خواهيد ديد. IE را ببنديد و همچنين دكمه End را نيز بزنيد. در هنگام فشرده شدن نيز بايد رنگ زمينه قرمز شود، پس پنجره كد را باز كنيد و در رويداد MouseDown كد زير را بنويسيد: UserControl.BackColor = vbRed هنگام رها كردن دكمة ماوس نيز بايد رنگ مورد نظر، دوباره سبز شود، پس در رويداد MouseUp كد زيرا را بنويسيد: UserControl.BackColor = vbGreen برنامه را اجرا كرده و امتحان كنيد. در صورتي كه فايل OCX را بسازيد و از آن در يك برنامه استفاده كنيد، در ليست رويدادهاي كنترل، رويدادهاي كمي خواهيد ديد و مثلاً رويداد مهم Click را نخواهيد ديد. براي قرار دادن اين كنترل بايد آن را تعريف كنيم. ميتوانيم اين كار را به طور دستي انجام دهيم ولي يك كار راحتتر نيز وجود دارد. از منوي Project گزينة Add UserControl را انتخاب كنيد. آيكن VB ActiveX Control Interface Wizard را انتخاب كرده و Open كنيد. يك ويزارد باز خواهد شد. از اين ويزارد براي تعريف ويژگيها و رويدادها و همچنين متدها به طور اتوماتيكوار و بدون نياز به برنامهنويسي استفاده ميشود. در صورتي كه در طراحي ActiveX حرفهاي شويد ميتوانيد با برنامهنويسي ويژگيها و بقيه را تعريف كنيد. كليد Next را فشار دهيد. گزينههاي سمت چپ، موارد تعريف شده در VB هستند و گزينههاي سمت راست، مواردي هستند كه پس از پايان ويزارد در كنترل ما قرار خواهند گرفت. تمام آنها را برگردانيد. (كليد << را فشار دهيد تا كادر سمت راست خالي شود، البته در صورتي كه قبلاً مواردي را تعريف كرده باشيم، فقط آنها در اين ليست خواهند بود. در آن موقع، با آنها كاري نداتشه باشيد). از كادر سمت چپ، Click را پيدا كرده و كليد Add (>) را بزنيد. Click به ليست سمت چپ اضافه خواهد شد. Next را بزنيد. يك ليست خالي ديگر خواهيد ديد. اين صفحه از ويزارد براي تعريف مواردي است كه در صفحه قبلي وجود نداشت. حالا با آن كاري نداريم. Next را بزنيد. در اين صفحه در كادر سمت چپ، مواردي كه انتخاب و يا تعريف كردهايم ديده ميشوند. Click را انتخاب كنيد. از منوي پايينافتادني Control، گزينه UserControl را انتخاب كنيد. در منوي پايينافتادني زير آن نيز گزينه click را انتخاب كنيد. با اين كار ما به VB گفتيم كه هنگامي رويداد Click اجرا ميشود كه كاربر روي كنترل ما (UserControl) كليك كند. Next را بزنيد. در اين صفحه تيك View Summary Report را برداريد، و Finish را كليك كنيد. پنجره كد را باز كنيد. تغييراتي خواهيد ديد. اينها همان كدهايي هستند كه ما بايد خودمان مينوشتيم. البته در تعريف رويدادها، اين كدها كم هستند، ولي هنگام تعريف Propertyها خواهيد ديد كه چقدر زيادند. حالا ميتوانيد فايل OCX را دوباره بسازيد و از آن استفاده كنيد. براي تغيير نام كنترل و همچنين پروژه، از منوي Project، زيرمنوي Project1 Properties… را انتخاب كنيد. در برگه General در كادر Project Name: نام مورد نظرتان را (مثلاً MyButton) وارد كرده و OK كنيد. در ادامه مقاله چندين Property و Event به كنترل خودمان اضافه خواهيم كرد.
|
||
|
2
نوشته شده در یکشنبه 4 اردیبهشت1384ساعت 17:47 توسط موسي مرادي
|
||
|
|
سلام |
|
|
هدف بنده از نوشتن اين وبلاگ، آموزش برنامهنويسي به زبان VB است البته در زمينههاي ديگري نيز صحبت خواهيم كرد. فرض ما بر اين است كه شما آشنايي مقدماتي با اين زبان داريد. ضمناً از همين ابتدا اگر پيشنهاد يا نظري داريد، مطرح كنيد. خوشحال ميشويم. در صورتي كه سؤالاتي در مورد برنامهنويسي داشتيد، بپرسيد. در حد وسعتم جواب خواهم داد. |
||
|
2
نوشته شده در یکشنبه 4 اردیبهشت1384ساعت 17:29 توسط موسي مرادي
|
||