PDA

نسخه کامل مشاهده نسخه کامل : آموزش گام به گام Vb.net



anvar.net
25-06-2007, 00:22
با نام و یاد خدابعد از حدود یک ماهی که من عضو این انجمن هستم, با مجموعه سوال و جوابهای زیادی درگیر بودم که از طرف خودم یا سایر دوستان مطرح میشدند. ارتباط روزمره یا این انجمن مرا بر آن داشت تا با توجه به بضاعت علمی و زمانی خودم شروع به نگارش مجموعه مقالات سلسله واری برای افراد مبتدی کنم. مجموعه یاداشتهایی که بعد از 3 سال کار با Vb.net در اختیار داشتم, نیاز به بازنگریهایی دارد و همین انگیزه مرا واداشت تا تجربیات خودم را برای کسانی که تازه قصد ورود به دنیای برنامه نویسی را دارند به نگارش درآورم. این مقالات اموزشی را با توجه به فرصت آزاد خود به مرور در این تایپیک مطرح میکنم و انتظار دارم دوستان همراهی و همکاری لازم را داشته باشند.در ضمن چون بنده روی vb7 کار میکنم ممکنه تا حدودی برای دوستانی که با vb8 کار میکنند عجیب به نظر برسند در اینجا از همه آنها پوزش میخواهم و امیدوارم خودشون مسائل رو تحلیل کنند...........سرفصلهای مورد بحث در این مقالات :1) - مقدمه ای بر دات نت فریم ورک و ویژوال بیسیک2) - آشنایی با متغییرها و عملگرها3) - کلاس, متد و روال4) - ساختمان داده و آرایه ها 5) - ساختارهای تکرار و انتخاب6) - برنامه نویسی شیء گرا7) - دیباگ و استثناء8) - کار با رشته ها 9) - توابع10) - گرافیک11) - فایل12) - XML 13) - برنامه نویسی بانکهای اطلاعاتیو ..........................................در ضمن هدف طراحی و توسعه برنامه های تحت ویندوز است و از بحث در مورد وب خودداری میکنیم.

_H2_
25-06-2007, 12:21
سلام
هی گفتم پست بدم یا نه؟؟؟!!!! تاپیکتان را خراب نمیکند؟؟؟!!! بالاخره گفتم شاید اگر پست را بدهم بدانید که ما هم خوشحالیم و با ذوق و شوق و انگیزه بیشتری به کارتان ادامه دهید! :31:
دستتان درد نکند و موفق باشید، ولی دیگر بهتر است به جای مقاله بگویید، کتاب!!! :31:

anvar.net
26-06-2007, 11:08
برای شناخت بیشتر ویژوال بیسیک دات نت باید آشنایی مختصری با پدربزرگ آن یعنی Basic داشته باشیم, زبان بیسیک در اوایل دهه 60 میلادی (1963) توسط پروفسور John kemeny یکی از اساتید کالج Dartmouth برای ایجاد بستری مناسب برای آموزش ساده برنامه نویسی برای افراد میتدی طراحی شد و همانطور هم که از نام آن میتوان فهمید, ایتدایی بودن (سادگی) یکی از صفات بارز آن بود.
در سال 1975 بعد از انقلابی که با ساختن Microchip ایجاد شد, فکر داشتن یک کامپیوتر برای هر شخص در ذهن بیل گیتس ایجاد شد, وی و پل آلن دوست صمیمیش نسخه ای جدید از Basic را برای کامپیوترهای شخصی ایجاد کردند. بیسیک سالهای زیادی را همچنان ساده طی کرد و نسخه های متفاوتی را به خود گرفت تا اینکه در مارچ 1988 Alan Cooper پدر ویژوال بیسیک پوسته اولیه drag-and-drop را طراحی کرد و آنرا که Tripod نامیده میشد به بیل گیتس نشان داد. مایکروسافت برای خرید این مفهوم شروع به مذاکرات کرد و انرا خرید و نام یاقوت سرخ Ruby را به آن داد. در سال 1991 مایکروسافت QBasic و Ruby را با هم تلفیق کرد و نام تندر Thunder را بر آن گذاشت. نتیجه این تلفیق محیطی بود که براحتی میشد برای ویندوز با استفاده از drag-and-drop و کد نویسی برنامه ایجاد کرد این تولد ویژوال بیسیک بود, در سال 1992 نسخه 2 ویژوال بیسیک روانه بازار شد در این نسخه دسترسی سطح 1 برای ODBC , فرمهای MDI و متغیرهای Object به ویژوال بیسیک راه یافتند. در ژوئن سال 1993 نسخه شماره 3 ویژوال بیسیک شروع بکار کرد در این نسخه موتور اکسس (Jet), OLE, DAO و تکنولوژی ایجاد گزارش راه یافتند. در اکتبر 1996 برای اولین بار به کاربر اجازه ساخت Add-ins داده شد در همین نسخه 4 بود که کلاس و OCX راه را به ویژوال بیسیک باز کردند. در آوریل 1997 نسخه 5 روانه بازار شد در این نسخه راه برای نوشتن ActiveX باز شد. یکسال بعد یعنی 1998 نسخه 6 ویژوال بیسیک که کاملا قدرتمند بود وارد دنیای برنامه نویسی شد. این نسخه قابلیت طراحی صفحات وب را همراه خود آورد و در دسترسی به منابع داده راه را هموار نمود. در سال 2002 اولین نسخه ویژوال بیسیک دات نت و در سال بعد دات نت 2003 منتشر شد. 2 سال بعد نسخه نهایی vb.net یعنی 8 وارد بازار شد.
نگاهی به تاریخچه vb حاکی از آن است که ویژوال بیسیک در طول این 16 سال همواره در پی ایجاد بسترهای جدید و راحتر بوده است بطوریکه شعار vb.net همواره ساده بودن و در عین حال قدرتمند بودن است.

anvar.net
26-06-2007, 11:13
اساسا وظیفه این چهارچوب کاری Framework مدیریت و اجرای برنامه های کاربردی و سرویسهای وب است. دات نت فریم ورک خود از دو قسمت بنیادی به نامهای کتابخانه کلاسها (.Net framework Class Libraries) FCL و هسته اجرایی زبان مشترک (Common Language Runtime) CLR تشکیل شده است.
کتابخانه کلاسهای دات نت فریم ورک مجموعه بسیار بزرگ از کلاسهای نوشته شده برای زبانهای مختلف و بصورت آماده است که فقط باید کاربر از انها استفاده کند و دیگر نیازی به نوشتن همه آنها ندارد. این موضوع یکی از مزایایی اصلی دات نت نسبت به زبانهای دیگر است. چرا که قبل از ورود دات نت ما مجبور بودیم همه چیز را خودمان بنویسیم. اما در حال حاضر آنها وجود دارند و ما فقط زحمت پیدا کردن و قرار دادن آنها را در جای مناسب می کشیم.
اما CLR : CLR مسئول اجرای برنامه های دات نت است, وقتی یک برنامه نوشته شده با vb را کامپایل میکنیم, کدهای ما به زبانی واسط که CLR از آن سر در می آورد یعنی زبان بینابینی مایکروسافت MSIL یا اختصارا IL تبدیل میشود. هنگام اجرای برنامه CLR کدهای MSIL به سرعت به زبان ماشین ترجمه و اجرا میشوند. مزیت این روش در این است که اگر روزی مایکروسافت بخواهد برای سیستم عامل دیگری مانند لینوکس یا مک CLR بنویسد برنامه های کامپایل شده vb.net بدون هیچ مشکلی روی آن اجرا میشوند.

برنامه های کامپایل شده با ابزارهای دیگر برنامه نویسی بجز .net به فرمت باینری در می آیند اما برنامه های ویژوال استدیو به MSIL یا IL کامپایل میشوند تا CLR بتواند آنها را اجرا کند. به همین دلیل به برنامه های کامپایل شده ویژوال ستدیو اسمبلی Assembly گفته میشود.
اما نتیجه دیگری که دات نت فریم ورک برای کاربران عرضه کرد, سادگی راه برنامه نویسی بود چرا که برنامه های نوشته شده در هر سیستمی که این چهارچوب کاری را داشته باشد قابل اجرا هستند و هیچ گونه تداخلی مابین dll ها دیگر وجود ندارد. و برنامه نیازی به همراه داشتن فایلهای dll ندارد. مشکلی که در نسخه های قبلی به میزان زیاد وجود داشت.

اسمبلی چیست :

اسمبلی جایی است که کدهای IL یک برنامه نوشته شده با vb.net در آن قرار دارند. (بلوک های ساختاری برنامه های .net) در واقع CLR اسمبلی را اجرا میکند. در ویرایشهای قبلی vb این فایلهای exe یا dll بودند که اجرا میشدند اما در دات نت همه آنها جای خود را به اسمبلی داده اند. در واقع هنگامیکه vb برنامه ای را به کدهای IL کامپایل میکند آنها را بصورت ماژول در اسمبلی جای میدهد.

محتویات یک اسمبلی :

اطلاعاتی برای هر کلاس عمومی یا نوع که در اسمبلی مورد استفاده قرار گرفته اند. اطلاعات شامل نام کلاسها و نوع, کلاسهایی که یک کلاس از آنها مشتق شده است. اطلاعاتی در زمینه تمام متدهای عمومی که در یک کلاس وجود دارند که شامل نام متدها و مقادیر برگشتی میشود. اطلاعاتی در زمینه تمام پارمترهای عمومی که در یک متد وجود دارند شامل نام و نوع پارمتر. اطلاعاتی در مورد شمارشهای عمومی شامل نام و مقدار آنها . اطلاعاتی در مورد ورژن اسمبلی. کدهای زبان واسط برای اجرا.

anvar.net
26-06-2007, 11:21
متغیرهای نامهای سمبلیک برای مقادیر ذخیره شده در حافظه هستند, برای درک بهتر آنها را باکسهایی در حافظه تصور کنید که از بیرون دارای نام و در داخل دارای مقادیر مشخصی هستند. هر متغیر بوسیله 6 خصوصیت تعریف میشود که عبارتند از : نام, آدرس, نوع داده, مقدار, قلمرو و زمان عمر

برای تعریف متغیرها از کلمه کلیدی Dim (مخفف Dimension به معنی بعد) استفاده میکنیم : Dim Varname As Vartype
که Varname نام متغیر است که ما آنرا ایجاد میکنیم و Vartype نوع داده متغیر را مشخص میکند و ما آنرا انتخاب میکنیم مانند Integer , Double و String
در تعریف متغیرها : کاراکتر اول نباید عدد باشد, در بین نام متغیر استفاده از فاصله مجاز نیست, حداکثر طول کارکترهای متغیر نباید بیشتر از 255 کاراکتر باشد.


Dim myage As Integer
Dim myfirstname, lastname As String
Dim myname As String = "anvar.net"

میتوان چند متغیر را در یک خط اعلان کرد, میتوان در همان خط اعلان به متغیرها مقداردهی کرد. در صورتی که ما این کار را نکنیم خود ویژوال بیسیک مقادیر پیش فرضی با توجه به نوع داده به آن نسبت میدهد. مثلا 0 برای تمام نوع داده عددی, False برای نوع داده بولین و .................

آدرس هر متغیر در واقع مکانی از حافظه است که مقدار متغیر در آن نگهداری میشود, در مجموع با توجه به عمر متغیر آدرس متغیر در حافظه تغییر میکند. گاها آدرس یک متغیر I-value یک متغیر نیز نامیده میشود.
نوع داده : نوع داده متغیر, مقادیر احتمالی را که متغیر میگرد, تعیین میکند.
مقدار متغیر : محتوی مکان حافظه در آدرس یک متغیر است.
قلمرو : قلمرو یک متغیر نحوه دسترسی به متغیر را فراهم میکند, مثلا اگر یک متغیر در داخل یک روال تعریف شود در سایر روالها قابل دسترسی نیست.
متغیرها (همچنین ثابتها) دارای دارای یک قلمرو یا حوزه دید هستند. حوزه دید سطح دسترسی به متغیرها را در کدهای برنامه تعیین میکند. سطح دسترسی به یک متغیر در دو سطح تعریف میشود :
سطح بلوک و سطح روال برای متغیرهای محلی, سطح ماژول و سطح پروژه
متغیرهای محلی : اگر یک متغیر در داخل یک بلوک کد (بلوک یعنی عبارتی که با End و Loop یا Next به پایان میرسند)تعریف شود این متغیر فقط از داخل همین بلوک قابل دسترسی هست. و خارج از بلوک قابلیت دسترسی ندارد. مثلا


If X<>10 Then


Dim rec As Double


Rec=1/X


End if


MsgBox(CStr(rec))
در این مثال متغیری از نوع عدد صحیح در داخل بلوک If تعریف کرده ایم. اما چون تعریف ما در سطح بلوک است متغیر بعد از عبارت End if دیگر قابل دسترسی نیست.
در صورتی که متغیر در داخل یک روال اعلان شود سطح دسترسی آن محدود به روال فوق است و فقط در داخل روال قابل دسترسی است.
به متغیرهایی با سطح دسترسی بلوک یا روال متغیرهای محلی Local میگویند.متغیرهای که بصورت محلی تعریف میشوند میتوانند در سایر روالهای دیگر نیز با همان نام اعلان شوند.
متغیرهای عمومی : شامل متغیرهایی هستندکه در سطح ماژول یا پروژه تعریف میشوند. در صورتی که در ماژول های استاندارد متغیز=ری را تعریف کنیم میتوان سطح دسترسی ب آن را با کلمات کلیدی Private و Public و Friend تعیین کرد. البته در اینجا اولویت با قلمرو خود ماژول است یعنی اگر یک متغیر Public را در داخل یک ماژول با قلمرو Friend تعریف کنیم, متغیر ما هم قلمرو Friend خواهد داشت نه Public
دسترسی Private : یا خصوصی , متغیری که در بخش اعلان یک ماژول بصورت Private تعریف میشود فقط از داخل همان ماژول قابل دسترسی هست. در صورتی که یک متغیر در داخل یک ماژول با استفاده از کلمه کلیدی Dim اعلان شود آن متغیر سطح دسترسی ماژول را میگیرد.
دسترسی Friend یا نامحدود : متغیری که در بخش اعلان یک ماژول استاندارد با سطح دسترسی Friend اعلان میشود در تمام پروژه قابل دسترسی هست و محدودیت ندارد. اما از سایر پروژه ها قابل دسترسی نیست.
سطح دسترسی Public : متغیری که در قسمت اعلان یک ماژول استاندارد با قلمرو public و بصورت Public تعریف میشود.در کل پروژه و سایر پروژه هایی که به این پروژه دارای ارجاع هستند قابل دسترسی است.مثال :
در داخل یک ماژول استاندارد با قلمرو Public دو متغیر با سطح دسترسی Public و Friend تعریف میکنیم.


Public module Module1


Public myvarpub As integer


Friend myvarfr As integer


End Module
اگر پروژه 2 ما دارای یک ارجاع (Refrence) به پروژه 1 باشد , میتوانیم از داخل پروژه 2 به متغیری که با سطح دسترسی Public در یک ماژول با قلمرو Public که در پروژه 1 قرار دارد دسترسی پیدا کنیم.
Project1.Module1.myvarpub=1000
اما از داخل پروژه 2 ما قابلیت دسترسی به متغیرهای پروژه 1 را که بصورت Friend تعریف شده اند نداریم. چرا که این متغیرها (Friend) فقط در داخل همان پروژه دیده میشوند.
زمان عمر : زمان عمر متغیر مشخص میکند که تا چه زمانی یک متغیر وجود دارد. به مثال زیر دقت کنید : در داخل یک روال یک متغیر محلی تعریف کرده ایم


Sub proceduA…()


Dim locvar1 As integer=10


Call proceduB


Locvar1=1


End sub
متغیر Locvar1 یک متغیر محلی است و مقدار اولیه آن 10 است. هنگامیکه برنامه کد فوق را اجرا میکند و به فراخوانی روال B میپردازد دیگر متغیر Locvar1 خارج از قلمرو روال B است و در داخل روال B قابل دسترسی نیست, گرچه هنوز در روال A معتبر است. به بیانی دیگر روال B میتواند یک متغیر محلی دیگر با همین نام در داخل خود داشته باشد. پس زمان عمر متغیر Locvar1 فقط در زمانی است که برنامه در داخل روال A است, و در صورت حرکت به روالی دیگر عمر خود را از دست میدهد تا زمانیکه دوباره به روال بازگردد.

انواع داده :

Boolean : 2 بایت از حافظه را میگیرد و فقط دو مقدار True و False را قبول میکند

Byte : 1 بایت از حافظه را میگیرد و میتواند عددی بین 0 تا 255 (بدون علامت) بگیرد

Char : 2 بایت از حافظه را میگیرد و کد کاراکتر از 0 تا 65535 را قبول میکند.

Date : 8 بایت از حافظه را میگیرد و از 1 , 1 ژانویه تا 31 دسامبر 9999 را قبول میکند.

Decimal : 12 بایت از حافظه را میگیرد و عددی بین +/-79,228,162,514,264,337,593,543,950,335 بدون ممیز تا -/+ 7.9228162514264337593543950335 با 28 رقم بعد از ممیز را قبول میکند.

Double : 8 بایت از حافظه را میگیرد و عددی بین -1.79769313486231E308
تا -4.94065645841247E-324 برای اعداد منفی و عددی بین 4.94065645841247E-324 تا 1.79769313486232E308 برای اعداد مثبت میگیرد.

Integer : 4 بایت از حافظه را میگیرد و عددی صحیح بین -2,147,483,648
تا 2,147,483,647 را میگیرد.

Long : 8 بایت از حافظه را میگیرد و عدد صحیح بین -9,223,372,036,854,775,808
تا 9,223,372,036,854,775,807 را میگیرد.

Object : 4 بایت از حافظه را میگیرد و هر نوعی را که بتوان در متغیر object ذخیره کرد میگیرد.

Short : 2 بایت از حافظه را میگیرد و عددی صحیح بین -32,768 تا 32,767 را میگیرد.

Single : 4 بایت از حافظه را میگیرد و عددی بین -3.402823E38 تا -1.401298E-45
برای اعداد منفی و عددی بین 1.401298E-45 تا 3.402823E38 برای اعداد مثبت میگیرد.

String : 10 بایت + 2 * طول رشته از حافظه را میگیرد و از 0 تا 2 بیلیون کاراکتر یونیکد را میگیرد.

User-Defined : مقدار فضایی که از حافظه میگیرد متغیر است, محدوده مقدار هر عضو این ساختار را نوع داده آن عضور تعیین میکند.

am_merman01
28-06-2007, 00:37
دوست عزيز كارت خيلي عاليه اگه تداوم داشته باشه معركه ميشه.
ما آماتورها كه خيلي از ديدن اين تاپيك خوشحال شديم.
ولي كاشكي مي شد يكم سريع تر از مقدمات بگذري و بري سراغ توابع.
به هر حال كارت خيلي درسته من كه كلي دعات ميكنم چون فعلاً چيزي بلد نيستم كه بتونم كمكت كنم.

bad_boy_2007
29-06-2007, 22:51
خسته نباشی استاد .
مختصر ، مفید و کامل بود.



Boolean : 2 بایت از حافظه را میگیرد و فقط دو مقدار True و False را قبول میکند

اینو تو کتابی که دارم میخونم هم دیده بودم فکر کردم شاید مشکل تایپی باشه ! آخه متغییر boolean که فقط 0 یا 1 میشه پس چرا 2 بایت ؟ بایس اشغال کنه ؟ مورد تکنیکی خاصی داره ؟




Public module Module1
Public myvarpub As integer
Friend myvarfr As integer
End Module
اگر پروژه 2 ما دارای یک ارجاع (Refrence) به پروژه 1 باشد , میتوانیم از داخل پروژه 2 به متغیری که با سطح دسترسی Public در یک ماژول با قلمرو Public که در پروژه 1 قرار دارد دسترسی پیدا کنیم.
Project1.Module1.myvarpub=1000
اما از داخل پروژه 2 ما قابلیت دسترسی به متغیرهای پروژه 1 را که بصورت Friend تعریف شده اند نداریم. چرا که این متغیرها (Friend) فقط در داخل همان پروژه دیده میشوند.


ببخشید شاید سوالم در این زمینه زیادی ابتدایی باشه ولی چون تازه اومدم تو محیط net. واسم بعضی چیزا یکم تازگی داره ! بگذریم .
اینجا گفتی که اگه متغییری از نوع Public باشه تو پروژه های دیگه هم قابل دسترسه . تو محیط net. میتونیم 2 تا پروژه رو با هم باز کنیم و از هر دو بعنوان یک پروژه استفاده کنیم ؟ خب اگه کامپایل بشن اونوقت چی ؟ هر دو با هم کامپایل میشه یا بخشی از پروژه 2 هم که در پروژه 1 استفاده شده کام÷ایل میشه ؟

توضیحاتت در مورد CLR هم خیلی خوب بود کتابی که من دارم یکم زیادی گیجم کرده بود . فقط یه سوال محیط net. نقش مفسر رو ایفا میکنه ؟ اگه اینطوره سرعت اجرای برنامه ها افت نمیکنه ؟ یا اینکه برای اولین بار exe مخصوص همون ماشین رو ایجاد میکنه ؟

_H2_
30-06-2007, 10:26
سلام، با اجازه کاربر anvar.net! گفتم کمکی کرده باشم و شما روی همان اموزش متمرکز بشوید! :31:


اینو تو کتابی که دارم میخونم هم دیده بودم فکر کردم شاید مشکل تایپی باشه ! آخه متغییر boolean که فقط 0 یا 1 میشه پس چرا 2 بایت ؟ بایس اشغال کنه ؟ مورد تکنیکی خاصی داره ؟

اقا اصلاً اینطور نیست! من تضمین میدهم که کاربر anvar.net اشتباه کرده اند و Boolean دو بایت نیست و همینجا عاجزانه ملتمسانه و نمی دانم چی چی آنه! در خواست میکنم تصحیحش کنند.اصلاً وحشت برتان ندارد،قول شرف میدهم و حاضر اثبات کنم Boolean دو بایتی نیست، یعنی اگر دو بایتی باشد همه چیز به هم میریزد! متغییر Boolean یک متغییر 4 بایتی است! :31:
(ونیز در دات نت 2 متغییر Decimal هم 16 بایتی است ولی دوستمان در دات نت 1 گفته اند،البته در اولین پست هم گفته بودند ! ولیBoolean از قدیم 4 بایتی بوده!)
خوب حالا نمیخواد وحشت کنید! این برای هماهنگی با API های ویندوز است، چون فریم وروک و دیگر زبانهای برنامه نویسی هم در زیرساخت به API های ویندوز وصل میشوند و واحد اصلی انتقال اطلاعات در ویندوز 32 بیتی ، 32 بیت است که میشود 4 بایت!!!! و هر چه کدهایب شما در زمان نقل و اتقال و رد و بدل شدن در API ها نیاز به تبدیلات کمتری داشته باشند این باعث افزایش سرعت میشود. این مسئله فقط در RAM صادق است و در ذخیره سازی اطلاعات در بانکهای اطلاعاتی اینطور نیست!



ببخشید شاید سوالم در این زمینه زیادی ابتدایی باشه ولی چون تازه اومدم تو محیط net. واسم بعضی چیزا یکم تازگی داره ! بگذریم .
آقا تبریک میگم! خوش تشریف آوردید!!! :10:


اینجا گفتی که اگه متغییری از نوع Public باشه تو پروژه های دیگه هم قابل دسترسه . تو محیط net. میتونیم 2 تا پروژه رو با هم باز کنیم و از هر دو بعنوان یک پروژه استفاده کنیم ؟ خب اگه کامپایل بشن اونوقت چی ؟ هر دو با هم کامپایل میشه یا بخشی از پروژه 2 هم که در پروژه 1 استفاده شده کام÷ایل میشه ؟

شما میتوانید چند EXE در یک Sulotion داشته باشید ولی مجزا خواهند بود، در اصل معنای واقعی Public در پروژه های DLL مشخص میشود که اگر چیزی Public نباشد، شما آن را در خارج از آن DLL (مثلاً EXE یا DLL که آن را Include کرده نخواهید دید!)



فقط یه سوال محیط net. نقش مفسر رو ایفا میکنه ؟ اگه اینطوره سرعت اجرای برنامه ها افت نمیکنه ؟ یا اینکه برای اولین بار exe مخصوص همون ماشین رو ایجاد میکنه ؟
اصلاً نقش مفسر ندارد!!!! یک محیط runtime است که برنامه در ان محیط میتواند اجرا شود.
گرچه زیاد هم درست نیست ولی فعلاً اینطور در نظر بگیرید که دستورات کامپایلی شما در محیط دات نت بیشتر به دستورات jmp و call زبان ماشین برای پرش به جای اصلی اجرا در داخل محیط runtime پاس داده میشوند.
بای! :31: :10:

bad_boy_2007
30-06-2007, 10:49
ممنون _h2_ جان کامل و جامع بود ولی وحشت انگیز :31: :18: 4 بایت !!!!

anvar.net
30-06-2007, 12:15
از تمام دوستان تشکر میکنم. بخصوص از آقای H2 :
*****************
اما, مشکل از من نیست(گرچه ما اشتباه میکنیم), در تمام منابعی (بیش از 30 کتاب) که من نگاه کردم داده های Boolean فقط و فقط 2 بایت از حافظه رو اشغال میکنند. در vb6 هم همینطور بود,
حالا مشکل از چی و کجاست من نمیدونم.

اصل متن از کتاب : VB.NET language in nutshell , انتشارات O'Reilly , ص 52


The Boolean is a 16-bit data type that can only represent two values: True and False. The VB keywords True and False are used to assign these values to a Boolean variable. When a numeric value is converted to Boolean, any nonzero value is converted to True, and zero is converted to False. In the other direction, False is converted to zero, and True is converted to -1. Incidentally, in C, C#, and C++, True is converted to 1. This change was made in Beta 1 of VB .NET
to bring it in line with the other languages, but was subsequently changed back in Beta 2.)

anvar.net
30-06-2007, 15:14
متغیرهای Object :

نوع داده object یک نوع اشاره گر است, در واقع مقدار یک متغیر از نوع object یک ادرس است که ارجاعی به یک شیء در حافظه میکند. در vb.net نوع داده object نوع داده عمومی یا سراسری است. یک متغیر از نوع object اشاره ای به داده سایر انوع داده ها میکند, بعنوان مثال :
Dim Obj As object
Obj=123L
در کد فوق یک مقدار Long را در یک متغیر object قرار داده یم.
کلاس Object در کلاسهای مبنای فضای نام system دارای یک متد بنام GetType هست که نوع, نوع object را برمیگرداند. مثلا اگر obj یک متغیر از نوع داده object باشد. کد نوع object را برگشت میدهد.
کلاس Type که یکی دیگر از اعضای کلاسهای مبنای فضای نام System است دارای 2 متد است که اطلاعاتی در مورد زیرنوع , نوع داده object برگشت میدهند.

ToString : یک رشته برمیگرداند که زیر نوع داده را مشخص میکند.(چیزی معادل تابع TypeName وی بی دات نت است).

GetTypeCode : یک مقدار شمارشی از نوع کد (TypeCode) برگشت میدهد. (چیزی معادل تابع VarType در vb6 )


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نوع داده شخصی (User Defined Types) : ساختار یا Structure Data Type

نوعی از انواع داده است که توسط خود کاربر تعریف میشود: برای تعریف از دستور Structure استفاده میکنیم :
Structure Structurename

End Structure
در داخل بدنه ساختار ما متدهای عضو و یا عضوهای غیر متد را تعریف میکنیم. اعضای یک ساختار میتوانند متغیرها, خصوصیات, متدها و روال ها باشند. البته توجه داشته باشید که همه عضوها با یک سطح دسترسی تعریف شوند. مهمترین کاربرد ساختارها کپسوله کردن متغیرهای وابسته به هم است.


Structure strPerson
Public Name As String
Public Address As String
Public City As String
Public State As String
Public Zip As String
Public Age As Short
End Structure

برای تعریف یک متغیر از نوع strPerson مثل گذشته عمل میکنیم :

Dim APerson As strPerson
برای دسترسی به یک عضو از ساختار , از نقطه استفاده میکنیم :

APerson.Name = "Beethoven"
ساختارها میتوانند بعنوان آرگومان به توابع ارسال شوند, و یا میتوانند بعنوان نوع برگشتی از یک تابع مود استفاده قرار گیرند.
ساختارها شباهت هایی با کلاسها دارند , اما تفاوتها :
ساختارها نمیتوانند بطور صریح ارث ببرند و نمیتوان از آنها ارث برد.
تمام سازنده های یک ساختار باید پارامترهای معلوم و مشخص باشند.
و .... مطالب پایه در بحث برنامه نویسی شیء گرا مطرح میشود

ثابت ها :

ثابتها مقادیری ثابت هستند که در طول برنامه هیچ گونه تغییری نمیکنند (بر خلاف متغیرها = متغیر یعنی چیزی که در تغییر میکند). برای تعریف ثابت از دستور Const استفاده میکنیم.Const myPvalue=3.14…………..


نوع داده شمارشی :

در واقع مجموعه ای از ثابت ها هستند که با هم در یک گروه قرار میگیرند. برای تعریف نوع داده شمارشی از دستور Enum استفاده میکنیم.

Enum enumname

End Enum
مثال میخواهیم, 5 رنگ را در یک داده شمارشی تعریف کنیم و در برنامه از ایندکس های اختصاص داده شده به هر کدام استفاده کنیم :

Enum myColor
Black=0
White=1
Blue=2
Green=3
Red=4
End enum
حال میتوانیم با توجه به رنگها با اندیس ها کار کنیم.

Msgbox(mycolor.blue)
==è 2
توجه : نوع داده شمارشی در داخل روال ها قابل تعریف نیست

_H2_
30-06-2007, 15:14
سلام
جالب بید!
عجب علمای کتاب نویسی!!!!! در VB8 که 100% اطمینان دارم، VB6 را نمیدانم و با گفته های شما در VB7 شک پیدا کردم.
بهرحال این معتبر ترین دستور در محیط دات نت برای محاسبه تعداد بایتهای یک ساختار است. (البته راه های دیگری هم وجود دارد ولی همه انها اندازه Boolean را 4 بایت نشان میدهند! میتوانم لیستی ردیف کنم!!!!)
مثلاً

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ضمناً در استفاده از API ها ویندوز در نظر گیری طول ساختارها بسیار بسیار مهم است و در صورت کوچکترین ناسزگاری امکان هنگ کردن کل برنامه هم وجود دارد

حالا ولللش !!!! شما ادامه نگارش کتاب آنلاین تان را ادامه دهید! :31:
علما، فضلاء، فقها، فعلاً بای!!!

anvar.net
30-06-2007, 15:20
تبدیل نوع داده :

در vb.net برای تبدیل انواع داده توابع زیادی تهیه شده است. در کل کار این توابع تبدیل نوع داده یک متغیر به نوع داده دیگر است.
توابع فوق عبارتند از :

CBool : برای تبدیل مقادیر صحیح (Integer) به نوع داده Boolean بکار میرود. هنگامیکه یک مقدار عددی به بولین تبدیل میشود تمام مقادیر غیر صفر به True و مقدار صفر به False تبدیل میشوند.

CByte : برای تبدیل مقادیر عددی بین 0 تا 255 به بایت بکار میرود.(قسمتهای اعشاری را گرد میکند)

Cchar : یک آرگومان رشته ای میگیرد و اولین کاراکتر رشته را بعنوان نوع داده Char برگشت میدهد.

CDate : مقادیر زمانی یا تاریخ (در صورت اعتبار) را به تاریخ تبدیل میکند

CDbl : برای تبدیل هر مقداری که در محدوده نوع داده Double بگنجد بکار میرود و انرا به Double تبدیل میکند.

CDec : برای تبدیل هر مقداری که در محدوده نوع داده Decimal بگنجد بکار میرود و انرا به Decimal تبدیل میکند.

CInt : هر مقدار عددی که در محدوده نوع داده صحیح باشد به Integer تبدیل میشود. اعشار گرد میشود.

CLng : برای تبدیل هر مقداری که در محدوده نوع داده Long بگنجد بکار میرود و انرا به Long تبدیل میکند. قسمتهای اعشاری گرد میشوند.

Cobj : برای تبدیل هر نوع داده ای که قابل ترجمه به Object باشد بکار میرود.

CShort : مقادیر عددی که در محدوده نوع داده Short باشند به Short تبدیل میشوند, قسمتهای اعشار گرد میشوند

Csng : مقادیر عددی که در محدوده نوع داده Single باشند به نوع داده Single تبدیل میشوند(در صورتی که از محدوده مجاز بیشتر یا کمتر شود error میدهد)

Cstr : در صورتی که مقدار ورودی مقادیر Boolean باشند تابع یکی از رشته های True یا False را برگشت میدهد. در صورتیکه مقدار ورودی زمان باشد تابع زمان را بصورت رشته ای برگشت میدهد. در صورتیکه مقدار ورودی عدد باشد تابع رشته ای که نشان دهنده عدد فوق است را برگشت میدهد.

CType : تابعی برای انواع تبدیلات, CType(value,Typename) که value میتواند متغیر یا مقدار باشد و Typename نوع داده نهایی است که باید تبدیل به ان صورت گیرد.



Val : برای تبدیل رشته به عدد
Format و Str برای تبدیل عدد به رشته
Chr : برای تبدیل کد عددی کاراکتر به کاراکتر
Asc : برای تبدیل کاراکتر به کد عددی کاراکتر
DateSerial و DateValue برای تبدیل تاریخ به عدد
TimeSerial و TimeValue برای تبدیل زمان به عدد
Hex و Oct برای عدد دهی به مبناهای دیگر

anvar.net
30-06-2007, 15:24
عملگرها :

در vb.net همانند علوم ریاضی برای کار با داده ها از عملگرها استفاده میکنیم, syntax بعضی از عملگرها بین ریاضی و vb.net متفاوت است: مانند ضرب, تقسیم و ....
عملگرهای محاسباتی : شامل توان ^ , ضرب * , تقسیم / , تقسیم صحیح \ , Mod یا باقیمانده, جمع +, تفریق _ است.

عملگرهای مقایسه ای : کوچکتر > , بزرگتر < , >= کوچکتر مساوی , <= بزرگتر مساوی, = مساوی , <> نامساوی , Is اگر طرف چپ همان شئ مساوی طرف راست باشد مقدار True برمیگرداند, Like که شباهت رشته ها را چک میکند.

برای چسباندن رشته ها از عملگرهای + و & استفاده میکنیم

عملگرهای منطقی :
And : "و" منطقی در صورتیکه هر دو عملوند(عبارتی که بین عملگر قرار میگیرد) true باشند نتیجه true میشود ,

Not : نفی منطقی که عملوند true را به false تبدیل میکند و برعکس ,

Or : "یا" منطقی فقط اگر هر دو عملوند false باشند نتیجه false خواهد بود,

Xor : "یا انحصاری" منطقی, اگر هر دو عملوند ارزش یکسلنی داشته باشند نتیجه false و در غیر این صورت true

AndAlso : اگر عملوند اول false باشد نتیجه false و عملوند دوم هرگز تست نمیشود

Orelse : اگر عملوند اول true باشد, نتیجه true و عملوند دوم تست نمیشود

تقدم عملگرها : برای محاسبات فرمولها با توجه به نوع کار متفاوت هستند و عملگرهای زیادی در بین آنها وجود دارد. هنگام محاسبات باید نوعی حق تقدم در پردازش اعداد وجود داشته باشد تا فقط یک راه منطقی برای حصول نتیجه درست بدست آید, تقدم عملگرها در واقع اولویت پردازش آنها است.تقدم عملگرها بصورت زیر است : توان – نفی ریاضی (-منفی) - ضرب و تقسم – تقسیم صحیح – باقیمانده یا mod – جمع و تفریق – چسباندن رشته (+) – چسباندن رشته (&) –
پس از آن عملگرهای مقایسه ای
تساوی – نامساوی – بزرگتر از – کوچکتر از – بزرگتر یا مساوی – کوچکتر یا مساوی – Like – Is
پس از آن عملگرهای منطقی
Not – And و Andalso – Xor و Or و Orelse

اولویت اول در عملگرهای محاسباتی با پرانتز است, در پرانتزهای تودرتو , پرانتزی که در مرکز قرار دارد حق تقدم بیشتری دارد, در عملگرهایی که از تقدم یکسان برخوردارند عملگری که در سمت چپ است اولویت بیشتری دارد

bad_boy_2007
01-07-2007, 08:50
ممنون anvar.net عزیز :11: بازم عالی بود
یه سوال داشتم متغییر از نوع اشاره گر به یک نوع خاص نداریم ؟ مثلا تو c با * اشاره گر به هر نوع متغییر دلخواهی ایجاد میکردیم .
اینجا فقط باید از object استفاده کنیم ؟ برای هر ساختاری کار میکنه ؟ و یک سوال دیگه فکر کنم یه جایی دیده بودم نوشته بود object تو محیط net. مثل variant تو محیط vb6 هست . یعنی از object میتونیم هم به عنوان متغییر نوع اشاره گر و هم متغییر های دیگه استفاده کرد ولی اندازه object فقط 4 بایته چطور میشه نوع double رو ذخیره کنه ؟

_H2_
01-07-2007, 10:38
آقا سلام علیکم! اگر فضولی میکنم بگید برم کنار!!! :31: (این پیرمرد جماعتها میخواهند تو هر چیزی دخالت کنند!)

ممنون anvar.net عزیز بازم عالی بود
یه سوال داشتم متغییر از نوع اشاره گر به یک نوع خاص نداریم ؟ مثلا تو c با * اشاره گر به هر نوع متغییر دلخواهی ایجاد میکردیم .

اشاره گر به اون تیپ نداریم، ولی همه چیز شی گراست و یا کلاسس است (Class) یا ساختار (Structure) که در دات نت خود ساختارهم نوعی کلاسس هستند.
بحرحال و در کل اگر متغییری به یک کلاسس عادی تعریف کنید (مثلاً یک کنترلر روی فرم) آن متغییر خود به خود اشاره گری میشود به آن کلاسس و این یعنی اگر محتویات آن را در متغییر دیگری بریزید، هر کاری که با شی اشاره شده با یکی از آن دو متغییر انجام دهید در دیگری هم قابل رویت است (صبر کنید متوجه میشوید!) یعنی خود متغییر چیزی شبیه یک Shortcut است و وقتی هم کپی گرفته شود، صرفاً آن Shortcut کپی گرفته میشود و ما دو Shortcut خواهیم داشت که به یک جای واحد اشاره میکنند.
ولی اگر متغییری از نوع یک Structure تعریف کنید، (مثلاً یک Integer) وقتی آن را در متغییری دومی بریزید، در واقع در دومی کپی میشود، مثل این است که به جای Shortcut از یک فایل کپی بگیرید، در نتیجه متغییر دوم کاملاً مجزا از اولی خواهد بود و شما میتوانید دومی را 5 قرار دهید در حالی که اولی مثلاً 7 است و... هیچ ربطی به هم نخواهند داشت.
یعنی این که متغییر تعریفی شما حالت اشاره گری داشته باشد یا نه، دست شما نیست و به صورت اتجباری در Class ها اشاره گری است و در Structure ها به صورت معمولی،
وللی امکاناتی برای شبیه سازی اشاره گر ها باز در نظر گرفته شده،
1- مثلاً در توابع و زیرروالها (Function , Sub) شما میتوانید پارامتر های Structure ی را به صورت ByRef پاس دهید تا اشاره گر آن انتقال یابد و کپی نشود و درنتیجه تغییرات آن در داخل رویه از خارج و محل فراخانی قابل رویت خواهد بود.
2 - شما میتوانید فرآیند کپی گرفتن غیر اشاره گری را توسط رابط IClonable کنترل و تحت سلطه بگیرید. مثلاً برای لغو حالت اشاره گری کلاسس ها یا کنترل بیشتر برروی کپی گیری ساختارها.
3 - میتوانید Structure را هم با یک لفافه کلاسس بپوشانید تا اجباراً به صورت اشاره گری مثل محیط ++VC عمل کند.




اینجا فقط باید از object استفاده کنیم ؟ برای هر ساختاری کار میکنه ؟ و یک سوال دیگه فکر کنم یه جایی دیده بودم نوشته بود object تو محیط net. مثل variant تو محیط vb6 هست . یعنی از object میتونیم هم به عنوان متغییر نوع اشاره گر و هم متغییر های دیگه استفاده کرد ولی اندازه object فقط 4 بایته چطور میشه نوع double رو ذخیره کنه ؟
دقیقاً نمیتوان گفت Object همان variant است، Variant در اصل برای اسکریپت ها بود و بیشتر بر اساس Union ها در ++VC عمل میکند ولی Object در دات نت پایه وراثتی دارد و بر طبق قوانین OOP عمل میکند.
Object خود یک کلاسس است و ریشه اصلی و مادر خام اولیه تمام Class و Structure و Enum و Delegate و ... و... است، یعنی در دات نت حتی رویدادها هم خود شی هستند و همه اشیای کوچک و خرد و بزرگ در دات نت بالاخره در سلسله مراتب وراثتی، وراثتی از Object هستند و در نتیجه در Object میتوانند جای بگیرند.
همانطور که به پیکان میتوانیم بگوییم ماشین و به کامیون هم میتوان گفت ماشین!
به Integer هم میتوان گفت Object و به یک Control هم میتوان گفت Object!

اون 4 بایت هم صرفاً برای اشاره گر به نقطه واقعی حضور شی در RAM است و در اصل علاوه بر اندازه ای است که آن متغییر در ذات نیاز دارد.
-----------------------------------------------------------------------------------------------------
ضمناً در بحث تبدیلات و متغییرها نوع های جدید به VB8 اضافه شده (علاوه بر نوع های VB7)
این متغییرها دو برابر مورد مشابه بدون U ظرفیت دارند و صرفاً مثبت هستند بجز SByte که برعکس است.!
نوع SByte با تبدیل CSByte (یک بایت)
نوع UShort با تبدیل CUShort (دو بایت) و نماد عددی US
نوع UInteger با تبدیل CUInt (چهار بایت) و نماد عددی UI
نوع ULong با تبدیل CULng (هشت بایت) و نماد عددی UL
و دو دستور تبدیل و قالب ریزی TryCast , DirectCast


اپراتورهای جدید >> و << و =>> و =<< هم برای شیفت بیتی اضافه شده اند و نیز اپراتورهای And و Or و Xor به جز بر روی Boolean ها بر روی اعداد و بخش دیگری از داده ها هم کار میکنند و کلیه اپراتورها قابل تعریف مجدد هم هستند. (Overload)

فعلاً چیزی یادم نمی آید! بای! :8:

anvar.net
01-07-2007, 11:24
آقای H2 کارت درسته!
به هر حال پیر انجمن هستید؛ در ضمن هر جایی اشتباهی , کمی , زیادی و به هر حال خطایی دیدی , مطرح کن یا حلش کن.

_H2_
01-07-2007, 15:47
سلام

آقای H2 کارت درسته!
به هر حال پیر انجمن هستید؛ در ضمن هر جایی اشتباهی , کمی , زیادی و به هر حال خطایی دیدی , مطرح کن یا حلش کن.
به قول یه بنده خدایی که میشناسید، ما آب شدیم رفتیم تو زیر زمین کلیدهم نداشتیم در بیاییم!!!!!!! چاکریم!

bad_boy_2007
01-07-2007, 17:01
ممنون عالی بود ادامه بدین :11: منم خواننده پر و پا قرص این تاپیکم :31:

anvar.net
02-07-2007, 23:56
آرایه ها

یک آرایه برای نگهداری مجموعه ای از نوع داده ها یا اشیاء مشابه مورد استفاده قرار میگیرد, با استفاده از آرایه میتوانیم داده های خود را در یک ساختار برنامه نویسی واحد گردآورده و با کمک اندیس (Index) با آنها کار کنیم.

با استفاده از دستورات Dim و ReDim آرایه ها را تعریف میکنیم :
فرض کنید میخواهیم نمرات دانش آموزان یک کلاس را در آرایه ای بنام Student ذخیره کنیم.(تعداد دانش آموزان 20 نفر است)؛


Dim Student(19) As integer

دستور بالا آرایه ای با 20 عضو که همگی عدد صحیح هستند ایجاد میکند.برای کار با عنصرهای این آرایه از اندیسهای 0 تا 19 استفاده میکنیم, اولین عنصر آرایه Student(0) و آخرین عنصر Student(19) است.

تابع UBound : از این تابع برای پیدا کردن کران بالای یک آرایه استفاده میشود. Ubound(arrayname,Rank) که Rank بعد آرایه و arrayname نام آرایه است.

مثلا UBound(Student) مقدار 19 برمیگرداند.
آرایه ای که در بالا تعریف کردیم, آرایه تک بعدی است, در صورتی که بخواهیم روی ایتمهای دیگری برای هر دانش آموز کار کنیم (مثلا تعداد امتحانات) نیازمند افزودن یک بعد (Dimention) جدید به آرایه بالا هستیم.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگر تعداد عناصر یک آرایه را مشخص نکرده باشیم, میتوان در هنگام تعریف ارایه به عناصر آن مقدار داد.



Dim numb() As integer={1,2,3,4,5}
آرایه فوق یک آرایه 5 عضوی (با اندیسهای 0 تا 4 ) خواهد بود.

آرایه دینامیک : به آرایه ای که بتوان تعداد عضوهای آنرا در زمان اجرا تغییر داد آرایه دینامیک میگویند.(هنگامیکه تعداد عناصر آرایه مجهول است مورد استفاده قرار میگیرد)



Dim Student() As integer

آما قبل از اینکه بتوانیم از آرایه بالا استفاده کنیم باید تعداد ابعاد و عناصر آنرا تعیین کنیم. این کار با استفاده از دستور ReDim صورت میگیرد.



ReDim Student(1)

Student(0)=24

Student(1)=28

اگر بخواهیبم هنگام تغییر عناصر ارایه, اطلاعات قبلی از بین نرود باید از کلمه کلیدی Preserve استفاده کنیم.




برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


در مبحث حلقه ها بیشتر با نحوه کار با آرایه ها آشنا می شویم.

شئ مجموعه یا کلکسیون :

شئ مجموعه یا Collection object , شئ خاصی است که همانند یک ظرف برای اشیاء سایر انوع بکار میرود. در واقع نگهدارنده سایر اشیاء یا بطور جامع تر , وظیفه مجموعه های vb جمع کردن تعدادی شئ تحت یک نام واحد است, از نگاهی دیگر شئ مجموعه نسخه شی گرای همان آرایه معمول ویژوال بیسیک است.
شئ مجموعه دارای 4 متد زیر است :
Add : یک آیتم به مجموعه اضافه میکند.
Count : تعداد ایتمهای موجود در مجموعه را برمی گرداند.
Item : برای بدست آوردن یک عضو مجموعه (با استفاده از اندیس آن یا موقعیت ترتیبی آن در مجموعه و یا کلید ان) مورد استفاده قرار میگیرد.
Remove : برای حذف یک ایتم از مجموعه (با استفاده از ایندکس یا کلید) مورد استفاده قرار میگیرد.

کلید : به هنگام افزودن یک شی به مجموعه یک کلید (از نوع رشته) برای آن تعیین میکنیم.
برای مثال : استانهای ایران را در یک مجموعه قرار میدهیم :


Dim country As New Collection

country.Add("Tehran", "Te")

country.Add("Isfahan", "Is")
همانند آرایه ها میتوانیم با شئ مجموعه کارکنیم.با استفاده از ایندکس میتوان به عناصر موجود در مجموعه دسترسی پیدا کرد(کران پایین یک مجموعه 1 است).

توجه : عناصر یک مجموعه میتوانند قبل یا بعد از یک عضو اضافه شوند, در این صورت ایندکسها توسط خود vb مرتب میشوند. با حذف یک عنصر ایندکس عناصر باقیمانده تغییر میکند.
در بحثهای آینده چگونی کار با کلسیون کنترلها (در vb6 آرایه کنترلها) را فرامی گیریم

am_merman01
03-07-2007, 01:03
دوستان اين تاپيك خيلي با حاله
من كه 1 آماتورم از خدا ميخام اين تاپيك ها بيشتر بشن.
حالا ببخشيد اگه چند خط اراجيف نوشتم فقط ميخاستم بگم كه بعضي ها دارن از اين تاپيك حد اكثر استفاده رو ميكنن و كلي براي اساتيد اين تاپيك دعا ميكنن

anvar.net
03-07-2007, 08:00
در vb.net 5 ساختار برای کار با شرطها وجود دارد که عبارتند از : If\ Then , If\ Then \ Else , Select Case , Switch و Choose . دو دستور آخر در vb6 وجود نداشتند و در نسخه .net عرضه شده اند.
ساختار If \ Then : یا ساختار شرط تک انتخابی که برای تست کردن صحت یک شرط بکار میرود و در صورتیکه مقدار شرط true باشد, دستورهای داخل بدنه شرط اجرا میشود.مثال :


Dim temperature As Integer

If temperature>30 Then

Msgbox("very hot")

End if
ساختار شرط If\ Then با دستور If شروع میشود, پس از شرط , عبارت Then و بدنه شرط که محل قرار گرفتن کدهای اجرا شونده بعد از تست شرط است. در پایان هم با عبارت End If از شرط خارج میشویم. در صورت استفاده از دستور فوق ما فقط قادر به آزمون یک تست و طبعا نتیجه گیری بر اساس همان تک شرط هستیم و فقط یک راه برای انتخاب داریم.اگر شرط True نباشد برنامه بدون انجام کاری از دستور خارج میشود

ساختار If \Then \ Else : در این دستور شرطی بر خلاف دستور بالا دو حالت انتخاب وجود دارد, True بودن شرط که منجر به اجرای عملی میشود و یا False بودن شرط که منجر به اجرای عملی دیگر میشود.


Dim temperature As Integer

If temperature>30 Then

Msgbox("very hot")

Else

Msgbox("Very nice or cool ")

End if
در این عبارت ابتدا شرط تست میشود, در صورتیکه True شود کدهای بعد از Then اجرا میشوند اما اگر شرط False شود کدهای بعد از Else اجرا میشوند.(دو انتخاب)

Select Case : با استفاده از این ساختار تصمیم گیری ما قادر به تستهای زیادی هستیم. و میتوانیم چندین آیتم را با هم مد نظر داشته باشیم.


Select Case(متغیر یا عبارت)

Case 1 (اولین ایتمی که باید چک شود)

Do………

Case 2

Do…………..

……….

Case n

Do………………

Case else

Do…………….

End Select
در داخل دستورات شرطی میتوانیم از عملگرهای منطقی استفاده کنیم. در دستور Select قادر به تست در بین دوبازه هستیم.


Dim temperature As Integer

Select temperature

Case >50

Do ………………………..

Case<30 And >10

Do………………………….

Case 30 to 50

Do …………………………

Case Is 30

Do ………………………….

Case else

Do ……………………………

End select
Microsoft.VisualBasic.Switch : این دستور که در vb.net جدید است, لیستی از عبارات یا مقدار را میگیرد و اولین آیتمی را که مقدار True داشته باشد, برمیگرداند.


Microsoft.VisualBasic.Switch(مقدار یا متغیر1 , مقدار برگشتی1 ,……….,lمقدار یا متغیر n , مقدار برگشتی n)
ایتدا عبارت اول چک میشود, در صورتیکه True باشد مقدار برگشتی 1 برگردانده میشود, در غیر این صورت عبارت دوم چک میشود و الی ..........

Choose : در واقع تابعی است که بر اساس مقدار عددی یک ایندکس, یکی از آیتمهای مشخص شده در لیست را برمی گرداند.


Choose(index, Choise1,Choice2,…………..,Choisen)
اگر ایندکس مقدار 1 داشته باشد, ایتم 1 , اگر ایندکس 2 ایتم 2 و .......................

نمونه کد : [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

_H2_
03-07-2007, 17:55
سلام! آقایون فضول خوان دوباره برگشت!! :11: :11: :11: :11: فکر کنم یک کاشتباه تایپی وجود دارد! :11:


Case<30 And >10


البته ایشان یادشان رفت بگوییند که میتوانید با ویرگول حالت or را ایجاد کنید.
مثلاً دستورات زیر صحیح هستند.
Case 1,5,7
Case Is>5
Case Is>5, 7
و...
:10:

bad_boy_2007
04-07-2007, 22:04
سلام :11:
باز هم عالی بود
فقط یک سوال (مثل همیشه !!!! :31: )
میخوام یک شرط بنویسم مثلا اگر 1 بود عمل 1 رو انجام بده و . . .
خب این شرط رو تقریبا با همه این موارد میشه پیاده سازی کرد . تو محیط c و vb6 ساختار switch یا select\case توصیه میشه ، میخوام بدونم تو محیط net. کدوم ساختار رو از لحاظ برتری سرعتی توصیه میکنن ؟ :46:

_H2_
05-07-2007, 11:00
سلام

میخوام یک شرط بنویسم مثلا اگر 1 بود عمل 1 رو انجام بده و . . .
خب این شرط رو تقریبا با همه این موارد میشه پیاده سازی کرد . تو محیط c و vb6 ساختار switch یا select\case توصیه میشه ، میخوام بدونم تو محیط net. کدوم ساختار رو از لحاظ برتری سرعتی توصیه میکنن ؟ :46:
من یکبار نوشتم ولی پرید! دوباره از اول .... (از دست این یکی ترنت،آدم یک جورایی پنچر میشود)
switch و IIf در VB تابع هستند و دستور نیستند، در نتیجه استفاده کمتر از آنها و استفاده بیشتر از Select Case و If/ElseIf خیلی بهتر است.
اگر میتوانید از Select Case استفاده کنید، اگر نشد If/ElseIf
مثلاً دستور زیر را میتوان با Select Case انجام داد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی if های با And یا Xor یا چند متغییره را نمیتوان با Case پیاده سازی کرد.

bad_boy_2007
05-07-2007, 23:13
ممنون _h2_ جان :20:

anvar.net
08-07-2007, 23:54
برنامه نویسان vb قادر به ایجاد حلقه هایی با سه دستور For , Do و While هستند.
حلقه For : مهمترین حلقه vb است و فرم کلی آن بصورت زیر است :



For index(As DataType)= Start to end [Step X]

Do ………..

Next [index]

با شروع حلقه متغیر index مقدار Start را به خود میگیرد, هر بار که حلقه تکرار میشود این متغیر با توجه به Step افزایش پیدا میکند (در صورتیکه مقدار Step نوشته نشود vb بصورت پیش فرض مقدار آنرا برابر 1 قرار میدهد). حلقه زمانیکه متغیر index به end رسید خانمه پیدا میکند.(البته میتوان با دستور Exit For حلقه را پایان داد).
در vb.net بر خلاف ویرایشهای قبلی میتوانیم متغیر حلقه را در خود حلقه تعریف کنیم مانند بالا یا اینکه آنرا ماقبل شروع حلقه تعریف کنیم.



Dim index As integer

For index=0 to n

Or

For Index As integer=0 to n

بعنوان مثال مجموع اعداد 1 تا 100 را با استفاده از حلقه For بدست می آوریم :



Dim sum,number As integer

Sum=0

For number=0 to 100

Sum=sum+number

Nexe

Msgbox(sum)

حلقه For Each : این حلقه مشابه با حلقه for است با این تفاوت که (مثلا در آرایه ها یا کلکسیونها) نیازی به دانستن تعداد عناصر نداریم. فرم کلی حلقه بصورت زیر است



For each element (As datatype) in group

Do ……………

Next (element)

در اینجا عناصر موجود در آرایه یا کلکسیون group یکی یکی به متغیر element نسبت داده میشوند.

حلقه While : این حلقه شرطی را تست میکند, تا زمانیکه شرط true باشد حلقه بکار خود ادامه میدهد. هنگامیکه شرط False ارزیابی شود, برنامه از حلقه خارج و اولین دستور بعد از حلقه انجام می گیرد. فرم کلی حلقه بصورت زیر است: این حلقه بیشتر زمانی بکار می آید که تعداد تکرارها برای ما نامشخص است.



While condition

Do ………………

End while

بعنوان مثال با حلقه فوق اولین توان 3 بزرگتر از 3000 را بدست می آوریم :



Dim number As integer=3

While number<=3000

Number=number*3

End While

Msgbox(number)


**** در این حلقه و حلقه Do از سایر توابع vb که مقدار true یا false برمیگردانند میتوان استفاده کرد.

حلقه Do : حلقه Do تا زمانیکه یک شرط true باشد(While) یا نباشد (Until) اجرا میشود, دو نوع حلقه Do داریم. در نوع اول : شرط حلقه در ایتدای آن تست میشود



Do while | untile condition

Do ………………

Loop

*** برخلاف ساختارهای While و Do While \ Loop ؛ ساختار تکرار Do Until \ Loop شرط را برای برقرار نبودن (False) چک میکند تا تکرار ادامه یابد.
اگر مثالی را که با حلقه While انجام دادیم, بخواهیم با استفاده از حلقه Do Until \ Loop بنویسیم, میشود :



Do until number>3000

Number=number*3


………………………
در نوع دوم , شرط حلقه در انتهای آن تست میشود, این حلقه حداقل یکبار اجرا میشود.


Do

Do ………………..

Loop (while | untile)

bad_boy_2007
09-07-2007, 15:18
سلام :46:
ممنون خوب بود.
میشه در مورد try هم توضیح بدین ؟
تو کتاب من در مورد try توضیحی نداده ولی چند نمونه برنلمه هست که از این دستور استفاده کرده :20:

msalimi
09-07-2007, 16:04
فكر مي كنم كه قبل از هر چيز لازم باشه در مورد كلاس و Oop به صورت كامل بحث بشه

anvar.net
09-07-2007, 20:42
یه بحث کوچک واسه روالها و توابع مونده, بعدش کنترل استثناها (try) بعدش هم بطور کاملا تخصصی OOP رو شروع میکنم, البته اگه عمری باشه و توفیق بشه.

bad_boy_2007
09-07-2007, 22:47
ممنون :20:

anvar.net
09-07-2007, 23:37
روال : روال وسیله ای برای تقسیم کد برنامه به قطعات کوچکتر و قابل مدیریت است.در حال استاندارد هر روال یک کار خاص را انجام میدهد. بعضی از روالها برای انجام کار خود نیاز به داده های ورودی (Argument) دارند که باید به آنها پاس (Pass) شود. در vb دو نوع روال داریم : روال سابروتین (روال رویداد نوعی روال سابروتین است) , روال تابع

روالهای سابروتین :

روالهای سابروتین مقدار برگشتی ندارند اما روال تابع مقداری را برگشت میدهد. به هر دو دو نوع روال میتوان داده پاس کرد.
روال سابروتین بصورت زیر تعریف میشود (ساده ترین فرم) :


Sub subname()

Do ……..

End sub
پرانتزهای بالا برای پاس کردن داده ها هستند.
مثلا :


Sub message(ByVal text As string)

Msgbox(text)

End sub
با این کار ما یک متغیر رشته ای تعریف کرده ایم که میتوانیم در داخل روال از ان استفاده کنیم. حال در هر جا و به هر تعداد که خواستیم میتوانیم از روال فوق استفاده کنیم.
کلمه کلیدی ByVal به vb میگوید که این داده بصورت مقداری (By Value) پاس شده است. یعنی vb یک کپی از آن را به روال میدهد نه خود آنرا. روش دیگر پاس کردن داده روش ارجاعی (ByRef) است در این روش vb بجای مقدار داده, آدرس آنرا به روال پاس میکند. روش پاس کردن ارجاعی بیشتر جاهایی مورد استفاده قرار میگیرد که بخواهیم مستقیما با داده های اصلی کار کنیم. در روش ارسال با مقدار, تغییرات اعمالی از سوی روال بر روی مقادیر کپی شده, هیچ گونه تاثیری بر روی مقدار اصلی نخواهد داشت.اما در روش ارجاعی, روال فراخوانی شده مستقیما به مقدار اصلی دسترسی دارد و میتواند در آن تغییراتی اعمال کند.

تابع :

روالهای تابع مشابه با روالهای سابروتین هستند با این تفاوت که مقدار برگشتی دارند. در تعریف روال تابع بجای sub از function استفاده میکنیم. برای برگشت مقدار از Return استفاده میشود.

Function name() As DataType
Return
End Function
As DataType نوع داده مقدار برگشتی را مشخص میکند. تعداد return های یک تابع میتوانند متغییر باشند اما با اجرای اولین Return تابع خاتمه پیدا میکند.
مثال : تابعی مینویسیم که دو مقدار عددی از کاربر مینویسد و تابع کوچکتر یا بزرگتر بودن آنها را چک میکند و بصورت رشته برمیگرداند.



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تابع فوق دو مقدار را میگیرد و رشته ای را بعنوان نتیجه برگشت میدهد. با نتیجه میتوانیم همانند سایر متغیرهای رشته ای عمل کنیم.


Compare(8,3) ===è " عدد 1 بزرگتر از عدد 2 است"
برای خروج از تابع از دستور exit Function استفاده میکنیم.

*** به روالهایی که در داخل کلاسها تعریف میشوند, متد گفته میشود

آرگومانهای اختیاری :

بعضی از روالها میتوانند دارای آرگومانهای اختیاری باشند, اگر آرگومانی بصورت اختیرای اعلان شود این امکان به روال فراخوانی شده داده میشود تا در مورد اینکه کدام آرگومانها ارسال شوند, تصمیم گیری کند. ارگومانهای اختیاری مقداری بعنوان پشی فرض دارند که برای تخصیص پارمترها در نظر گرفته میشود. برای اعلان یک آرگومان اختیاری از کلمه کلیدی Optional استفاده میکنیم و یک مقدار پیش فرض به آن نسبت میدهیم.


Sub mypross (Byval input As integer, optional ByVal operate As integer=5)



End Sub
اگر یک آرگومان بصورت اختیاری اعلان شود, آرگومانهای بعد از آن نیز باید بصورت اختیاری اعلان شوند.

روش Overload :

با استفاده از روش Overload میتوانیم چندین روال همنام که در پارامترها (تعداد و نوع پارامترها و یا ترتیب پارامترها) با هم متفاوت هستند ایجاد کنیم. هنگامیکه یک روال Overload فراخوانی میشود کامپایلر پس از آزمودن تعداد, نوع و ترتیب آرگومانهای روالهای هم نام اقدام به انتخاب روال صحیح میکند.
غالبا از روالهای Overload هنگامی استفاده میکنیم که چند روال مشابه وظایف مشابهی را بر روی نوع داده های متفاوت انجام میدهند.

anvar.net
09-07-2007, 23:43
قلمرو یک شناسه یا عنصر بخشی از برنامه است که در آن شناسه یا عنصر میتواند مورد مراجعه یا دسترسی قرار گیرد. قلمروهای ممکن برای شناسه ها عبارتند از : قلمرو کلاس, قلمرو ماژول, قلمرو بلوک و قلمرو فضای نام

اعضای یک کلاس دارای قلمرو کلاس هستند, یعنی آنها در بخشی که بعنوان فضای اعلان کلاس شناخته میشود قابل رویت هستند. در داخل قلمرو کلاس, یک متد میتواند به بصورت مستقیم تمام اعضای تعریف شده کلاس را فراخوانی و به اعضای ارث بر کلاس دسترسی پیدا کند (البته بجز اعضای Shared). در واقع اعضای یک کلاس برای متدهای کلاس حالت سراسری دارند.

قلمرو بلوک : شناسه هایی که در داخل یک روال یا ساختارهای انتخاب و تصمیم گیری (شرط و حلقه) اعلان میشوند قلمرو بلوک دارند. (با استفاده از Dim یا Static).

*** اگر یک متغیر محلی در روال فراخوانی شده همنام با با یک متغیر در قلمرو کلاس یا ماژول باشد, متغیر با قلمرو کلاس و ماژول تا زمانیکه روال فراخوانی شده به اجرای خود خاتمه دهد, بصورت پنهان باقی میماند.

قلمرو ماژول مشابه قلمرو کلاس است. متغیرهایی که در داخل یک ماژول اعلان میشوند برای تمام متدهای تعریف شده در ماژول قابل دسترسی هستند. اگر عنصری در داخل هیچ روالی قرار نداشته باشد, بطور خودکار به عنصر سطح ماژول تبدیل میشود.
در سطح ماژول (ماژول, کلاس و ساختار) میتوان برای تنظیم حوزه دید از کلمات زیر استفاده کنیم :

Public : دسترسی عمومی و نامحدود به عنصر (از همان پروژه یا پروژه های ارجاع داده شده)

Protected : دسترسی حفاظت شده به عنصر , از این کلمه کلیدی فقط برای تعریف اعضای یک کلاس اتفاده میشود

Friend : دسترسی عمومی و نامحدود به عنصر فقط در داخل همان پروژه
Protected Friend : عنصری که خصلتهای Protected و Friend را با هم دارد(فقط در سطح کلاس)

Private : دسترسی عنصر را به همان ماژول, کلاس یا ساختار محدود میکند.

قلمرو فضای نام : فضای نام یکی از ویژگیهای برنامه نویسی شء گرا است که برای جدا کردن, عناصر همنام و جلوگیری از تداخل آنها بکار میرود. عناصری که با کلمات کلیدی Friend و Public اعلان میشوند در تمام فضای نام دیده میشوند

bad_boy_2007
10-07-2007, 13:14
:20: مرسی خوب بود
میشه در مورد overload کردن مثال بزنی ؟

anvar.net
11-07-2007, 01:56
بعنوان مثال : دو تابع تعریف میکنیم که عددی را به عنوان آرگومان میگیرند و توان 2 آنرا برگشت میدهند. تابع اول عدد صحیح میگیرد و تابع دوم عدد اعشاری




برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید







به همین ترتیب میتوانیم متدهای (روالهای داخل کلاسها) Overload داشته باشیم.

bad_boy_2007
11-07-2007, 17:16
ممنون مثال خوبی بود فقط یک سوال استفاده از کلمه overloads قبل از function چه فایده ای داره ؟ آخه چند جا دیدم اینطور نوشتن . صرفا بخاطر وضوح بیشتره ؟

_H2_
11-07-2007, 17:30
ممنون مثال خوبی بود فقط یک سوال استفاده از کلمه overloads قبل از function چه فایده ای داره ؟ آخه چند جا دیدم اینطور نوشتن . صرفا بخاطر وضوح بیشتره ؟
سلام
می توانید برای وضوح بیشتر هم از آن استفاده کنید ولی اگر بخواهید متدی هم نام با کلاسس پایه را Overload بکنید، (در یک کلاسس وراثتی) آنگاه نوشتن کلمه فوق اجباری است!

تکنیک برتر
12-07-2007, 07:55
anvar.net موفق باشی براتون آرزوی موفقیت می کنم ایشاالله یکی از پربیننده ترین تاپیک ها میشود ./
ممنون.

bad_boy_2007
13-07-2007, 18:22
سلام
آقا یه سوال داشتم گفتم چون به بحث تعریف متغییرها مربوط میشه و شما هم تو آموزشهاتون بهش اشاره کردین بهتره اینجا مطرح کنم :20:

داشتم کتاب ado.net رو میخوندم به این عبارت بر خوردم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا سوالم اینه که منظور از عبارت Friend WithEvents که پیش از اعلان متغییر آمده چیه ؟

anvar.net
14-07-2007, 22:41
Overload :
کلمه Overload چه قبل از روال سابروتین باشد یا تابع , هدف آن اضافه بارکردن یک یا چند سابروتین یا تابع همنام در کلاس پایه است.

کلمه کلیدی WithEvents :

Dim | Private | Public WithEvents objvarname As ObjectType

کلمه کلیدی فوق به vb میگوید که شیئ که به آن ارجاع داده شده رویدادی از خود به نمایش میگذارد.
هنگامیکه یک متغیر object با استفاده از کلمه فوق اعلان میشود, ورودی متغیر فوق در لیست اشیاء قرار داده میشود. همچنین یک لیست از رویدادهایی که برای متغیر فوق در دسترس هستند نیز در لیست رویه ها قرار میگیرند. پس از آن میتوان برای Handle کردن رویدادهای متغیر کد نوشت.
*** : متغیر شئ که با کلمه کلیدی فوق اعلان میشود باید در داخل یک شئ یا یک کلاس و یا ماژول باشد.
*** : در صورتی که در یک شئ ActiveX و یا کلاس از کلمه کلیدی فوق استفاده میکنیم. فقط با متغیرهای Object مجاز به استفاده هستیم.
*** : در آرایه ها مجار به استفاده از کلمه فوق نیستیم.
*** : در اعلان متغیرهای محلی مجاز به استفاده ار کلمه کلیدی فوق نیستیم.
*** : استفاده از کلمه New به همراه کلمه کلیدی فوق مجاز نیست

مثال :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

bad_boy_2007
15-07-2007, 08:31
:20: خیلی ممنون:11:

anvar.net
15-07-2007, 13:12
استثناء یا Exception : در vb.net به خطاهایی که در زمان اجرای برنامه (run time) رخ میدهند, استثناء گفته میشود.
برای مقابله و مدیریت استثناها در vb.net دو روش کلی وجود دارد :
روش ساخت نیافته که در vb6 روش پیش فرض است و روش ساخت یافته که در نسخه .net عرضه شده است.
روش ساخت نیافه Unstructureed error : در این روش برای مقابله با خطا از دستور On Error GoTo استفاده میکنیم :

On Error {GoTo [line | 0 | -1 ] | Resume Next}
GoTo Line : کد مقابله با خطاء را که از خط line شروع میشود, فراخوانی میکند.
GoTo 0 : عملیات کنترل خطاء را در همان روال متوقف میکند, در واقع راهی برای خاموش کردن روشهای مقابله با خطاء است.
GoTo-1 : مشابه با بالا
Resume Next : وقتی خطایی اتفاق می افتد, اجرای برنامه را از دستور بعد از دستوری که موجب خطاء شده از سر می گیرد.

مثال :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در vb شی محصوص خطاء (Err) وجود دارد که برای برای مقابله بهتر با خطاها طراحی شده است.
3 خاصیت مهم سئ فوق عبارتند از :
Err.Number : که شماره خاص یک خطاء است (هر نوع خطایی دارای یک شماره منحصر به فرد است).
Err.Description : توضیح مختصری در مورد خطای اتفاق افتاده میدهد.
Err.Source : مقدار رشته ای برگشت میدهد که شئ با برنامه ایجاد کننده خطاء را مشخص میکند.(البته در برنامه های ما نام پروژه است اما برای کامپوننتهای Com خارجی میتواند مفید باشد).
شئ Err دارای متدی بنام Getexception است که با استفاده از آن میتوان یک شئ استثناء گرفت که نشان میدهد چه اتفاقی اقتاده است.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

دستور Resume :
با این دستور میتوان اجرای برنامه را بعد از وقوع خطاء از سر گرفت :
Resum : اجرای برنامه را از همان دستور که باعث خطاء شده از سر میگیرد.
Resum Next : اجرای برنامه را از دستور بعد از دستوری, که موجب خظاء شده از سر میگیرد.
Resum Line : برای از سر گیری برنامه به خطی که با برچسب line مشخص شده میرود.

On Error GoTo handler

Handler:

Resume Next
*** : در صورتیکه در ابتدای یک روال دستور On Error Resume Next را قرار بدهیم برنامه بدون توجه به خطاء از دستور بعد اجرا میشود

am_merman01
16-07-2007, 03:00
anvar.net عزيز دست گلت در نكنه واقعاً عاليه خيلي خوب پيش ميره انشاء ا... خدا كمكت كنه

bad_boy_2007
17-07-2007, 14:12
ميشه در مورد goto 0 و goto -1 بيشتر توضيح بدين ؟ :20:

Shahrdar
17-07-2007, 18:40
مطالب خیلی جالبین... anvar.net هر وقت این فصل تموم شد (با اجازه شما) بگو مطالب رو پی دی اف کنم (البته با ذکر اسم شریف)

ا...ز زیاد :31:

anvar.net
17-07-2007, 22:39
ممنون از دوستان,آقای/؟ Shahrdar ؛ اجازه ما هم دست شماست, اختیار تام دارید.فعلا چند روزی صبر کن, مقدمات تمام میشه

Shahrdar
17-07-2007, 22:41
چشم



:31: :31:

anvar.net
17-07-2007, 22:46
On Error GoTo |0|-1
ارگومان صفر (0), در واقع تا زمانیکه On Error بعدی اجرا شود, رسیدگی به خطاء را در رویه مورد نظر به حالت تعلیق درمی آورد.
آرگومان 1 , رسیدگی به خطاء را در رویه مورد نظر به حالت تعلیق درمی آورد. به عبارتی خطاء را Nothing میکند.

اگر بخواهیم کد مقابله با خطاء را در یک روال غیر فعال کنیم میتوانیم از On Error GoTo 0 استفاده کنیم. استفاده از این دستور تمام اداره کننده های خطاء در روال جاری را غیر فعال میکند, توجه کنید که در صورتیکه خطایی رخ بدهد این عبارت از CLR نمی خواهد به یک خط با شماره خط 0 انتقال یابد (حتی در صورتیکه روال دارای یک خط با شماره صفر باشد ), استفاده از این کد این نتیجه را دربردارد که هیچ گونه کنترلی بر روی خطاهایی که رخ میدهند ندارید.

**** : غیر فعال سازی کد مفابله با خطاء با استفاده از دستور فوق نه تنها در روال فوق عمل میکند بلکه بطور کامل مقابله با خطاء به روش ساختاری را غیر فعال می سازد. یعنی قبل از اینکه خطاهای ایجاد شده بوسیله اداره کننده و نه CLR در برنامه بکار گرفته شوند باید اداره کننده های خطاء را فعال سازید.

اگر بخواهیم خطاهای ایجاد شده در یک روال را غیر فعال سازیم (یعنی خطاها را نادیده بگیریم) از عبارت On Error GoTo -1 استفاده میکنیم. این عبارت از CLR می خواهد خطاهای روال جاری و هر گونه روالی که CLR فراخوانی میکند و اداره کننده خطاء ندارند را نادیده بگیرد. در واقع CLR اقدام به پاکسازی خطاء میکند, در صورتیکه از این دستور استفاده کنیم اداره کننده خطاء فقط برای روال جاری معتبر است, زیرا پس از اتمام روال, اداره نمودن خطاء به وضعیت معمول خود بازمی گردد.

_H2_
18-07-2007, 10:10
سلام بر جماعت شیفتگان VB (آخرین ورژن!)
ما هم دوباره برگشتیم و فعلاً دوباره برای فضولی در خدمت هستیم!!!!! :31:
با اجازه دوست عزیزم کاربر anvar.net، میگویم بروبچ این On Error را زیاد تحویل نگیرند، بلد باشید چگونه کار میکند و از آن باید چطور استفاده کرد ولی زیاد استفاده نکنید!!! کمی دندان برروی جگر شفیقتان بگذارید تا دوستمان دستور جدید Try Catch را توضیح دهند، آنوقت تا دلتان خواست مدام Try Catch تایپ کنید.! :10:

bad_boy_2007
18-07-2007, 13:35
ممنون بسيار عالي و کامل بود :11:

am_merman01
19-07-2007, 01:38
لطفاً مسئولان سایت بگن من چطور میتونم این پست رو حذف کنم؟

MMR_1344
25-07-2007, 07:16
دوستان خوب سلام
من تازه میخوام با VB.net کارکنم و تازه شروع کردم از آقای H2 که این سایت رو معرفی کردن متشکرم از ارسال آموزشهای اين سايت هم بسيار سپاسگذارم

_H2_
25-07-2007, 10:19
سلام

دوستان خوب سلام
من تازه میخوام با VB.net کارکنم و تازه شروع کردم از آقای H2 که این سایت رو معرفی کردن متشکرم از ارسال آموزشهای اين سايت هم بسيار سپاسگذارم
عضویتتان را در سایت تبریک میگم! :10::10::10::10::10::10:

am_merman01
26-07-2007, 01:26
لطفاً مسئولان سایت بگن من چطور میتونم این پست رو حذف کنم؟

am_merman01
26-07-2007, 01:48
لطفاً مسئولان سایت بگن من چطور میتونم این پست رو حذف کنم؟

anvar.net
26-07-2007, 18:13
اقايون شرمنده سرم خيلي شلوغه.

امشب سعي ميكنم اين بحث رو تموم كنم. زياد عجله نكنيد

_H2_
29-07-2007, 09:46
به دوستان شفیق پیشنهاد میکنم برخی جملاترا دیگه بکار نبرند و تا کاربر anvar.net همه مان را از تاپیکشان پرت نکرده بیرون دیگه تاپیک شان را بیشتر از این خراب نکنیم!!!! :31:



با اجازه کاربر anvar.net ! قصد فضولی ندارم و اصلاً حوصله تایپ هم ندارم! ولی گفتم کمکی کرده باشم و صرفاً خارج از گود نگویم لنگش کن!
امیدوارم زودتر این پست را ببینید و مطلب دیگری آماده کنید! اگر شما هم در مورد Try نوشتید، خوب باز میگذارید، دو سری توضیح کامل در مورد try خواهیم داشت
در نتیجه با آجازه شما متن زیر را ببرای دستور Try آماده کردم، امیدوارم فایده داشته باشد و مطلبی هرچند کوچک ولی جدید به دانسته های عظیم دوستان بیافزاید.
---------------------------------------------------------------
دستور Try:
این دستور برای هندلینگ خطاها و انجام عمل مورد نظر در قبال خطایی خاص است، خطاها اگر هندلر نشوند موجب Runtime Error در برنامه نهایی میشوند.
ولی در کل همیشه بهتر است تا از بروز خطا جلوگیری شود، چون اتفاق افتادن خطا و هندلینگ آن کاری پر هزینه است و باعث کاهش سرعت و کارآیی برنامه نهایی میشود.

مثلاً وقتی که متغییر شی ای دارید که احتمال هم دارد خالی یا Null یا همان Nothing باشد،
یک راه این است که بدون توجه به مقدار ان از این متغییر استفاده کنیم و بگوییم اگر Nothing باشد فوقش خطایی به وجود می آید که آن را هم هندلر خواهیم کرد.
ولی این تفکر جالبی نیست!
بهنتر است در یک If در اول استفاده چک شود و اگر متغییر مورد نظر Nothing نبود دستورات مورد نظر را انجام دهیم.

در کل مجدداً تکرار میکنم که اغلب اوقات پیشگیری بهتر از درمان است.
سینتکس کلی:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دستورات شما بعد از Try قرار میگیرند، اگر خطایی رخ دهد مابقی دستورات دیگر اجرا نخواهد شد و پرشی خواهیم داشت به اولین بلوک Catch ای که با نوع خطای مورد نظر هماهنگی داشته باشد (توضیح بیشتر خواهم داد! فعلاً این را در نظر بگیرید که بلوک های متعدد Catch چیزی مثل ساختار Select Case عمل میکنند)یعنی به محض اینکه خطا با اولین بلوک مچ شود همان بلوک اجرا میشود و از کلیه بلوک های دیگر صرف نظر خواهد شد.

اگر خطای اتفاق افتاده با هیچ یک از بلوک های Catch مچ نشود، هندلینگ نخواهیم داشت و خطا به سلسله مراتب بالاتر در فراخانی ارسال میشود تا شاید در آنجا هندلر شود و الی آخر ... ( که من به آن میگویم بالا رفتن حبابی!) و اگر به منبع اصلی فراخانی برسد و هنوز هندلر نشده باشد موجب Runtime Error و توقف برنامه شما خواهد شد.

بلوک Finally اگر استفاده شود، تضمین میکند که در هر شرایطی بدون توجه به وقوع خطا - عدم وقوع خطا - اجرا شدن دستورات خروج سریع از قبیل Exit Sub و Exit Function و حتی دستور زیبا و جدید Return ، باز هم در هر شرایطی بلوک بعد از Finally اجرا خواهد شد.
از این بلوک میتوانید برای آزادسازی منابع-بستن ارتباطها-بستن فایلها و... استفاده کنید.
(البته نباید این بلوک را جایگزین دستور جدید و فوق العاده قوی Using کرد.)
------------------------------------------------------------
VB8 برخلاف VB6 به شدت شی گراست و همه چیز با قوانین OOP و پلی مورفیزم اداره میشوند، در این راستا برخلاف VB6 که خطاها ماهیتی عددی داشتند و هر خطا با عددی خاص تایین میشد، اینجا در VB8 خطا ها ماهیتی Class ای دارند و هر خطا خود یا کلاسس ماژول است!!!
هر کلاسس ماژول خطا در دات نت وراثتی است از کلاسس Sysytem.Exception و شما هم میتوانید برای خود خطاهاتی سفارشی درست کنید (وچه بهتر که وراثتی باشد از همان کلاسس) فعلاً کاری با چگونگی به وجود آوردن خطای سفارشی نداریم و بحث بر سر رفع آن است!
بلوکهای Catch هم بر اساس کلاس و وراثت کار میکنند!
شما در بلوک Catch یک متغییر به عنوان نماینده خود تعریف میکنید (معمولاً با نام ex)که پس از هندلینگ خطا، شی کلاس خطای مورد نظر درون این متغییر ریخته میشود و تحویل بلوک کد درون Catch شما خواهد شد، این متغییر که حالا حاوی شی خطاست دارای اطلاعات محل و موقعیت و پیغام خطا و... میباشد که اطلاعات دقیق تری به شما و کاربر شما در مورد خطای مورد نظر میدهد.
اینکه کدام بلوک Catch با نوع متغییری که تعریف کرده میتواند خطا را هندلر کند طبق قوانین وراثت است.
نمیخواهم در این پست آموزش مبانی OOP و Polymorphism را بدهم ولی با اجازه اساتید اشاره ای مختصر میکنم:
درخت کاج<-درخت<-گیاه<-جاندار<-ماده و جسم<-چیز و وجود!
هر "درخت کاجی" وراثتی است از "درخت" و هر "درخت" وراثتی است از "گیاه" و...
هر درخت کاجی حتماً یک درخت و یا یک گیاه است!
ولی هر "درختی"، "درخت کاج" نیست!
و هر "گیاهی" هم "درخت کاج" نیست!
همین مسئله در کلاسس های وراثتی هم صادق است!

اگر شما متغییری از نوع "درخت" تعریف کنید میتوانید تمام انواع درخت را در آن جای دهید و
اگر متغییری از نوع "گیاه" تعریف کنید میتوانید علاوه بر تمام درختها تمام گیاه های دیگر را هم در آن جای دهید.
(ریشه ای ترین کلاسس در محیط دات نت کلاسس Object است و هر چیزی را که در دات نت با آن سروکار دارید به صورت مستقیم و غیر مستقیم با چند پله فاصله وراثتی است از نوع Object و درست به همین علت است که وقتی متغییری از نوع Object دارید میتوانید در آن هرچیزی بریزید.)

مثلاً بلاک زیر:
Catch ex As System.IO.DirectoryNotFoundException
میتوانید خطای ناشی از وجود نداشتن پوشه را هندلر کند.
مثلا وقتی دستور پاک کردن فایلی را داده اید ولی اتصلاً پوشه مورد نظر وجود ندارد، خطای فوق اتفاق می افتد.
ولی کلاسس System.IO.DirectoryNotFoundException وراثتی است از کلاسس System.IO.IOException و این هم وراثتی است از کلاسس اصلی System.Exception
در نتیجه اگر خطای DirectoryNotFound اتفاق بیافتد، هر یک از سه بلوک زیر میتوانند خطای مورد نظر را هندلر کنند:
Catch ex As System.IO.DirectoryNotFoundException
Catch ex As System.IO.IOException
Catch ex As System.Exception
و هر سه نوع کد فوق در هندلینگ خطای DirectoryNotFound هیچ فرقی با هم نخواهند داشت و اگر هم هر سه Catch فوق را داشته باشیم اینکه کدامشان خطای DirectoryNotFound را هندلر خواهند کرد صرفا به این ربط دارد که کدام بلوک Catch بالاتر قرار دارد، یعنی مثل ساختار Select Case ، هر کدام که بالاتر باشد خطای DirectoryNotFound را هندلر میکند و بقیه بلوک ها اجرا نمیشود.

درکش راحت است!
یک "درخت کاج" همه اش، اصل وجودش، تمامش یک "درخت" است، به همان اندازه که
یک "درخت کاج" همه اش، اصل وجودش، تمامش یک "گیاه" است! سلسله مراتب وراثتی قابل تفکیک نیستند.
نتیجه اخلاقی آنکه اگر شما یک بلوک Catch ex As System.Exception در آخر بلاکها داشته باشید میتوانید تمام انواع خطاهای رخ داده در بلوک Try را هندلر کنید و نیز اگر یک بلوک فوق در اول بلوک های Catch داشته باشید همه خطا ها را هندلر میکند و مابقی بلوکهای Catch هیچ گاه اجرا نخواهند شد.
------------------------------------------------------------
نکات ریز باقی مانده!
هر ساختار Try باید حداقل یک بلوک Catch یا یک بلوک Finally داشته باشد و نیز طبیعی است که اگر بلوک Catch نداشته باشد هیچ خطایی را هندلر نمیکند.

تا اینجا همه مطالب برای زبان دوقولوی VB.Net یعنی C#.Net هم صادق بود، غیر از آن که بلوک ها در C#.Net با {} شروع و پایان می یابند ولی دستور When مختص VB.Net است و شما میتوانید مثل بلاک If Then با آن عمل کنید و علاوه بر نوع متغییر، شرطی برای ورود به Catch هم تایین کنید.

مطلب آخر آنکه که هندلینگ فقط در بعد از دستور Try وجود خواهد داشت! (خود بلوک Try) یعنی اگر کد شما در محل بلاکهای Catch یا بلاک Finally مجدداً باعث بروز خطا شود، این خودش خطایی جدید است و سلسله مراتب بالارفتن حبابی را طی خواهد کرد. ولی Try-Catch تودرتو به هر شکل مجاز است!

در جوار دات نت جون خوش بگذره! :10:

bad_boy_2007
29-07-2007, 10:11
ممنون _H2_ عزيز .
مثل هميشه کامل و دقيق بود.
اميدوارم شما و Avant عزيز به ارائه مطالب مفيدتون ادامه بدين :20:

چند تا سوال داشتم

__________________________________________________ ________________________________

اولي اينه که کلا منظور از Handle و Handling چيه ؟ يه چيزايي مبهم ميدونم ولي واسم گنگه اگه يه کوچولو راهنماييم کني ممنون ميشم :11:

__________________________________________________ ________________________________

و دوميش :



(البته نباید این بلوک را جایگزین دستور جدید و فوق العاده قوی Using کرد.)

ميشه در مورد دستور Using توضيح بدين ؟

__________________________________________________ ________________________________



مثلاً وقتی که متغییر شی ای دارید که احتمال هم دارد خالی یا Null یا همان Nothing باشد،
یک راه این است که بدون توجه به مقدار ان از این متغییر استفاده کنیم و بگوییم اگر Nothing باشد فوقش خطایی به وجود می آید که آن را هم هندلر خواهیم کرد.
ولی این تفکر جالبی نیست!
بهنتر است در یک If در اول استفاده چک شود و اگر متغییر مورد نظر Nothing نبود دستورات مورد نظر را انجام دهیم.

در حالاتي که خطا به ندرت پيش مياد مثلا کانکشن برقرار نشه ، بهتر نيست اين کار رو به پردازش استثناء واگذار کنيم ؟

__________________________________________________ ________________________________


اگر خطای اتفاق افتاده با هیچ یک از بلوک های Catch مچ نشود، هندلینگ نخواهیم داشت و خطا به سلسله مراتب بالاتر در فراخانی ارسال میشود تا شاید در آنجا هندلر شود و الی آخر ... ( که من به آن میگویم بالا رفتن حبابی!) و اگر به منبع اصلی فراخانی برسد و هنوز هندلر نشده باشد موجب Runtime Error و توقف برنامه شما خواهد شد.


يعني اگه يک تابع رو فراخواني کنم که در اون تابع خطا رخ بده و در بلوک Try موبوط به اون خطاي مورد نظرم با هيچيک از خطاهاي مورد نظر بلوکهاي Catch مطابقت نداشته باشه ، پردازش خطا به دنبال بلوک Catch اي که با خطا مطابقت داره در روال فراخوان ميگرده ؟ (اگه اينطوره که اين دات نت خيلي با کلاسه !) حالا فرض کن پردازش استثنايي تو روال فراخوان نداشته باشيم (در روال فراخوان و روالهاي بالاتر) اونوقت خطا در نظر گرفته نميشه ديگه نه ؟

_H2_
29-07-2007, 10:33
اولي اينه که کلا منظور از Handle و Handling چيه ؟ يه چيزايي مبهم ميدونم ولي واسم گنگه اگه يه کوچولو راهنماييم کني ممنون ميشم :11:

هندلینگ را من به معنی عمومی "قلاب کردن-تور انداختن" استفاده کردم! یک دفعه شما خطا را هندلر میکنید و یک دفعه رویداد را، مثلاً زمانی که رویداد Click را هندلر میکنید




ميشه در مورد دستور Using توضيح بدين ؟

حالا بزارید از دست این Try راحت بشیم! دل انگیز بابا!
ولی مثل دستور Dim است ولی پایانه استفاده از شی با End Using مشخص میشود و فقط هم برای اشیایی قابل استفاده است که رابط نابودسازی را پیاده سازی کرده باشند.




در حالاتي که خطا به ندرت پيش مياد مثلا کانکشن برقرار نشه ، بهتر نيست اين کار رو به پردازش استثناء واگذار کنيم ؟

تشخیصش با شماست! اگر مثل باز کردن کانکشن به ندرت پیش می آید یا مثلاً فقط یک بار قرار است کد اجرا شود استفاده از Try بهتر است
ولی اگر احتمال وقوعش زیاد است و نیز کد مثلاً در یک حلقه بارها و بارها تکرار میبشود یا در وب توسط هزاران کاربر همزمان اجرا میشود بهتر است دقت بیشتری کنید.




يعني اگه يک تابع رو فراخواني کنم که در اون تابع خطا رخ بده و در بلوک Try موبوط به اون خطاي مورد نظرم با هيچيک از خطاهاي مورد نظر بلوکهاي Catch مطابقت نداشته باشه ، پردازش خطا به دنبال بلوک Catch اي که با خطا مطابقت داره در روال فراخوان ميگرده ؟

دقیقاً !!! که گقتم، من نامش را گذاشته ام بالارفتن حبابی!



(اگه اينطوره که اين دات نت خيلي با کلاسه !)

پس چی! فکر کرده اید با چغندر قند طرف هستید!



حالا فرض کن پردازش استثنايي تو روال فراخوان نداشته باشيم (در روال فراخوان و روالهاي بالاتر) اونوقت خطا در نظر گرفته نميشه ديگه نه ؟
اینن را هم گفتم! خطا به صورت سراسری اعلام میشود و موجب runtime Error و در نتیجه نمایش پنجره مربوطه و حتی در ورژن های گذشته موجب بسته شدن برنامه میشود.

تست کنید متوجه میشود
مثلاً در رویداد Form_Load بنویید
Dim i As Integer
i = 0
i = 0 \ i

و برنامه را کامپایل کنید و EXE اش را اجرا کنید، متوجه میشوید.

bad_boy_2007
29-07-2007, 19:41
ممنون h2 جان بابت وقتي که براي پاسخ به سوالاتم گزاشتي :11:

am_merman01
30-07-2007, 02:52
H2 جان استاد گرامی به خاطر آموزش جالبت بی نهایت متشکرم.:11:

ولی ممکن یه راهنمایی کوچولو بکنی که چه طور میشه به کد خطای مورد نظر دست پیدا کرد؟
و در ضمن توی کجای MSDN میشه متن پیغام مربوط به هر کد خطا رو پیدا کرد؟:41:

یه سئوال دیگه هم داشتم که البته خیلی به دستور try ربط نداره ولی...
با چه تابعی میشه موقع بروز خطا صدای هشدار رو از بلنگوی موجود در کیس فعال کرد؟ منظورم چیزی به غیر از تابع Beep
هستش چون این تابع با اسپیکر کار میکنه یا شاید هم من بلد نیستم ازش استفاده کنم!!!!

_H2_
30-07-2007, 10:17
سلام


ولی ممکن یه راهنمایی کوچولو بکنی که چه طور میشه به کد خطای مورد نظر دست پیدا کرد؟
و در ضمن توی کجای MSDN میشه متن پیغام مربوط به هر کد خطا رو پیدا کرد؟:41:

دل انگیز جانً! همان متغیری که به عنوان نماینده تحویل گرفتن کلاسس خطا معرفی میکنید! یک کلاسس تحویل میگیرد که شامل کلیه اطلاعات لازم است! :31:
مثلاً اگر نام متغییر ex باشد آنگاه
ex.Message
پیغام خطا را میدهد

ex.StackTrace
اطلاعات پشته فراخانی ها تا محل خطا را میدهد

ex.Source
منبع خطا را میدهد

ex.InnerException
اگر خطاها حالت تودرتو و پله کانی داشته باشند و مثلاً یک خطا باعث بروز یک خطای دیگر شود و... این کلاسس خطای ریشه را میدهد که خود یک کلاسس خطا است!

ex.HelpLink
یک لینک توضیح در وب یا کامپیوتر شخصی که توضیح بیشتری در مورد خطا میدهد و شما را رهتنمایی میکند (در صورت وجود!)

و....

هر کلاسس خطا برحصب نوع میتواند اطلاعات بیشتری به شما بدهد ....



یه سئوال دیگه هم داشتم که البته خیلی به دستور try ربط نداره ولی...
با چه تابعی میشه موقع بروز خطا صدای هشدار رو از بلنگوی موجود در کیس فعال کرد؟ منظورم چیزی به غیر از تابع Beep
هستش چون این تابع با اسپیکر کار میکنه یا شاید هم من بلد نیستم ازش استفاده کنم!!!!
یک تابع API میشناختم! الآن حضور ذهن ندارم! و یادم نیست از اسپیکر استفاده میکرد یا بلندگوی مادر بورد؟!
میتوانم پیدایش کنم و تست کنم!
ولی بوق هایی که از اسپیکر پخش میشوند در صورت نصب نبودن کارت صوتی به صورت خودکار از مادر بورد پخش میشوند.

am_merman01
31-07-2007, 02:56
H2 عزيز باز هم سلام و باز هم دستت درد نكنه
ولي مشكل من با كارت صداي آن برده كه معمولاً نصب ميشه ولي تو خيلي از ادارات اسپيكري وجود نداره كه بشه ازش صدا پخش كرد .
اگه بتوني تابعي معرفي كني خيلي ممنون ميشم.

_H2_
01-08-2007, 10:06
سلام
در VB.Net خط زیر را به سر ماژول کد نویسی خود اضافه کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

سپس میتوانید با دستوری مثل (Beep(400,1000 کار کنید، عدد اول فرکانس است و دومی زمان پخش
اگر دقت کنید میتوانید ارگ هم بسازید! چون مهمترین معیار یعنی فرکانس را هم دارید.

am_merman01
01-08-2007, 12:35
H2 جان بازهم دستت درد نکنه و مثل همیشه گل کاشتی:10::11::31:
در ضمن ایده ساخت ارگ فکر جالبیه واسه تفریح بد نیست

anvar.net
03-08-2007, 00:16
آقای H2 ممنون, مثل همیشه جامع و کامل بود, من یه چزهایی تایپ کرده بودم که گرچه کامل نیست ولی گفتم بذارم بهتره.

anvar.net
03-08-2007, 00:24
در ضمن ایده ساخت ارگ فکر جالبیه واسه تفریح بد نیست

یه سمپل گذاشتم ببین, جالبه

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

anvar.net
03-08-2007, 00:25
در ضمن ایده ساخت ارگ فکر جالبیه واسه تفریح بد نیست

یه سمپل گذاشتم ببین, جالبه


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

anvar.net
03-08-2007, 00:52
Try \ Catch
در روش ساختاری مقابله با استثناء از بلوکهای Try برای فعال کردن رسیدگی به استثناء استفاده میشود. یک بلوک Try متشکل از کلمه کلیدی Try است که بدنبال آن بلوک مربوط به استثناء قرار میگیرد. بلوک Try عباراتی را که میتوانند موجب استثناء شوند و عباراتی را که در صورت رخ دادن یک استثناء نباید اجرا شوند را در خود احاطه میکند, بلافاصله بعد از بلوک Try چند بلوک Catch قرار میگیرند (البته ممکن است هیچ بلوکی نیز وجود نداشته باشد). هر بلوک Catch تصریح کننده یک پارامتر استثناء است و نشان دهنده نوع استثنایی است که باید بلوک به آن رسیدگی کند. اگر پارامتر استثناء حاوی یک نام پارامتر اختیاری باشد, رسیدگی کننده Catch میتواند از آن پارامتر برای برقراری تعامل با یک شئ استثناء گرفتار شده استفاده کند.

بطور اختیاری میتوان از یک بلوک Catch بدون پارامتر استفاده کرد. در این صورت تمام استثناء ها گرفتار میشوند.
پس از بلوک Catch آخر, بلوک اختیاری Finally قرار میگیرد. این بلوک حاوی کدی است که صرفنظر از اینکه استثنائی رخ داده یا خیر همیشه اجرا میشود.
هنگامیکه متد فراخوانی شده در برنامه ای, یک استثناء تشخیص دهد یا اینکه CLR متوجه مشکلی شود, متد فوق یا خود CLR یک استثناء براه می اندازد. نقطه ای از کد برنامه که در آن استثناء رخ داده نقطه Throw نامیده میشود.
در صورتیکه در بلوک Try خطایی رخ دهد, بلوک به کار خود پایان داده و کنترل برنامه به اولین رسیدگی کننده Catch پس از بلوک Try منتقل میشود. پس از یافتن Catch مناسب با استثنای رخ داده, رسیدگی کننده های Catch باقی مانده در نظر گرفته نمیشوند. اگر هیچ استثنایی در یک بلوک Try رخ ندهد, CLR تمام بخشهای رسیدگی کننده به استثناء در بلوک فوق را کنار میگذارد و بعد از عبارت Try \ Catch اجرا میشود.




برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


***** کردن استثناء ها :
برای گرفتن نوع استثناء ها میتوان متغیری از نوع Exception تعریف کرد سپس محتویات آنرا نمایش داد.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در دستور بالا متغیر ex تمام استثناء هایی که توسط بلوک Catch گرفته میشوند را در خود نگه میدارد. با استفاده از عبارت Type در هر بلوک Catch میتوان نوع خطایی که باید گرفته شود را مشخص کرد.

Catch ex As System.IO.FileNotFoundException
با استفاده از دستور when میتوان بیشتر خطاها را ***** کرد

Catch ex As نوع استثناء when متغیر=?
Or
…………………………. When Err.number=?
هر دستور Try \ Catch میتواند یک دستور Finally نیز داشته باشد.اگر این بلوک وجود داشته باشد حتما اجرا میشود (حتی اگر هیچ خطایی رخ ندهد یا اینکه توسط دستور exit try از Try \ Catch خارج شده باشیم).
مثال : سرریز


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

دو کلاس مهم مشتق شده از کلاس مبنای System.Exception کلاسهای applicationexception و Systemexception هستند,
کلاس applicationexception یک کلاس مبناء است که برنامه نویس میتواند با بسط آن اقدام به ایجاد انواع داده استثناء با توجه به نیازهای برنامه خود بکند.
CLR اقدام به ایجاد Systemexceptionها میکند. این عمل میتواند در هر نقطه ای از اجرای برنامه رخ دهد. استثناءهای زمان اجرا از کلاس Systemexception مشتق میشوند. در واقع یکی از مزایای استفاده از سلسله مراتب کلاس استثناء این است که یک رسیدگی کننده Catch میتواند یک نوع خاصی از استثناء ها را گرفتار کند.
کلاس Exception
کلاس فوق دارای چند خصوصیت مهم است :

Message : این خاصیت پیغام خطایی مبنی بر یک شئ استثناء در خود ذخیره میکند. این پیغام میتواند پیغام پیش فرض با نوع استثناء یا پیغام تهیه شده باشد و با رخ دادن استثناء به سازنده شء Exception ارسال گردد.
Stacktraces : این خاصیت حاوی رشته ای است که نشاندهنده پشته فراخوانی متد میباشد. محیط اجرایی لیستی از تعداد فراخوانی های متد در خود نگهداری میکند. رشته Stack…. ارائه کننده لیست این متدها است که هنوز اجرای آنها در زمان رخ دادن استثناء به پایان نرسیده است.
Innerexception : بطور کلی از این خاصیت برای منحرف کردن شئ های استثناء گرفتار شده در کد استفاده میشود. (بیشتر در برنامه های کتابخانه کلاس استفاده میشود)
Helplink : مشخص کننده مکان فایل کمکی در ارتباط با مشکل رخ داده است. اگر چنین فایلی وجود نداشته باشد مقدار آن Nothing میشود.
Source : مشخص کننده نام برنامه ای است که در آن استثناء اتفاق افتاده است.
TargetSite : مشخص کننده متدی است که استثناء در آن رخ داده است.

GetBaseException : این متد با قابلیت تغییر, یک آدرس برای خطای اولیه که ایجاد شده است بازمیگرداند؛ یعنی خطایی که زنجیره ای از خطاها را باعث شده است. شئ بازگردانیده شده از نوع Exception است.

انواع خطاهای استاندارد
نوع خطاء Exception : نوع پایه Object : کلاس مبنا برای تمامی خطاها است
نوع خطاء SystemException : نوع پایه Exception : کلاس مبنا برای تمامی خطاهای ایجاد شده بوسیله CLR است.
نوع خطای IndexOutOfRange Exception : نوع پایه SystemException : زمانیکه اقدام به دسترسی به عنصری در یک آرایه میکنید که وجود ندارد این خطاء بوسیله CLR ایجاد میشود.
نوع خطای NullRefrence Exception : نوع پایه SystemException : در صورت اقدام به ارجاع به یک شئ بدون اعتبار این خطاء بوسیله CLR ایجاد میشود.
نوع خطای InValidOperation Exception : نوع پایه SystemException : این خطاء به وسیله متدی رخ میدهد که شئ متد در یک وضعیت بدون اعتبار است.
نوع خطای Argument Exception : یک نوع خطای کلاس مبنا برای تمامی خطاهای آرگومان است.
نوع خطای ArgumentNull Exception : نوع پایه ArgumentException : این خطاء زمانی بوسیله متدهای یک شئ رخ میدهد که یک مقدار Null برای یک آرگومان عرضه میکنید که این آرگومان اجازه نمیدهد آرگومان Nothing باشد.
نوع خطای ArgumentOutOfRange Exception : نوع پایه Argument Exception : زمانی بوسیله یک متد ایجاد میشود که یک یا چند آرگومان در محدوده معتبر قرار ندارند.
کلاسهای استثناء تعریف شده از سوی کاربر
در صورتیکه مایل به ایجاد انواع خاصی از کلاسهای باشیم که مشکلات خاص برنامه های ما را کنترل کنند میتوانیم استثناء های جدیدی تعریف کنیم. این استثناء ها بطور مستقیم یا غیر مستقیم از کلاس مبنای applicationexception مشتق میشوند.
استثناءهای تعریف شده از سوی کاربر باید :
از کلاس applicationexception بدست بیایند.
دارای یک نام کلاس باشند که در انتهای آن عبارت exception وجود داشته باشد و 3 سازنده در آن اعلان شود. 1 سازنده پیش فرض, 1 سازنده که یک آرگومان رشته ای (پیغام خطاء) دریافت کند و سازنده ای که یک آرگومان رشته ای و یک آرگومان exception (پیغام خطاء و شئ داخلی خطاء) دریافت نماید.
ایجاد خطای سیستم :
اگر بخواهیم یک خطای سیستم را شبیه سازی کنیم یکی از اعداد رزرو شده برای سیستم را استفاده میکنیم. یعنی باید متد Raise را با یکی از اعداد 0 و 512 فراخوانی کنیم.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در صورتیکه روال فوق را مقدار 5 فراخوانی کنیم, خطای Invalid Procedure Call Or Argument ایجاد میشود, این خطاء معمولا زمانی رخ میدهد که تعداد آرگومانهای غلط را به روال انتقال میدهیم.

درصورتیکه بخواهیم یک خطاء ایجاد کنیم که خطای تعریف شده کاربری باشد, میتوان مقدار ثابت vbObjectError را به عدد خطاء اضافه کنیم.مقدار ثابت فوق -2147221504 است.

Err.Raise(vbObjectError + ExceptionNum)
برای تعیین خطای تعریف شده توسط کاربر یا تشخیص خطاهای سیستم از خطای کاربری باید ثابت vbObjectError را از خصوصیت Number سئ Err کم کنیم.

در صورتیکه مقدار بدست آمده عددی بین 0 و 65535 باشد خطای فوق یک خطای تعریف شده توسط کاربر است در غیر اینصورت خطا یک خطای سیستم Vb است.

bad_boy_2007
08-08-2007, 08:19
دستت درد نکنه Avant عزيز :11:
تا نصفه خوندم الان بايد برم بعد که برگشتم کامل ميخونم و سوالامو مثل هميشه ميفرستم :31::31:

_H2_
08-08-2007, 09:41
سلام
گفتم مجدداً مقداری فضولی کنم و بحث خطا را ببندم! امیدوارم جنبه کمکش افزون باشد!

دستور Try و On Error برای گیر انداختن و رفع رجوع خطا است ولی چگونه میتوان یک خطا را پیش آورد؟
چرا باید برنامه نویس دستی خودش یک خطا به وجود آورد؟ مگر سری را که درد نمی کند ...؟!
جوابش میشود به همان علتی که کلاسس های خود دات نت خطا را به وجود می آورند! (خودم میدونم نمی خواد تشکر کنید خیلی جوابش کامل و جامع بود! :31:)

مثالی میزنم:
شما یک برنامه ساده محاسبه فاکتوریل نوشته اید و مثلاً آن را Dll کرده اید و به دوست شفیقتان برای استفاده تحویل داده اید! این دوست شفیق شما نامردی میکند و عدد منفی به ورودی تابع شما میدهد! (یاد آورم میشوم طبق قوانین شفیقانه زبان شیرین ریاضی فاکتوریل منفی تعریف نشده است) در نتیجه شما هم نامردی میکنید و در درون تابعات اگر عدد ورودی منفی بود یک خطای خوشکل و کاملاً به جا تحویلش میدهید.!
از شوخی گذشته معمولاً وقتی کدی مینویسید و کد شما در شرایط استاندارد مود نیازش استفاده نمیشود پسندیده است که شما خطایی مرتبط را به وجود آورید.
مثل همین فاکتوریل عدد منفی یا تابعی برای تبدیل تاریخ نوشته اید ولی استفاده کننده از کد شما عدد ماه را 13 میدهد! و....
از فلسفه وجودی که بگذریم شما میتوانید با کمک کلمه کلیدی Throw یک خطا را به وجود آوردید (برعکس Try که خطای به وجود امده را خفه میکرد!)

سینتکسش هم ساده است
Throw X
که X یک نمونه، وهله، (New شده) از کلاسس خطا است،
طبیعتاً هر کلاسسی موقع New شاید یک سری پارامتر از شما بگیرد که با کلاسس دیگر فرق دارد،
مثلاً کلاسس های خطا عموماً Message را میگیرند که با آن شما میتوانید پیغام توضیحی در مورد دلیل خطا را کاملاً به کنترلر در بیاوردید.
حتی میتوانید برای خطاهایی که در برنامه تان به وجود می آید و هیچ نمونه آماده ای در دات نت ندارند خودتان با وراثت از کلاسس System.Exception خطای سفارشی بسازید
مثلاً اگر من میخواستم تابع فاکتوریل را بنویسم این کد را مینوشتم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در این مورد من از کلاسس خطای داخلی System.ArgumentOutOfRangeException استفاده کردم که مخصوص خطای خارج از محدوده بودن یکی از آرگومانهای ورودی است و آن عبارت String که به سازنده اش دادم یعنی "value" مخصوص این کلاسس خطا است و شامل نام پارامتر ورودی مشکل دار است، کلاسس فوق از این نام String ای برای ساخت پیغام خطا استاندارد استفاده میکند و متن پیغام میشود:
Specified argument was out of the range of valid values.
Parameter name: value
اگر در زمان New کردن کلاسس فوق من به جای "value" نام "AAA" را میدادم متن پیغام خطا میشد:
Specified argument was out of the range of valid values.
Parameter name: AAA
(این صرفاً برای نمونه بود و فقط مخصوص کلاسس مذکور است)

میتوان خطاهای تودرتوی پله ای نیز داشت، طوری که خطا خطای دیگر را سبب شود و همه به صورت ذنجیره وار حفظ شوند و...
سعی کنید کلاسس های خطای استاندارد و مخصوص پر استفاده را در دات نت بشناسید و در صورت نیاز به پرتاب یک خطا، از کلاسس با مسمایی برای این کار استفاده کنید (کاربر anvar.net در پست 69 خود لیست کلاسس های خطای معروف را آورده اند در نتیجه من دوباره کاری نمیکنم)
(تمام مطالب فوق برای C#.Net هم صادق است ولی در C#.Net کلمه کلیدی مورد نظر با حروف کوچک باید نوشته شود یعنی به شکل throw و در VB.Net فرقی ندارد ولی استانداردش با T بزرگ است)
حالا میگم یک حالی میدهد بعد از این همه صغرا و کبرا و قصه حسین کرد شبستری، یک نابغه کشف نشده ای بیاید و بگوید:
"من دستور Throw را درست مینویسم و New هم کرده و پارامترها را صحیح میدهم ولی نمیدانم چرا هر کاری میکنم باز کاپیوتر خطا می دهد!!!!" :18:

نتیجه اخلاقی آنکه این بار که با خطایی روبرو شدید به جای نگاه کردن به آن به چشم یک مزاحم، ببینید حرفش چیست و چه مطلبی را گوشزد میکند و علاوه بر اینها از چه نوع و چه کلاسسی است.
فکر کنم با پست های کاربر anvar.net و این پست مرجع خوبی در مورد خطا در دات نت نوشته شد!

در آخر اگر دوستان میبینند جسارتی میکنم و شوخی میکنم به صرف آن است که مطالب کسل کننده نشود و دوستان و سروران گرامی راحت تر و با حوصله بیشتری بتوانید جفنگیات مرا بخوانید! (شما به دل نگیرید برادر! حساب شده بید! :31:)
موفق و شاد و بدون خطا باشید. :10:

bad_boy_2007
09-08-2007, 19:55
H2 و Avant عزيز خسته نباشيد
بسيار عالي بود بخصوص آخراي بحث H2 :31:

am_merman01
13-08-2007, 03:13
H2 جان باز هم مثل همیشه گل کاشی.
این ایجاد کردن یا همون پرتاب کردن خطاها چیز جالبیه باعث میشه بیشتر با خطاها آشنا بشیم.
ولی این مستر بیلی هم خیلی حالش خوش نیست آخه مگه آدم حالش بده که برای خودش سردرد درست کنه؟

anvar.net
07-09-2007, 00:06
دوستان این بحثها رو ادامه بدیم یا نه؟

البته اگه طالبش باشید فقط تکنیکها رو مگیم و از سخن پراکنی (فارسی را پاس بداریم!!!) پرهیز میکنیم.

منتظر جوابم........................................ ...............

khaiyam
07-09-2007, 17:17
بله لطف می کنید اگر ادامه بدید

am_merman01
10-09-2007, 01:46
من بالاخره از شمال برگشتم نميدونيد دوري از تكنولوژي چقدر سخت بود.
بگزريم انتظار داشتم بعد از دوماه دوري اينجا خيلي تغيير كرده باشه ولي ظاهراً ساير دوستان و اساتيد محترم هم مثل من رفته بودند مسافرت انشاء ا... هرچه زود تر بر ميگردند و به ادامه بحث مي پردازند كه ما خيلي بهش نياز داريم.
به هر حال از زحمات گذشته و آتي همه دوستاني كه سعي در به پا داشتن اين تاپيك داشته اند بينهايت تشكر ميكنم

_H2_
11-09-2007, 10:04
سلام
با اجازه کاربر anvar.net، در یکی از پستها راجب دستور فوق صحبتی شد که من به بعداً پاسش دادم و این هم توضیح.
- - - - - - - - - - - - - - - - - - - - - - - - -
دستور Using بسیار شبیه دستور Dim است.
با این تفاوت که پایان استفاده شی را تایین میکند.
یعنی شی نمونه سازی شده شما با Using با تضمین 100% در هر شرایط در End Using نابود خواهد شد و اشاره گر مربوطه آزاد خواهد شد.

ولی استفاده از Using راه و رسمی دارد!
1- چون Using باید روی اشاره گر شی قفل کند، در نتیجه باید در همان خط اول شی نمونه سازی شود و پر شود و این امر را نمیتوان به خطوط بعد محول کرد و اصلاً اشاره گر شی در بدنه Using در حالت ReadOnly قرار دارد و نمیتوانید چیزی در آن بریزید.!
2- شی مورد نظر باید واسط نابودسازی را همراه داشته باشد (System.IDisposable) یعنی برای هر نوعی که واسط مذکور را شامل نشود نمیتوان از Using استفاده کرد.
فهمیدن آنکه شی مورد نظر واسط مذکور را پیاده سازی کرده یا نه هم بسیار راحت است، کافیست به Object Browse در منوی View مراجعه کنید (دوست قدیمی و قدرتمند شده VB کارها) Object Browse تمام اطلاعات یک کلاسس را به واضحی و دقت تمام در اختیارتان قرار میدهد و البته راه دیگری هم دارد، کافیست دستور Using را برای نوع مربوطه تایپ کنید، اگر نوع مربوطه واسط نابودسازی را پیاده سازی نکرده باشد، ویرایشگر قدرتمند VB.Net این امر را تشخیص میدهد و زیر دستوراتتان خطی میکشد، طوری که انگار دستورتان غلط املایی دارد!

طبق دو قانون فوق کدهای زیر ایراد دارند!


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

و کد صحیح اینها هستند


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

باید توجه داشته باشید که هیچ چیز نمیتواند مانع اجرای End Using شود چه خطا و چه خروج نابهنگام
مثلاً در کد زیر هم باز End Using اجرا میشود!


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در نتیجه اگر کسی کد زیر را بنویسید، گرچه از نظر دستوری صحیح است و قاعدتاً ایرادی ندارد ولی بسیار خنده دار و مسخره خواهد بود!


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

استفاده از Using به جای Dim عادت بسیار پسندیده ای است و به شدت مورد سفارش مایکروسافت است
میتوان دو کد زیر را معادل دانست، گرچه کاملاً معادل نیستند ولی بسیار شبیه هم عمل خواهند کرد و فقط در یک تک مورد جزئی تفاوت دارند.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



امیدوارم توانسته باشم کار و هدف کلمه کلیدی فوق را خوب توضیح داده باشم و در آخر تمام موارد فوق در C#.Net نیز صادق است ولی یک کم تفاوت نوشتاری Syntax وجود دارد.

am_merman01
12-09-2007, 04:15
با عرض تشكر خدمت اساتيد عزيز .
ميشه اگه ممكنه بحث رو با صحبت در مورد برنامه نويسي شي گرا ادامه بديد(ببخشيد كه بي ادبي كردم).

anvar.net
13-09-2007, 00:46
ممنون از آقای H2 واسه بحثهای توپش



ميشه اگه ممكنه بحث رو با صحبت در مورد برنامه نويسي شي گرا ادامه بديد


با اینکه من میخواستم واسه DirctX یا Xna مطالبی آماده کنم ولی باشه واسه برنامه نویسی شی گرا یک چیزهایی میذارم. البته صبر داشته باش



ببخشيد كه بي ادبي كردم


زیاد سخت نگیر بچه ها خودی هستند

am_merman01
13-09-2007, 02:32
من هم خيلي دوست دارم درباره DirctX يه چيزهايي ياد بگيرم ولي هنوز با مفاهيم پايه مشكل دارم.

am_merman01
14-09-2007, 00:43
با آرزوي موفقيت براي همه اساتيد عزيز.
بي ادبيه ولي ميخوام بگم من يه مقاله در مورد DirctX دارم اگه صلاح بدونيد آپلود كنم.

anvar.net
14-09-2007, 00:55
دوست عزیز بذار ببینیم چی هست
در ضمن زبان مقاله, حجم و عنوانش هم بذار
ممنون

am_merman01
15-09-2007, 09:46
مقاله فارسي و با حجم حدود 650 KB و در غالب pdf هستش .
سعي ميكنم همين امروز يه جا آپلود كنم.

am_merman01
16-09-2007, 23:58
اين هم لينك دانلود

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

anvar.net
17-09-2007, 01:18
دوست عزیز من که نتونستم دانلودش کنم.

اگه ممکنه یه جای دیگه آپلودش کن

خدا خیرت بده

_H2_
17-09-2007, 09:52
سلام
من دانلود کردم! شاید قبلاً خراب بوده و اگر بار دیگر تست کنید جواب دهد.
یک pdf نیمه با شخصیت یک و نیم مگی است! در مورد کدنویسی DirectX8 در محیط VB6 .
در تاپیک های دیگر هم اعلام کرده ام و اینجا هم چون بحثش پیش آمده میگویم تا آنها که نمیدانند خوشحالی شان از کار کردن دات نت افزون شود!
مایکروسافت یک سری ابزارآلات مخصوص کد نویسی DirectX در محیط دات نت داده که کد نویسی در دات نت را خیلی ساده میکند که همراه کدهای نمونه حجمی بیش از 400 مگ دارد و البته با یک ADSL به راحتی دانلود میشود و دانلودش را به تمام دات نت کارها توسیه میکنم.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

hamedy
12-06-2008, 18:37
فردا :D امتحان داشتم جزوه هم نداشتم !! اینا رو note برداری کردم ! خیلی ممنون.. خیلی صواب بردین P: