PDA

View Full Version : سوال: ايجاد يك event عمومي



pooya1072
سه شنبه 04 بهمن 1390, 21:31 عصر
سلام
من يك فرم دارم كه در آن چند تكست باكس و كامند باتون و ليست باكس و غيره وجود دارد . مي خواهم بدانم كه بجز اينكه در قسمت event هاي مختلف مربوط به هر جز يك دستور را بنويسم ، آيا مي شود هر گونه تغيير يا رويدادي را در مجموعه فرم و متعلقات ان به صورت كلي پردازش كرد و آن دستور خاص را اجرا كرد .
مثلاً يك فرم داريم با 20 عدد تكست باكس و 10 عدد button و 5 ليست باكس ...مي خواهم با هرگونه تغيير اعم از كليك ، دبل كليك ، تغيير مقدار ، راست كليك و هر گونه رويدادي (در اين فرم وزير مجموعه آن) كه فكرش را بكنيد caption فرم به "ok" تغيير نام كند .
با تشكر

Hybrid
سه شنبه 04 بهمن 1390, 21:54 عصر
دوست عزیز منظورت رو دقیقا متوجه نشدم ... واسه اینکه یه قطعه کد رو تو قسمت های مختلف از برنامتون استفاده کنین میتونین یه زیربرنامه حاوی کد رو ایجاد کنین و تو قسمت های مختلف برنامه ازش استفاده کنین.

موفق باشید./

pooya1072
چهارشنبه 05 بهمن 1390, 06:47 صبح
بسيار خوب
فرض كنيد توي يك فرم چند كنترل مختلف داريم . اعم از Textbox ، commandButton ، ListBox و خيلي كنترل هاي ديگه. اگر به عنوان مثال روي CommandButton كليك كنيم رويداد CommandButton_Click ايجاد شده و به برنامه ارسال مي شود و يا اگر مقدار تكست باكس رو تغيير بديم چندين رويداد (Event) به برنامه ارسال مي شود. فكر كنيد كه مي خوام در ازاي هر گونه رويداد ... باز هم تاكيد مي كنم.هر گونه رويدادي caption فرم به "My name" تغيير نام كنه.به اين نكته توجه كنيد كه من نمي خوام براي هر رويداد بطور جداگانه دستور Me.Text="My name" رو بنويسم .چراكه بايد براي لا اقل بيش از 10 – 20 رويداد اين عمل را انجام دهم . مي خواهم در ازاي هر تغييري كه در فرم ايجاد مي شود ( منظورم رويداد ايجاد شده در فرم ، تكست باكس و تمام كنترل هاي موجود در فرم است) رويدادي به برنامه ارسال شود و event را تشخيص داده و عمل مورد نظر را انجام دهد.

Hybrid
چهارشنبه 05 بهمن 1390, 10:35 صبح
خوب دوست عزیز این کار خیلی راحته: به تریتیب مراحل زیر رو برو تا به جوابتون برسید .

1) یه پروژه جدید رو ایجاد کنین.

2) ابتدا چند تا Button و چند تا TextBox روی فرمتون قرار بدین...(اسمشون زیاد مهم نیست پس حساس نباشین!)

3) در پنجره SolutionExplorer روی ViewCode کلیک کنید تا Code Editor باز بشه و این کلاس رو که براتون نوشتم را کاملا جایگزین کنین.


Public Class Form1

Private Sub ChangeCaption()
Me.Text = "The Life"
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

For Each ctrl As Control In Me.Controls
If TypeOf ctrl Is Button Then
AddHandler ctrl.Click, AddressOf ChangeCaption
End If

If TypeOf ctrl Is TextBox Then
AddHandler ctrl.TextChanged, AddressOf ChangeCaption
End If
Next

End Sub
End Class

4) برنامه رو دیباگ کرده و نتیجه رو مشاهده کنید.

(( میتونین کنترل های Lisbox و ... رو روی فرم قرار بدین و با یه If اضافه نوشتن داخل بدنه ی For each به نتیجه دلخواهتون برسید ))

موفق باشید./

shadi khanum
چهارشنبه 05 بهمن 1390, 12:35 عصر
دوست عزیز واسه اینکار نیاز نیست به تعداد کنترل هاتون کد کورد نظر رو بنویسی..
اول یه تابع بنویس که توش کد مورد نظرت رو انجام بدی(تغییر عنوان فرم مثلا)، حالا برو تو دیزاین فرمت و همه باتن ها رو انتخاب کن حالا به قسمت رویدادها برو و از کمبوی جلوی click اون تابع که نوشتی رو انتخاب کن..
حالا همه textboxها رو انتخاب کن و همین کار رو برنی رویداد textchang اونها انجام بده و واسه بقیه هم همین طور...
اینجوری فقط یه بار کدتو نوشتی ولی به همه اعمال میشه

Hybrid
چهارشنبه 05 بهمن 1390, 13:02 عصر
دوست عزیز تو تاپیک همیشه سعی میکنم کامل و دقیق توضیح بدم تا دوستان بهتر متوجه شن ، شما هم اگه با کد دوستان رو راهنمایی کنین بهتر میشه >...

دوست عزیز منظور دوست بالایی کدی به شکل زیر هست ولی روش اول رو برین بهینه تر هست ولی این روش هم در بعضی جاها میتونه کمک کنه :


Public Class Form1
Private Sub ChangeCaption()
Me.Text = "Hello World"
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, _
Button3.Click, Button4.Click
ChangeCaption()
End Sub


Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _
TextBox2.TextChanged, TextBox3.TextChanged
ChangeCaption()

End Sub
End Class

موفق باشید./

pooya1072
چهارشنبه 05 بهمن 1390, 13:19 عصر
دارم سعی می کنم یه نمونه پیدا کنم ولی متاسفانه تا حالا گیر نیاوردم

pooya1072
چهارشنبه 05 بهمن 1390, 18:44 عصر
دوست عزیز تو تاپیک همیشه سعی میکنم کامل و دقیق توضیح بدم تا دوستان بهتر متوجه شن ، شما هم اگه با کد دوستان رو راهنمایی کنین بهتر میشه >...
./

با تشكر از دوستان .... باور کنید خیلی سعی کردم که روشن مطرح کنم و کدی برای نمونه قرار بدم ولی واقعیتش نمی دونم چطوری .
ولي ظاهراً سوال من يه مشكلي داره و نتونستم منظورم رو بيان كنم.حالا يه طور ديگه ميگم :
يك فرم و چند كنترل در آن موجود است.مي خوام با هر رويدادي كه در اين فرم ايجاد مي شود يك msgbox باز شده و نوع رويداد را مشخص كنه.يعني مشخص كنه كه آيا اين رويداد كليك بوده ؟ دبل كليك بوده ؟ تغيير مقدار يك تكست باكس بوده ؟ تغيير مكان نشانگر موس بوده ؟ فشار دادن دكمه كيبورد بوده ؟ يا هر نوع رويدادي كه ممكن است براي هر يك از كنترل ها ايجاد شود .
شما برنامه را اجرا مي كنيد و فرم نمايش داده ميشود . ----> msgbox ظاهر شده با متن " form load"
موس را حركت دهيد ------> msgbox ظاهر شده با متن "curser move"
و الي آخر
یه جایی یه چیزی تو این زمینه خوندم که از توابع peekmessageو sendmessage استفاده کرده بود.نمی دونم شاید هم اشتباه کنم.

pooya1072
پنج شنبه 06 بهمن 1390, 16:06 عصر
خب...مثل اينكه اونقدر ها كه به نظر مياد راحت نيست.
در هر حال ضمن تشكر از دوستان اگه كسي چيزي به نظرش اومد بگه .