PDA

View Full Version : سوال: چگونه صدا زدن یه رویداد در VB.NET



JaVa
شنبه 20 اسفند 1390, 15:54 عصر
با سلام خدمت همگی دوستان...

در ویژوال بیسیک 6 وقتی می خواستیم یه رویداد رو فراخوانی بکنیم از دستور Call استفاده می کردیم.
یه مثل ساده :


Private Sub Command1_Click()
MsgBox "Hello"
End Sub

Private Sub Command2_Click()
Call Command1_Click
End Sub



توی vb.net چطور میشه چنین کاری کرد؟

پیشاپیش تنکیو وری ماچ:لبخندساده:

فرید نجفلو
شنبه 20 اسفند 1390, 16:00 عصر
با همون کد می تونید
ولی چون دو تا پارامتر هم داره باید پارامتر هم بفرستید
اگه فرض رو بر مثال خودتون بذاریم راحترین کد اینه:
Call Command1_Click(Nothing,Nothing)
البته اگر داخل روتین از پارامتر ها مخصوصا e استفاده می شه باید پارامتر صحیح رو هم بفرستید
ولی یک توصیه دارم به جای این کار کدی رو که زیاد صدا می زنید تبدیل به متد یا تابع کنید تا هم آسون باشه هم رشته کا از دستون در نره

JaVa
شنبه 20 اسفند 1390, 16:06 عصر
سلامی دوباره...


ولی یک توصیه دارم به جای این کار کدی رو که زیاد صدا می زنید تبدیل به متد یا تابع کنید تا هم آسون باشه هم رشته کا از دستون در نره

من همین موضوع (متد یا تابع) رو چند باری توی تایپیک ها دیدم ولی یه جواب کامل براش پیدا نکردم .
اگه به موضوع تسلط کامل داری یه تایپیک جدا گانه براش بزار!

باز هم میل خودته به قول دوستان.
باز هم تشکر از پاسختون.

فرید نجفلو
شنبه 20 اسفند 1390, 16:31 عصر
آخه این تسلط نمی خواد
یه موضوع خیلی ساده س
فقط باید وقتی e (یا همون انواع EventArg ) رو می فرستی دقت کنی
اونم که اگه به گرداننده رویداد نگاه کنی می فهمی چه نوعش رو بفرستی

shadi khanum
شنبه 20 اسفند 1390, 21:57 عصر
دوست عزیز شما اگه مثلا یه دکمه ok تو برنامت داری و میخوای اگه کلیک شد یه کاری انجام بده و همچنین میخوای در اثر فشرده شدن ctrl+S هم اون کار اتفاق بیفته دو کار میتونی بکنی..
یا توی رویداد keydown که میخوای مجددا کار ok انجام بشه اسم اون رویدادی که واسه btnOk_click ایجاد شده رو بنویسی(یعنی اون تابع رو فراخوانی کنی) و از اونجایی که مثلا تایع click دکمه دو تا متغیر ورودی میگیره که یکیش button فراخوانی کننده و یکی eventArgs(مشخصات اضافی تر در مورد رویداد کلیک) پس شما جایی که میخوای اون تابع(رویداد) و مجددا فراخوانی کنی چون دکمه ای فشرده نشده که به عنوان ورودی به تابعتون بدی پس ورودی های اون رو nothing ارسال کن ..
btnOk_click(nothing,nothing) منتها اگه توی کدی که برای این رویداد نوشتی از ورودیهای تابع یعنی Sender و e استفاده کردی نباید nothing بفرستی چون تو کدتون Error میده و باید با توجه به اون رویداد متغیر از جنس ورودی بهش بفرستی
اما راه دوم این که به جای اینکه مستقیما توی رویداد کلیک دکمه کد بنویسی و جای دیگه بیای این تابع تولید شده برای کلیک رو فراخوانی کنی، یه تابع به هر اسمی که میخوای بنویس و اون تابع رو هم توی کلیک دکمه هم مثلا keydown فرم فراخوانی کن(با نوشتن اسم تابع و دادن ورودیها در صورت داشتن ورودی) .. این راه بهتره چچون هم خوانایی کدت بیشتر میشه هم اگه فردا روزی خواستی این عملیات ok شدن رو عوض کنی میری تو اون تابع عوض میکنی و هر دو جا(کلیک دکمه و keydown) تغییراتتون اعمال میشه
امیدورام مفید بوده باشه
موفق باشی

sehm67
یک شنبه 21 اسفند 1390, 01:49 صبح
با سلام خدمت همگی دوستان...

در ویژوال بیسیک 6 وقتی می خواستیم یه رویداد رو فراخوانی بکنیم از دستور Call استفاده می کردیم.
یه مثل ساده :


1
2
3
4
5
6
7
Private Sub Command1_Click()
MsgBox "Hello"
End Sub

Private Sub Command2_Click()
Call Command1_Click
End Sub






توی vb.net چطور میشه چنین کاری کرد؟



Button1_Click(sender, e)

فرید نجفلو
یک شنبه 21 اسفند 1390, 10:44 صبح
Button1_Click(sender, e)
دوست عزیز این روش اشتباهه
شما فرض کن از رویداد KeyPress تکست باکس روتین رویداد MouseDown یک دکمه رو صدا بزنی به نظرت پارامتر e درست می فرستی؟!
حتی در زمان کد نویسی هم خطا می گیره

JaVa
یک شنبه 21 اسفند 1390, 10:48 صبح
میشه یکی بگه این e چیه ؟ چکار می کنه ؟ یه مثال بزنه؟:گیج:

فرید نجفلو
یک شنبه 21 اسفند 1390, 11:19 صبح
ببینید فرض کنیم شما می خواید وقتی رو فرم تون راست کلیک شد یه کار خاصی رو انجام بدید.حالا باید کد شما کجا نوشته بشه
شما به نتیجه می رسید که کدتون باید در رویداد MouseClick بنویسید که به صورت زیر تعریف شده
Private Sub Form1_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
MsgBox("Right Click")
End Sub

ولی وقتی کد رو اجرا کنید متوجه می شید وقتی چپ کلیک هم می کنید باز همون کار انجام می شه.شما چطور باید بدونید کدوم دکمه فشار داده شده؟!
اینجاست که e به کمک شما می یاد
بین متد های و پراپرتی های MouseEventArgs یکی به اسم Button وجود داره که مشخص می کنه کدوم دکمه(ها) فشار داده شدن
پس کد شما به شکل زیر تغییر می کنه:

Private Sub Form1_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
If e.Button = Windows.Forms.MouseButtons.Right Then
MsgBox("Right Click")
End If
End Sub


اگه متوجه نشدید یه مثال دیگه بزنم

JaVa
یک شنبه 21 اسفند 1390, 12:56 عصر
سلام مرسی از شما...
در مورد این یکی چطور؟


Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
e.Graphics.DrawString(RichTextBox1.Text, New Font("tahoma", 11), Brushes.Blue, 40, 40)
End Sub

فرید نجفلو
یک شنبه 21 اسفند 1390, 13:29 عصر
خوب می خوای چی بگم
e که از نوع PrintPageEventArgs و رویدا موقع درخواست برای چاپ اتفاق میوفته
e.Graphics هم یک شیئ گرافیکه که در اینجا کارش پشتیبانی از عملیات گرافیکی روی HDCیا Handel of Device Context مربوط به صفحه چاپیه(بحث وارد +GDI میشه)

چون نمیشه شئی گرافیک رو اینجا توضیح داد (به خاطر گستردگی مطلب) اون یه خط رو واسط توضیح می دم

درواق وقتی شما می خواید یه چیزی رو چاپ کنید سیستم به شما یک HDC می ده که می توند هر چی رو که مورد نظرتونه رو اون رسم کنید(شما فرض کنید چیزیه شبیه به انواع Bitmap و یا Image) که دارای طول ، عرض است (مطلابق با اندازه صفحه چاپی مورد نظر) و e.Graphics هم امکانات رسم رو در اختیار شما قرار می ده
متد e.Graphics.DrawString یک متن روی HDC مورد نظر رسم می کنه(یا می نویسه)
پارمتر ها به ترتیب:
متن مورد نظر
فونت نوشته
قلم(رنگ) نوشته
مختصات شروع نوشته (در حالت از راست به چپ معادل بالا و چپ)

البته شک دارم این کد درست کار کنه چون اگه به مقیاس بندی صفحه دست نزده باشید اونو با اینچ(هر اینچ معادل 2.54 سانتیمتر) اندازه گذاری کرده و کاغذی با این ابعاد فکر نکنم مورد نظر شما باشه(40 در 40 اینچ!!! اونم حالا مختصات نوشته است و به احتمال زیاد چیزی بزرگتر از این در میاد)