تبليغات
تبلیغات در دانشجو کلوب محک :: موسسه خيريه حمايت از کودکان مبتلا به سرطان ::
جستجوگر انجمن.براي جستجوي مطالب دانشجو کلوپ مي توانيد استفاده کنيد 
برای بروز رسانی تاپیک کلیک کنید
 
امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5

ویژوال استودیو

نویسنده پیام
  • senior engineer
    آفلاین
  • مدیرکل  سایت
    *******
  • ارسال‌ها: 16,405
  • تاریخ عضویت: مرداد ۱۳۹۰
  • اعتبار: 587
  • تحصیلات:لیسانس
  • علایق:نگاه کردن توی چشم...
  • محل سکونت:خونمون
  • سپاس ها 40812
    سپاس شده 37095 بار در 12451 ارسال
  • امتیاز کاربر: 1,035,949$
  • حالت من:حالت من
ارسال: #1
ویژوال استودیو
ویژوال استودیو
ویژوال استدیو نام مجموعهٔ (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ها طوری طراحی شدن که به ما این امکان رو میدن که بتونیم یک سری رخداد رو در یک تابع که خودمون طراحی کردیم کنترول کنیم براتون یک مثال از یکی از موارد بالا میزنم
به مثال زیر توجه کنید که از سایت http://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)
سلام خدمت همه ی عزیزان
من دوباره اومدم...تازه تر از همیشه...
بازم در خدمتتونمKhansariha (214)

۲۱-۱۰-۱۳۹۰ ۰۲:۱۹ عصر
جستجو یافتن همه ارسال های کاربر اهدا امتیازاهدای امتیاز به کاربر پاسخ پاسخ با نقل قول
 سپاس شده توسط ღمژگانღ

برای بروز رسانی تاپیک کلیک کنید


پرش به انجمن:

کاربرانِ درحال بازدید از این موضوع: 1 مهمان