بیشترتوضیحاتافزودن یادداشت جدید
ويژوال استوديو ويژوال استديو نام مجموعه? (Suite) برنامهنويسي شزکت مايکروسافت است که داراي چند زبان برنامهنويسي است. اين مجموعه ويژوال سي و ويژوال بيسيک و ويژوال فاکسپرو و چند ابزار ديگر را درون خود جاي دادهاست. چکيده نرم افزار Visual Studio ، نرم افزاري توسعه يافته براي برنامه نويسان کامپيوتر است که توسط شرکت نرم افزاري MicroSoft توليد شده است . تمرکز اصلي اين نرم افزار از اولين نسخه هاي آن تا کنون بر روي خصوصيت IDE بودن آن است که به برنامه نويس اجازه ميدهد تا برنامه هاي کاربردي مستقل ، وب سايت ، برنامه هاي کاربردي وب و يا سرويس هاي وب را که بر روي تعدادي از PlatForm هاي پشتيباني شده توسط Microsoft .NET Framework ( البته براي تمام نسخه هاي بعد از ويژوال استوديو 6 ) همچنين Platform هايي مانند Microsoft Windows servers and workstations, PocketPC Smartphones و World Wide Web browsers اجرا ميشوند را براحتي ايجاد نمايد . مقدمه Visual Studio يک مجموعه از برنامه هايي است که ارتباط بسيار نزديک با هم دارند که مايکروسافت آن را به توسعه دهندگان و برنامه نويسان برنامه هاي کاربردي اهدا نمود تا آنها را وادار نمايد در محيطي توسعه يافته بر روي پلت فرم هاي ويندوز و دات نت به ساخت برنامه هاي خود بپردازند . Visual Studio مي تواند براي نوشتن برنامه هاي کنسولي ، ويندوزي ، سرويس هاي ويندوز ، برنامه هاي کاربردي موبايل ، برنامه هاي کاربردي ASP.NET و سرويسهاي وب ASP.NET بنا به انتخاب شما همراه با زبانهايي مانند C++, C#, VB.NET, J# استفاده شود . با Visual Studio واقعا چه کارهايي ميتوان انجام داد ؟ در زير تعدادي از کاربردهايي را که براي توليد آنها ميتوان از Visual Studio استفاده نمود معرفي گرديده اند : Console applications : اين کاربرد براي اجراي خطوط دستور البته بدون محيط گرافيکي استفاده ميشود که از اين کاربرد براي برخي از ابزارهاي کوچک يا براي اجرا شدن کدها توسط ديگر کاربردها استفاده ميشود . Windows forms applications : براي برنامه هاي کاربردي ويندوزي که با استفاده از .NET frameworkنوشته ميشوند . Windows services : سرويس ها برنامه هاي کاربردي هستند که در پس زمينه ويندوز اجرا ميشوند . ASP.NET applications : ASP.NET يک تکنولوژي قدرتمند که براي طراحي و ساخت صفحات وب پويا استفاده ميشود . ASP.NET web services : ASP.NET مدل سرويسهاي وب را بطور کامل فراهم نموده تا شما براحتي و با سرعت سرويسهاي وب را توليد نماييد . Windows Mobile applications : که ميتواند بر روي ابزارهايي که شامل framework هستند مانند Pocket PC ها و همچنين cell phones هايي که پلت فرم Microsoft Smartphone بر روي آنها اجرا ميشود ، اجرا گردد . MFC/ATL/Win32 applications : شما همچنان ميتوانيد برنامه هاي سنتي MFC ، ATL يا برنامه هاي Win32را با استفاده از C++ ايجاد نماييد . اين برنامه هاي براي اجرا به .NET Framework نياز ندارند اما نمي توانند از مزاياي .Net framework نيز بهره اي ببرند . Visual Studio add-ins : شما ميتوانيد از خود ويژوال استوديو براي ساخت توابعي جديد و قابل اضافه شدن به خود ويژوال استوديو استفاده نماييد . کاربردهاي ديگر : ويژوال لستوديو همچنين شامل پروژه هايي براي توسعه برنامه هاي کاربردي شما ، کار با databases ، ساخت گزارشها و ... ميباشد . تاريخچه و معرفي ويژگي هاي مهم هر يک از نسخه هاي Visual Studio Visual Studio 97 بيش از ده سال از توزيع نسخه اول ويژوال استوديو ميگذرد. اولين نسخه از اين نرمافزار سال 1997 به بازار آمد و به نام Visual Studio 97 مشهور شد. براي اولينبار برنامهاي درست شد كه تعداد زيادي ابزار برنامهنويسي را در خود جا داده بود و برنامههايي مانند: Visual Basic 5.0 - Visual C++ 5.0 - Visual J++ 1.1 - Visual FoxPro 5.0 - Visual InterDev را شامل ميشد. کاربرد هر يک از زبانهاي بالا در زير آورده شده است : Visual Basic 5.0 and Visual C++ 5.0 براي برنامه نويسي تحت ويندوز Visual J++ 1.1 برنامه نويسي با Syntax هاي جاوا Visual FoxPro 5.0 براي برنامه نويسي xBase (dBASE) Visual InterDev براي توليد صفحات ديناميکي وب سايت ها با استفاده از Active Server Pages Visual SourceSafe : بخشي از مجموعه? ويژوال استديو شرکت مايکروسافت که براي انجام عمليات کنترل سرس طراحي شدهاست. اين برنامه? اختياري در صورت نصب، قابليت کنترل و پيگيري ورژنهاي مختلف کد را به برنامهنويس ميدهد که براي برنامههاي پيچيده و به خصوص با چند برنامهنويس قابليتي حياتي است. ويژوال سي مجموعه? به هم پيوستهاي است که تمامي زنجيره? ابزار توسعه? برنامه را يکجا گرد آورده. زنجيره? ابزار فوقالذکر شامل ويرايشگر، کامپايلر، لينکر، ابزار ميک، ديباگر و اسمبلر مخصوص ويژوال سي ميباشد که هريک علاوه بر داشتن خواص برنامههاي قديميتر، داراي قابليتهاي منحصر به فردي هم ميباشند . محيط Visual C++بخشي از مجموعهاي بزرگتر به نام Microsoft Visual Studio است . نسخه 97 همچنين MicroSoft Developer Network library يا MSDN که راهنماي کامل برنامه هاي Visual Studio مايکروسافت است را معرفي نمود . در97 Visual Studio ابزارهاي Visual C++, Visual J++, InterDev, MSDN Library همگي از يک محيط استفاده ميکردند که Developer Studio خوانده مي شد و Visual Basic and Visual FoxPro نيز از محيط هاي جداگانه اي استفاده ميکردند . ويژوال استوديو 97 در دو نسخه Professional و Enterprise ارائه گرديد . اين نسخه از ويژوال استوديو، اولين تلاش شركت مايكروسافت در توليد محيط توليد نرمافزاري براي ساختن برنامههايي با زبانهاي متفاوت بود. ( توسعه محيط چند زبانه ) اين محصول مايكروسافت در آن سالها تقريباً، جوابگوي همه نوع سليقهاي بود و برنامهنويسان زيادي را به سوي خود كشيد . Visual Studio 98 يا 6 يك سال پس از ارائه نسخه Visual Studio 97 (يعني در سال 98 )، نسخه 6 Visual Studio بعنوان آخرين نسخه اي که ميتوانست در پلتفرم Win9x اجرا شود ، به بازارعرضه شد . از سال 98 تا سال 2002 مايکروسافت نسخه جديدي از ويژوال استوديو را معرفي نکرد و ورژن تمام فايل هاي داخلي (File Format Internal) آن طي اين 4 سال به ورژن 6 ارتقاء يافت که بهمين دليل Visual Studio 98 را با نام Visual Studio 6 نام گذاري نمودند . اين آخرين نسخه اي بود که شامل ويژوال بيسيک معروف و دوست داشتني و ويژوال J++ بود . نسخه هاي بعدي ويژوال بيسيک کاملا متفاوت از نسخه کلاسيک آن شدند و جزء زبانهاي دات نتي قرار گرفتند . اگر چه هدف دراز مدت مايکروسافت متحد کردن ابزارهاي برنامه نويسي تحت يک محيط واحد بود و لي در حقيقت اين نسخه نسبت به نسخه ويژوال استاديو 97 ، چند محيط اضافه تر نيز داشت . Visual J++ و Visual InterDev از محيط Visual C++ جدا شدند در حالي که Visual Basic و Visual FoxPro نيز همچنان مانند نسخه قبلي در محيط هاي جدا بودند . تاريخچه ويژوال بيسيک ويژوال بيسيک توسعه يافته basic مي باشد. basic توسط پروفسور john kemency وthomas kurtsازکالج dartmouth براي نوشتن برنامه هاي ساده ايجادشدواين طراحي ازاواسط دهه???? آغازگرديد.هدف از بيسيک اوليه آموزش برنامه نويسي بود.بيسيک توسط انواع متفاوتي ازکامپيوترهامورداستفاده قرار گرفت وسرمشق سايرزبانهاشد.باتوسعه گرافيکي کاربر (gui)توسط ميکروسافت دراواخر دهه ???? واوايل ????basicتکامل تدريجي خودرابه سوي ويژوال بيسيک انجام داده بودکه توسط گروه مايکروسافت درسال????انجام پذيرفت.درزمانيکه ويژوال بيسيک درمرحله ظهوربود توسعه برنامه هاي کاربردي تحت ويندوز ميکروسافت عملي طاقت فرسابود.باآمدن ويژوال بيسيک ايجادبرنامه هاي کاربردي تحت ويندوز بسيارآسان شد.ازسال????تاکنون شش نوع ازويژوال بيسيک روانه بازار شده است وآخرين نمونه آن ويژوال بيسيک? مي باشدکه درسپتامبر????روانه بازارگرديده است. ويژوال بيسيک چيست؟ ويژوال بيسيک زبان برنامه نويسي ميکروسافت ويندوز است.برنامه هاي ويژوال بيسيک درمحيط توسعه يافته مجتمع(IDE)طراحي وساخته مي شوند.IDEبه برنامه نويس اين اجازه رامي دهدکه برنامه هاي خودرابه صورت مناسب وراحت ايجاد،اجراوخطايابي کند.(پردازش مربوط به توليدسريع يک نرم افزارکاربردي رااغلب radمي نامند.)ويژوال بيسيک يکي اززبانهاي radبوده وبه طوروسيعي در دنيامورداستفاده ميباشد.ويژوال بيسيک مشتق شده از زبان برنامه نويسي بيسيک است .ويژوال بيسيک خصيصه هاي متمايزکننده تري نسبت به سايرزبانهاي برنامه نويسي داردمانندواسط گرافيکي کاربر-event handling ودسترسي به win?? api ،ويژگيهاي شي گرا،رسيدگي به خطابرنامه نويسي ساخت يافته وساير موارد. محيطIDE ويژوال بيسيک اين امکان رابه برنامه نويس مي دهد که بدون خبره بودن دربرنامه نويسي تحت ويندوز،برنامه هاي تحت ويندوزايجادنمايد.ميکروسافت چندنوع متفاوت ويژوال بيسيک خود رابه بازار عرضه کرده است که به نامهايprofessional enterprise edition ، learning edition دردسترس هستند.نوع learning edition ياآموزشي قابليت برنامه نويسي درحدپايه راارايه مي کندونوع professional edition نسبت به نوع آموزشي ازتوانايي بالاتري برخورداراست و توسط بسياري از برنامه نويساني که برنامه هاي کاربردي باويژوال بيسيک مي نويسند مورداستفاده قرارمي گيرد.ازنوعenterprise edition براي ايجادسيستمهاي محاسباتي باحجم بالا استفاده مي شود.ويژوال بيسيک يک زبان مفسر است بااين وجود نوعهايenterpriseوprofessional مي توانند کدهاي ويژوال بيسيک رابه native codeکامپايل نمايند. آنچه که براي نصب ويژوال بيسيک نيازاست براي نصب ويژوال بيسيک نيازبه نرم افزاروسخت افزارزيراست: - ويندوز(??،??،???) - کامپيوتر???ياترجيحاپنتيوم باحداقل ??مگابايتRAM - CDوماوس - ديسک سخت راه اندازي ويژوال بيسيک برنامه ويژوال بيسيک برروي CDذخيره شده است که براي استفاده ازآن بايدآن رادرديسک سخت نصب کنيد. درمحيط ويندوز،برنامهINSTALLراازروي CD اجراکنيدتا ويژوال بيسيک درمنويprogramsويندوزظاهرشود.براي اجراي آن برروي گزينه مربوط کليک کنيدتاصفحه اول ويژوال بيسيک مانند شکل ظاهرشود.دراين شکل مي توانيدکارهاي موردنظرتان راشروع کنيد.سيستم به طورخودکاربرروي آيکن standard exe داردکه براي ايجاد پروژه هاي ويژوال بيسيک به کارمي رود.براي ادامه کارکليدenterرافشاردهيديادکمهopenرادراين شکل کليک کنيد.در شکل زير پنجره اي به ناForm?ظاهر شده است. فرم محيطي است که در آن مي توانيد برنامه خود را طراحي کنيد.يعني عناصر تشکيل دهنده برنامه در اين فرم قرار مي گيرند.در سمت راست شکل پنجره هاي Project وpropertiesو Form Layout قرار دارند.هر يک از اين پنجره ها را به طور مختصر توضيح مي دهيم. پنجره Project:اين پنجره در شکل زير آمده است اين پنجره را Project Explorer نيز مي نامند و فايلهاي پروژه در آن قرار مي گيرند. در نوار ابزار اين پنجره سه دکمه به نامهاي View CodeوView ObjectوToggle Folder قرار دارند.اگر بر روي View Codeکليک کنيد پنجره اي ظاهر مي شود که مي توانيد دستورات ويژوال بيسيک را درآن بنويسيد.دکمه View Codeفرم را در صفحه نمايش ظاهر مي کند . دکمه هاي View CodeوView Objectدر صورتي فعال هستند که در پنجره projectدر پوشه Formsگزينه Form(Form?)را انتخاب کرده باشيد.با هر بار کليک کردن برروي دکمهToggle Folderپوشه Formsدر پنجره projectمخفي يا آشکار مي گردد.يعني اگر اجزاي اين پوشه مخفي باشند با کليک کردن اين دکمه آشکار مي شوند و اگر آشکار باشند با کليک کردن اين دکمه مخفي مي شوند.همانطور که در شکل مي بينيدنام پروژه جديد project?و نام فرم جديد Form?انتخاب شده است(به طور پيش فرض).پوشه Formsدر پنجره Projectحاوي تمام فرمهاي مربوط به پروژه است در شکل فقط حاوي Form?است. پنجرهproperties اين پنجره خواص مربوط به فرم ياعنصرفرم رانمايش مي دهد.دقت داشته باشيدکه هرعنصر(ازجمله فرم)داراي خواص(properties)ورويداد(event)است که درادامه به شرح هرکدام خواهيم پرداخت.امادراينجامي خواهيم اين نکته رايادآوري کنيم که خواص عناصردرپنجرهpropertiesديده مي شوند.خواص عناصرمي توانند به دوصورت نمايش داده شوند:به صورت الفبايي(alphabetic)وبه صورت دسته بندي شده برحسب موضوع(categorized).به عنوان مثال، براي ديدن خواص فرمي که برروي صفحه نمايش است(يعني form?)،برروي آن درپنجرهpropertiesدکمه راست ماوس راکليک کرده ودرمنويي که ظاهر مي شود گزينهdescriptionراانتخاب کنيد(البته اگر فعلا اين خواص را مشاهده مي کنيد،نيازي به اين کار نيست.)شکل بخشي ازخواصform?رابه صورت دسته بندي شده نمايش مي دهد. هريک از اين خواص رادرادامه خواهيدآموخت. پنجرهformlayout اين پنجره مشخص مي کند که فرم برنامه درزمان اجرا درکجاي صفحه نمايش قرارگيرد.دراين پنجره تصويري قرارداردکه همانندصفحه نمايش است.وقتي ماوس رابه آن تصوير منتقل مي کنيد،علامت آن به صورت دوفلش دوسر متقاطع در مي آيد.دکمه ماوس رابه پايين فشارداده، آن رادرداخل صفحه نمايش به حرکت درآوريد.پس ازاينکه فرم درجاي مناسبي ازصفحه نمايش قرارگرفت،دکمه ماوس رارهاکنيد.درزمان اجرا،فرم در همان نقطه ازصفحه نمايش قرارخواهدگرفت. جعبه ابزار بخش ديگري ازشکل جعبه ابزاراست که درسمت چپ صفحه نمايش وتحت عنوان general قراردارد.اين جعبه ابزار،درواقع،عناصري هستندکه مي توانيدازآنهابراي طراحي برنامه خوداستفاده کنيد.اسامي اين عناصردر شکل آمده است.درادامه مي آموزيدعناصرديگري رابه جعبه ابزاراضافه کنيد.به نظرمي رسدکه معرفي مختصري ازعناصرجعبه ابزارمفيدباشد.درزيربه شرح هرکدام مي پردازيم: Pointer:اين عنصرمي تواندبرروي عناصرموجوددرفرم اثرکندوآنهاراانتخاب نمايد. Label:عنصربرچسب رابه فرم اضافه مي کندکه براي نمايش متنهاي غيرقابل ويرايش مفيداست. Frame:گروهي ازعناصرراايجادمي کند. Checkbox:کادرکنترلي رابه فرم اضافه مي کندکه براي انتخاب گزينه هابه کارمي رود. Hscrollbar:نوارجابجايي افقي رابه فرم اضافه مي کند. Timer:عنصري راايجادمي کندکه درفواصل زماني مختلف وظايفي راانجام مي دهد. Dirlistbox:عنصري براي دستيابي به درايوهاي سيستم. Shape:عنصري براي رسم دايره،مستطيل،مربع وبيضي. Image:عنصري براي نمايش تصوير. نوارابزار:نوارابزارشامل ابزارهايي است که معمولا کارگزينه هاي منوهاراانجام مي دهندولي سرعت دستيابي به آنهازياداست.براي اينکه نام اين ابزارهارايادبگيريم،ماوس رابه هرکدام منتقل کرده، اندکي صبرمي کنيم. اجزاي سازنده برنامه ويژوال بيسيک اولين قدم درايجاديک برنامه،ايجاديک فرم وسپس قراردادن عناصربرروي آن است.عناصررابرحسب نيازمي توان تشخيص داد.اين کارنيازبه تمرين دارد.به طورکلي مي توان گفت که کتابخانه اي ازعناصر در ويژوال بيسيک موجوداست که برنامه هاازاين عناصر ساخته مي شوند،کدهاتوسط ويژوال بيسيک توليدمي گرددولي بعضي ازکدهارانيزبرنامه نويس بايدبنويسد. تقريبادرتمام برنامه هاي ويژوال بيسيک بايدگزينه هايي راازمنوهاانتخاب کرد.مثلابراي ايجاديک پروژه جديدبايدازمنوي file گزينهnew project وسپس گزينهstandard exeراانتخاب کرد.براي اجراي برنامه بايدگزينهstartرا ازمنويrun انتخاب نمود.براي سهولت،اين گزينه هارا به اين صورت معرفي مي کنيم: File/new project/standard exeوrun/run.به عنوان مثال،گزينه file/open project گزينه open project راازمنويfileانتخاب ميکند. محيط ويژوال بيسيک محيط ويژوال بيسيک يکي از محيط هاي توسعه يافته IDE (Integrated Development Environment) مي باشد که به برنامه نويسان ويژوال بيسيک امکان مي دهد برنامه هاي تحت ويندوز خود را بدون نياز به استفاده از برنامه هاي کاربردي ديگر ايجاد اجرا و خطايابي کنند. با اجراي برنامه ويژوال بيسيک شکلي زير نمايان مي شود که به شما اجازه مي دهد تا يکي از انواع برنامه هايي که توسط ويژوال بيسيک قابل طراحي هستند انتخاب کنيد.نوع Standard.Exe که به طور پيش فرض در کادر موجود در زبانه New انتخاب شده است به برنامه نويس امکان مي دهد که برنامه ي اجرايي استاندارد را ايجاد کند. علاوه بر زبانه New دو زبانه ديگر با نام هاي Existing و Recent وجود دارد.زبانه Existing براي بازکردن پروژه اي که از قبل وجود دارد استفاده مي شود. همچنين به وسيله زبانه Recent مي توان ليستي از آخرين پروژه هاي باز شده يا ايجاد شده را نشان را مشاهده نمود. آخرين مورد در اين پنجره کادر محاوره اي در پايين صفحه مي باشد که اگر آن را تيک دار کنيم ديگر نيازي نيست با هر بار اجراي برنامه Visual Basic اين کادر را تاييد کنيم. با انتخاب گزينه هاي پيش فرض يعني Standard.Exe و فشردن کليد Open وارد محيط طراحي Visual Basic مي شود که شکل آن بصورت زير مي باشد. vBنيز مانند ساير برنامه هاي Microsoft داراي اجزاي مختلفي مي باشد که به شرح هر يک از آنها پردازيم. 1) نوار آبي رنگ Title که حاوي نام پروژه به همراه توضيحات مختصر در سمت چپ و سه دکمه Min , Max و Close در سمت راست مي باشد که يقينا شما مشابه آن را بارها ديده ايد. 2) نوار منو که حاوي گزينه هاي مانند File (براي مديرت فايل )، Edit ( انجام ويرايش ) View تنظيم موارد قابل مشاهده روي ميز کار، Project ( مديريت پروژه ها ) و ... مي باشد که به زودي به شرح هر يک از آنها خواهيم پرداخت. 3) در زير نوار منو نوار ابزار استاندارد قرار دارد که براي سهولت و سرعت در امر برنامه نويسي تعبيه شده است و حاوي گزينه هاي مانند Add Standard Exe Project براي اضافه کردن يک پروژه استاندارد، Add Form براي افزودن فرم، Menu Editor ايجاد و ويرايش منوها و ... مي باشد. 4) در سمت چپ پنجره ToolBox قرار دارد که به برنامه نويس امکان مي دهد تا کنترل ها مورد نياز را به برنامه اضافه نموده و از آنها استفاده کند. 5)شما در وسط صفحه پنجره را مشاهده مي کنيد که فرم نام دارد. که شامل يک صفحه مشبّک و با پس زمينه خاکستري رنگ مي باشد. پنجره فرم در اصل ميز کار شما مي باشد که شما مي توانيد کنترلها را به آن اضافه نموده و در هنگام اجرا از آن استفاده نمائيد. نا گفته نماند که پنچره فرم به تنهايي يک پروژه کامل مي باشد به طوري که شما مي توانيد آن را اجراکنيد. براي امتحان مي توانيد کليد F5 را فشار دهيد. 6) در سمت راست قسمت بالا پنجره Project را مشاهده مي کنيد در آن مي توان اجزاي پروژه مانند تعداد فرم ها، ماژول ها و ... را مشاهده نمود اين پنجره داراي سه دکمه به نامهاي View Code ، View Project و Toggle Folders مي باشد که کاربرد آنها به صورت زير است : View Code : پنجره کدنويسي مربوط به پروژه ي فعال را نمايش مي دهد. View Project : شکل ظاهري فرم فعال در پنجره را نشان مي دهد. Toggle Folders : با هر بار فشرده شدن آن پوشه ي Forms به صورت متناوب به نمايش در آمده و پنهان مي شود. 7) پنجره Properties : در پايين پنجره Project قرار دارد و از آن براي تنظيم و تغيير مشخصه ها و خواص مربوط به کنترل ها استفاده مي شود که در آينده به شرح کامل آن خواهيم پرداخت. 8)آخرين پنجره Form Layout نام دارد که مکان نمايش فرم در زمان اجرا را نشان مي دهد و شما با انتخاب و جابه جايي فرم موجود در آن مي توانيد موقعيت فرم را در زمان اجرا تنظيم کنيد. استفاده از حلقه ها در ويژوال بيسيک و انواع آن و کاربرد آنها همونطور که ميدونيد ويندوز بر پايه دريافت و ارسال پيغام هاست يعني اينکه هر عملي که شما در حين کار کردن با سيستم انجام ميديد باعث بوجود آمدن يک يا چند پيغام ميشه و بهمون طريق پيغامها هم باعث انجام شدن اون عمل ميشن اين پيغام ها از بين اشياء عبور ميکنن و به جايي که مقصد اونهاست فرستاده ميشن همچنين اين پيغام ها حاوي اطلاعات خاصي از جمله آدرس فرستنده اونها هستند که مشخص کننده منبع و يا برنامه اي که اون پيغام رو فرستاده هستند اما......اما اين آموزش رو فقط نميخوام به حلقه هايي اختصاص بدم که با پيغام ها سروکار دارند به مثال هاي زير با دقت توجه کنيد: کد: PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc( کد: hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID) کد: EnumChildWindows GetDesktopWindow, AddressOf EnumChildProc, ByVal 0& کد: EnumWindows AddressOf EnumWindowsProc, ByVal 0& کد: EnumFonts Me.hDC, vbNullString, AddressOf EnumFontProc, 0 کد: SetTimer Me.hwnd, 0, 1, AddressOf TimerProc خوب اگه با دقت به همه اونا دقت کنين يک تشابه مشترک در همه اونها ميبينيد و اون استفاده از Keywordي هست با نام AddressOf حالا در پايين ببينيم که اين تيکه کدها در هر يک از خطهاي بالا چه معنيي ميده. ما با کيورد AddressOf در واقع يک آدرس دهي ميکنيم بدين صورت که تمامي اين APIها طوري طراحي شدن که به ما اين امکان رو ميدن که بتونيم يک سري رخداد رو در يک تابع که خودمون طراحي کرديم کنترول کنيم براتون يک مثال از يکي از موارد بالا ميزنم. به مثال زير توجه کنيد که از سايت www.all-api.net گرفتم. اين رو در قسمت کد نويسي فرممون قرار ميديم: کد: Private Sub Form_Load() ....SetTimer Me.hwnd, 0, 1000, AddressOf TimerProc End Sub Private Sub Form_Unload(Cancel As Integer) ....KillTimer Me.hwnd, 0 End Sub و اين قسمت رو هم در يک ماژول قرار ميديم. کد: Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Public Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) Debug.Print "salam" End Sub درست به دو قسمت کد بالا دقت کنيد چون ميخوام اطلاعات پايه رو حول اين مثال بهتون بدم. در قسمت Form_Load ما يک حلقه با استفاده از تابع SetTimer رو ايجاد کرديم. نکته: SetTimer تابعي هست که مثل يک تايمر در ويژوال بيسيک براي ما يک رويداد را در زمانهاي مشخص اجر ميکنه ما تابع رو بصورت زير فراخوني کرديم کد: SetTimer Me.hwnd, 0, 1000, AddressOf TimerProc در کد بالا ما يک تايمر رو ايجاد کرديم که هر 1000 ميلي ثانيه يا 1ثانيه اجرا ميشه . حالا چجوري بايد از اون استفاده کنيم؟ نکته: طريقه ي فراخواني هر يک از اين توابع در حالت کلي با يک ديگر متفاوت است. پس نمي توان قاعده ي خاصي را براي تمامي اين حلقه ها در نظر گرفت. با توجه به اين گفته بايد ساختار تک تک اين گونه حلقه ها را در ذهن به خاطر سپرد.اگر دقت کنيد ما باز هم از کيورد AddressOf استفاده کرديم خوب اين قسمت محلي رو که رويداد قراره در فواصل زماني مشخص اجرا ميکنه يعني ما بايد Procedureي داشته باشيم با نام TimerProc که اين تابع هر يک ثانيه اجرا بشه پس با کيورد AddressOf تابعي (TimerProc) که خودمان طراحي کرديم را آدرس دهي ميکنيم . حالا اين دوتا کد رو با هم مقايسه کنيد: کد: Private Sub Timer1_Timer() Debug.Print "salam" End Sub کد: Public Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) Debug.Print "salam" End Sub تابع اول مربوط به يک شيئ Timer هست که مثلاَ هر يک ثانيه يک بار اجرا ميشه و همه ي شما کما بيش با اون آشنايي داريد. هر دوي اينها يک کار رو انجام ميدن فقط اگر دقت کنيد تابع TimerProc کمي فرق داره (منظور از فرق همون پارامترهايي است که تابع به عنوان ورودي ميگيره که در تابع Timer شيئ تايمر اين پارامترها وجود نداره) خوب اين فرق رو ميتونيم با کاربردهايي که برنامه نويس اين API براي تابع TimerProc لازم دونسته توجيح کنيم يعني در تابع TimerProc ما مقاديري که ميتونيم بدست بياريم يکي هندل شيئي هست که اين تايمر رو ايجاد کرده و آدرس حافظه اي که با هر بار خوندن تابع ميتونيم اونو بدست بياريم که البته اينها اصلا مهم نيستند. چيزي که مهمه اينه که اين تابع هر يک ثانيه يک بار اجرا ميشه و در واقع ما حلقه اي رو ايجاد کرديم که کاربردش اينه که کدهاي درون تابع TimerProc رو اجرا کنه. در پايين ميخوام براتون ساختار تک تک حلقه هايي که هر يک از توابع زير با اونا سروکار دارن رو بهتون نشون بدم: براي تابع EnumChildWindows به اين صورت است: کد: Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long ....EnumChildProc = True End Function براي تابع EnumWindows به اين صورت است: کد: Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean ....EnumWindowsProc = True End Function براي تابع EnumFonts به اين صورت است: کد: Function EnumFontProc(ByVal lplf As Long, ByVal lptm As Long, ByVal dwType As Long, ByVal lpData As Long) As Long ....EnumFontProc = 1 End Function براي تابع SetTimer که توضيحاتش رو قبلا بهتون گفته بودم به اين صورت است: کد: Sub TimerProc(ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) End Sub چند نکته تمامي توابعي که به آنها آدرس دهي کرديم که در واقع قرار است رويدادها در آنجا اتفاق بيفتد يعني توابعي (حلقه هايي) که در بالا معرفي کرديم بايد در يک ماژول تعريف شوند و اين امر به دليلي است که ساختار AddressOf ايجاب ميکند. در حلقه هايي که کار آنها پايان ناپذير است ما براي خارج شدن از حلقه ناگزير به استفاده از تابعي براي اين کار هستيم. براي مثال (حلقه ي TimerProc)و در حلقه هايي که کار آنها پايان پذير است براي خارج شدن از حلقه به تابع خاصي نياز نداريم و به جاي آن ميتوانيم نام حلقه را براي ادامه ي کار برابر (1 يا True) و براي پايان کار برابر(0 يا False) قرار دهيم.خوب دقت کنيد که حلقه هايي رو که ساختارشون رو توضيح دادم حلقه هايي با کاربرد ويژه اند درواقع دو تابع معروف SetWindowLong و SetWindowsHookEx که توضيحي راجع به اونا نشنيديد زير بناي اصلي حلقه ها را تشکيل ميدن و به عبارتي ديگر فقط اين دو تابع ميتوانند حلقه هايي ايجاد کنند که پيغامهاي ارسالي به پنجره ها را کنترل کنند. تابع معروف SetWindowLong اين تابع به کنترول گر پيام معروف هست يعني کارايي که داره فقط در گرفتن پيام هست وهمچنين ميتونه باعث جلوگيري يا عوض شدن يک پيغام قبل از رسيدن به پنجره مذکور باشه طريقه فراخوني اين تابع براي ايجاد حلقه کمي با بقيه تفاوت داره اين فرم کلي خود تابع هست کد: Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long کار کلي اين تابع در واقع ايجاد يک حالت جديد براي يک پنجره است و همچنين ميتونه يک حلقه 32 بيتي در آدرس حافضه اون پنجره آدرس دهي بکنه حالا يکي يکي به توضيح پارامترها ميپردازيم: پارامتر اول hwnd که مشخص کننده هندل پنجره اي هست که قراره روي اون حلقه ي آدرس دهي بشه يا اينکه حالت(Style) جديدي براش در نظر گرفته بشه. پارامتر دوم nIndex که مشخص کننده اين هست که چه اتفاقي براي اون پنجره بيفته يعني اين پارامتر ميتونه مقدارهاي زير رو به خودش اختصاص بده GWL_EXSTYLE GWL_STYLE GWL_WNDPROC GWL_HINSTANCE GWL_ID GWL_USERDATA ...... که ما در اينجا فقط با GWL_WNDPROC کار داريم و قرار دادن GWL_WNDPROC در nIndex بدين معني هست که ما قصد ايجاد يک حلقه 32 بيتي رو در آدرس حافضه پنجره داريم. پارامتر سوم dwNewLong و اما اين پارامتر همونطور هم که از اسمش پيداست بايد آدرس دهي جديد در اون صورت بگيره اما به يک نکته کاملا دقت کنيد که در حلقه هايي که ما با اين تابع ايجاد ميکنيم حلقه صرفا نقش يک رابط را دارد پس در واقع مسير آدرس دهي بطور مجازي عوض ميشود. نکته هايي که قبلا به اونها اشاره کردم رو به خاطر بيارييد در يکي از اونها گفته شد . نقل قول - در حلقه هايي که کار آنها پايان ناپذير است ما براي خارج شدن از حلقه ناگزير به استفاده از تابعي براي اين کار هستيم. براي مثال (حلقه ي TimerProc) و در حلقه هايي که کار آنها پايان پذير است براي خارج شدن از حلقه به تابع خاصي نياز نداريم و به جاي آن ميتوانيم نام حلقه را براي ادامه ي کار برابر (1 يا True) و براي پايان کار برابر(0 يا False) قرار دهيم. با توجه به نکته بالا و کاربردي که اين حلقه دارد يعني دريافت پيغام هاي ارسالي به پنجره مذکور در واقع اين کار (دريافت پيغامها) تا آخر ادامه دارد پس براي اينکه از حلقه خارج شويم يا بخواهيم برنامه اي را که حلقه در آن قرار دارد ببنديم بايد از يک تابع کمکي براي خارج شدن از حلقه استفاده کنيم يه مثال از کاربرد اين تابع ميزنم و حول همين مثال هم جلو ميرم فرض کنيد يک حلقه روي يک TextBox که در فرم اصلي مون قرار داره ايجاد کنيم که وقتي ما از چرخک بالا و پايين موس(Wheel Down-Wheel UP) که در ويژوال بيسيک به طور مستقيم قابل دسترس نيست استفاده کنيم اين حلقه آن را تشخيص دهد و به صورتي خاص آن را به ما نمايش دهد البته اين مثال حول قسمت کدنويسي راحتتر قابل درک خواهد بود. خوب بازم مثل موارد قبل ما شروع به ايجاد حلقه مون ميکنيم. با استفاده از خط زير: کد: OldProc = SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf TextBoxProc) در خط بالا ما مسيري رو که پيغام ها از اون به TextBox مي رسن رو رديابي کرديم(البته به صورت مجازي) و ميتونيم بفهميم که چه پيغام هايي به حلقه ما فرستاده ميشه.خوب بازم يک تابع براي حلقه خودمون در نظر گرفتيم که در اينجا TextBoxProc نام داره که پيغام ها به اونجا هدايت ميشن.اما اگر دقت کنيد تابعي که در خط بالا فراخوني شده يک مقدار بازگشتي هم داره که اونو در متغير OldProc ذخيره کرديم در واقع اين مقدار آدرس پيش فرض قبلي براي درگاه پيغام هاست که زماني بدرد ميخوره که ما بخواييم از حلقه خودمون خارج بشيم و با دادن آدرس قبلي مسير عبور پيغامها رو به روال خودش برميگردونيم بزاريد به زبان خيلي ساده اينجوري توضيح بدم که ما با ايجاد اين حلقه يک درگاه در مسير پيغام ايجاد ميکنيم که پيغام رو مجبور به رد شدن از اون مسيري ميکنيم که خودمون خواستيم حالا اگر بخواييم مسيير رو به حالت قبلي برگردونيم بايد از آدرسي که در متغير OldProc ذخيره شده استفاده کنيم. اما در قسمت حلقه مون ببينيم که چه چيزايي داريم: کد: Public Function TextBoxProc(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If wMsg = WM_MOUSEWHEEL Then Form1.Text1 = IIf(wParam < 0, "Wheel Down", "Wheel UP") End If TextBoxProc = CallWindowProc(OldProc, wHwnd, wMsg, wParam, lParam) End Function در خطي که ما از شرط If استفاده کرديم منظور اينه که اگه از Mouse Wheel استفاده شد يک سري عمليات رو انجام بده.اون عمليات اينه که ما از Wheel Down استفاده ميکنيم يا از Wheel UP که اونم بسيار روشنه که چگونه تشخيص داده شده.در خط يکي مانده به آخر ما از يک تابع استفاده کرديم با نام CallWindowProc که بسيار نقش مهمي رو در اين حلقه بازي ميکنه در واقع وظيفه اين تابع اينه که پيغامي رو که توسط اين درگاه دريافت شده به مقصد بفرسته که اگه اين تابع موجود نباشه پيغام مذکور هيچ گاه به مقصد نميرسه و البته يک استثناهايي هست مثلا ميشود با دستور End Function در حلقه مان از رسيدن يک پيغام خاص به پنجره حلقه گذاري شده جلوگيري کنيم اما اين کار زماني امکان پذير است که تعداد پيغام هايي که فيلتر ميشوند زياد نباشد و در صورت زياد شدن يا کلي شدن فلتر پيغام ها برنامه بسرعت قفل ميکنه و در اکثر موارد بسته هم ميشه. خوب آخرين مرحله اي که باقي مونده اينه که بتونيم از حلقه خارج بشيم.همون طور که گفتم براي رهايي از حلقه ايجاد شده و برگردوندن مسير قبلي که مسير طي ميکرد بايد با استفاده از يک تابع مسير رو عوض کرد و مطمئنا بعد از اين کار حلقه اي هم وجود نخواهد داشت و اصولا از بين رفته محسوب ميشود براي اين کار ما از همان تابع قبلي استفاده ميکنيم به اين صورت: کد: SetWindowLong Text1.hWnd, GWL_WNDPROC, OldProc همون جور که ميبينيد ما در قسمتي که آدرس دهي انجام ميداديم آدرس قبلي رو وارد کرديم با اين کار حلقه خود به خود از بين ميرود. البته آموزش ايجاد حلقه ها با استفاده از SetWindowsHookEx هم موند براي سري بعد براي تمامي حلقه ها يک پروژه آماده کردم که ميتونيد آموزش ها رو با توجه به اونها طي کنيد در ضمن براي تابع SetWindowLong هم دو مثال گذاشتم که مثال (SetWindowLong(Hook TextBox هموني هست که راجع بهش توضيح دادم اما مثال ديگه اي که براي اين تابع آوردم يک برنامه دريافت کننده و يک برنامه فرستنده پيام هست که ابتدا هر دو رو کمپايل کنيد و بعد اونها رو اجرا و استفاده کنيد(البته اين مثال رو قبلا زده بودم که فک کنم پاک شد) EnumChildWindows EnumFonts EnumWindows SetTimer SetWindowLong(Hook TextBox) SetWindowLong(Sender & Reciever)