PDA

View Full Version : سوال: چگونه یک رویداد را به عنوان شرط در نظر بگیریم؟



ghayour
سه شنبه 24 مرداد 1391, 13:32 عصر
سلام
چگونه میشه یک رویداد رو مثل رویداد کلیک Button رو به عنوان شرط در نظر بگیریم. یعنی اگر مثلا روی button کلیک کرد دیگر رویداد mouse leave آن Button اجرا نشود (غیر فعال شود) و اگر روی فرم کلیک کرد رویداد mouse Leave آن Button فعال شود؟

ghayour
سه شنبه 24 مرداد 1391, 14:13 عصر
چجوری باید متغیر تعریف کنی؟ نمی گذاره که؟

این یک مثال از کدی هست که می خوام؟

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button1.Left = 100
End Sub

Private Sub Button1_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.MouseHover
Button1.Left = -40
End Sub

Private Sub Button1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.MouseLeave
Button1.Left = -60
End Sub

Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
Button1.Left = -60
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Button1.Left = -60
End Sub
End Class

در این کد همه رو با هم انجام میده و به این ترتیب هیچ وقت Button وسط نمیاد!!

مثل Tablet PC Input Panel در ویندوز 7 می خوام باشه.
این برنامه رو وقتی که ضربدر می زنی به گوشه ی ویندوز میره.
این هم آدرسش:
start>All Programs>Accessories>Tablet PC>Tablet PC Input Panel

Saman_12
سه شنبه 24 مرداد 1391, 14:20 عصر
ببخشید من منظورتون رو اشتباه فهمیدم الان یه نمونه میزارم شاید بتونه کمک کنه :


Private isclose As Boolean
Private oldloc As Point
Private Sub frmmain_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

If Not isclose Then e.Cancel = True Else e.Cancel = False

oldloc = Me.Location

isclose = True

Me.Location = New Point(((0 - Me.Width) + 50), Me.Top)
End Sub

Private Sub frmmain_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick

If isclose Then Me.Location = oldloc : isclose = False
End Sub

ghayour
سه شنبه 24 مرداد 1391, 14:57 عصر
میشه این نمونه ای رو که گذاشتید توضیح دهید.
من برای اشیا داخل فرم می خواستم با این حال این هم خوب بود.
لطفا یک کد هم برای اشیا داخل فرم بذارید که به جز رویداد کلیک، رویداد mouse Hover و Mouse Leave هم داشته باشد. در صورت امکان با توضیح(چون من مبتدی هستم).

Saman_12
سه شنبه 24 مرداد 1391, 15:26 عصر
لازم نیست کار خواستی انجام بدین کافیه یه متغییر عمومی تعریف کنید بعد هم هر جا لازمه مقدار کنونی left ابجکت رو بهش بدین و بعد با یک حلقه آبجکت رو تا جایی که مد نظرتون هست انتقال بدید در آخر هم جایی دیگه مقدار left برابر مقدار قبلیش قرار میدین! با حلقه که بلدین کار کنین پس حله(جاییش رو مشکل دارین بگین!)

ghayour
سه شنبه 24 مرداد 1391, 15:57 عصر
اگه بخواد به همون صورتی که گفته بودید (بدون رویداد های mouse hover و mouse leave) نیازی به حلقه و متغیر عمومی نیست، اما وقتی که از این دو رویداد استفاده میشه حتما باید دستور شرطی نوشت تا در صورتی که یک رویداد اجرا شد، رویداد متناقض با اون اجرا نشه.

Saman_12
سه شنبه 24 مرداد 1391, 15:57 عصر
استفاده از حلقه هم الزامی نداره اما برای زیبایی خوبه :

Private IsClcik As Boolean
Private Oldbtnleft As Int32
Private Sub btn1_Click(sender As System.Object, e As System.EventArgs) Handles btn1.Click

If Not IsClcik Then

IsClcik = True
Oldbtnleft = btn1.Left

For iLeft = btn1.Left To btn1.Left + (btn1.Width / 2) Step 0.000025

btn1.Left = iLeft
Next

For iLeft = btn1.Left To (0 - btn1.Width) + (btn1.Width / 2) Step -0.1

btn1.Left = iLeft
Next
Else

IsClcik = False

For iLeft = btn1.Left To btn1.Left - (btn1.Width / 3) Step -0.000025

btn1.Left = iLeft
Next

For iLeft = btn1.Left To Oldbtnleft Step 0.1

btn1.Left = iLeft
Next
End If
End Sub


برای مثال تو این کد اول میایم چک میکنیم که کاربر کلیک کرده یا نه اگر نه یه متغییر رو true میکنم بعد هم دکمه رو جابجا میکنیم و برای بار دوم که کلیک میشه اون متغییر true هست پس دکمه رو بر میگردونیم سر جاش.

ghayour
سه شنبه 24 مرداد 1391, 16:12 عصر
این کد زیبایی هست اما هنوز مشکلم برطرف نشده. اگر توی Tablet PC Input Panel دقت کرده باشید وقتی که موس رو روی برنامه وقتی که کنار ویندوز هست میبریم یکمی بیشتر خودش رو نشون میده و وقتی که موس رو از روی آن می بریم، سر جایش برمی گرده. من می خواهم اینگونه نیز باشد اما وقتی که این دو حالت اضافه میشه کدها با هم متناقض میشن.

Saman_12
سه شنبه 24 مرداد 1391, 16:26 عصر
این کد زیبایی هست اما هنوز مشکلم برطرف نشده. اگر توی Tablet PC Input Panel دقت کرده باشید وقتی که موس رو روی برنامه وقتی که کنار ویندوز هست میبریم یکمی بیشتر خودش رو نشون میده و وقتی که موس رو از روی آن می بریم، سر جایش برمی گرده. من می خواهم اینگونه نیز باشد اما وقتی که این دو حالت اضافه میشه کدها با هم متناقض میشن.
کافی بود همون قسمت اول کد رو تو رویداد مورد نظر مینوشتید :
Private IsClcik As Boolean
Private Oldbtnleft As Int32
Private Sub btn1_Click(sender As System.Object, e As System.EventArgs) Handles btn1.Click

If Not IsClcik Then

IsClcik = True
Oldbtnleft = btn1.Left

For iLeft = btn1.Left To btn1.Left + (btn1.Width / 2) Step 0.000025

btn1.Left = iLeft
Next

For iLeft = btn1.Left To (0 - btn1.Width) + (btn1.Width / 2) Step -0.1

btn1.Left = iLeft
Next
Else

IsClcik = False
Ishover = False

For iLeft = btn1.Left To btn1.Left - (btn1.Width / 2.2) Step -0.000025

btn1.Left = iLeft
Next

For iLeft = btn1.Left To Oldbtnleft Step 0.1

btn1.Left = iLeft
Next
End If
End Sub

Private Ishover As Boolean
Private Sub btn1_MouseHover(sender As Object, e As System.EventArgs) Handles btn1.MouseHover

If IsClcik And Not Ishover Then

Ishover = True

For iLeft = btn1.Left To btn1.Left + (btn1.Width / 2.2) Step 0.000025

btn1.Left = iLeft
Next
End If
End Sub

Private Sub btn1_MouseLeave(sender As Object, e As System.EventArgs) Handles btn1.MouseLeave

If IsClcik And Ishover Then

Ishover = False

For iLeft = btn1.Left To btn1.Left - (btn1.Width / 2.2) Step -0.000025

btn1.Left = iLeft
Next
End If
End Sub

ghayour
سه شنبه 24 مرداد 1391, 16:45 عصر
یک مشکل کوچیک داره و اون هم اینه که بار اول که روش کلیک می کنی جایی که باید برود، نمی رود و باید بعد از اینکه کلیک کردی یک بار روی آن وایستی تا رویداد mouse hover آن کامل اجرا شود بعد از آن وقتی کلیک کنی دستور درست انجام میشه.
اگه وقتی که فرم اجرا میشه button کنار فرم باشه خیلی بهتره!!

Saman_12
سه شنبه 24 مرداد 1391, 16:53 عصر
یک مشکل کوچیک داره و اون هم اینه که بار اول که روش کلیک می کنی جایی که باید برود، نمی رود و باید بعد از اینکه کلیک کردی یک بار روی آن وایستی تا رویداد mouse hover آن کامل اجرا شود بعد از آن وقتی کلیک کنی دستور درست انجام میشه.
اگه وقتی که فرم اجرا میشه button کنار فرم باشه خیلی بهتره!!

تست کردم مشکلی نداره واسه اسن که از اول گوشه باشه کافیه تو فرم لود اینو بنویسی :
btn1.PerformClick()

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

ghayour
سه شنبه 24 مرداد 1391, 17:44 عصر
با اینکه اون مشکلی که گفتم هنوزم هست و الآن هم با گذاشتن این کد در لود فرم همچنان با شروع برنامه باتون کاملا سمت چپ نیست. با این حال از شما خیلی خیلی متشکرم.:قلب:

Saman_12
سه شنبه 24 مرداد 1391, 18:36 عصر
با اینکه اون مشکلی که گفتم هنوزم هست و الآن هم با گذاشتن این کد در لود فرم همچنان با شروع برنامه باتون کاملا سمت چپ نیست. با این حال از شما خیلی خیلی متشکرم.:قلب:

Public Class ExButton : Inherits Button


Public Property IsEx As Boolean = False

Private IsClcik As Boolean
Private _Expanded As Boolean
Public Property Expanded As Boolean
Get

Return _Expanded
End Get
Set(value As Boolean)

_Expanded = value

If IsEx Then
If Not IsClcik Then

IsClcik = True

OldLeft = Me.Left

Dim newleft As Int32 = (0 - Me.Width + Showvalue)


For i = Me.Left To Me.Left + Exvalue Step Speed

Me.Left = i
Next

For i = Me.Left To newleft Step -Speed

Me.Left = i
Next

Else

IsClcik = False
isenter = False

For i = Me.Left To Me.Left - Exvalue Step -Speed

Me.Left = i
Next

For i = Me.Left To OldLeft Step Speed

Me.Left = i
Next
End If
End If
End Set
End Property

Public Property Showvalue As Int32 = 15
Public Property Exvalue As Int32 = 50
Public Property Speed As Decimal = 0.005

Private OldLeft As Int32 = Me.Left
Private Sub ExButton_Click(sender As Object, e As System.EventArgs) Handles Me.Click

If IsEx Then
If Not IsClcik Then

Me.Expanded = True
Else

Me.Expanded = False
End If
End If
End Sub

Private isenter As Boolean
Private Sub ExButton_MouseEnter(sender As Object, e As System.EventArgs) Handles Me.MouseEnter

If IsEx Then
If IsClcik AndAlso Not isenter Then

isenter = True

For i = Me.Left To Me.Left + Exvalue Step (Speed / 100)

Me.Left = i
Next
End If
End If
End Sub

Private Sub ExButton_MouseLeave(sender As Object, e As System.EventArgs) Handles Me.MouseLeave

If IsEx Then
If isenter Then

isenter = False

For i = Me.Left To Me.Left - Exvalue Step -(Speed / 100)

Me.Left = i
Next
End If
End If
End Sub
End Class


کافیه این کلاس رو تو برنامه تون اد کنید بعد خاصیت IsEx رو ترو!
واسه اینکه از اول گوشه باشه تو فرم لود expanded رو true کنید

ghayour
سه شنبه 24 مرداد 1391, 19:58 عصر
یعنی پروژه جدید باز کنم؟ کدهای قبلی لازم نیستن؟
کدهای اتصال کلاس به فرم و باتون رو چی بنویسم؟
IsEx چیه و کجا باید true کنم؟
expanded چیه و کجا باید True کنم و چگونه بنویسم؟
لطفا کدهای دیگه رو هم بذارید.

Saman_12
سه شنبه 24 مرداد 1391, 20:37 عصر
یه نمونه آپلود کردم بدون حلقه اما شما اگر خواستی باید خودت یه کنترل دکمه بنویسی :

ghayour
چهارشنبه 25 مرداد 1391, 20:42 عصر
سلام. ببخشید که باز هم در این مورد سوال میکنم!!
وقتی که یک کامپوننت کلاس بر اساس کدی که شما نوشتید اضافه می کنم از این راه کلاس را به حالت button تغییر میدم.

91317


و Button را هم از این راه از حالت System.Windows.Forms.Button به Test_Ex.ExButton تغییر میدم.

91315
91316


اما بعد از تغییر، پروژه یا فرمم اینجوری میشه!!

91318


لطفا راه درست تغییر باتون از حالت System.Windows.Forms.Button به Test_Ex.ExButton رو و همچنین کارهایی که در آن پروژه ای که ضمیمه کردید انجام دادید و ما باید در پروژه خودمان هم انجام بدیم رو بگید.

ghayour
جمعه 27 مرداد 1391, 12:53 عصر
لطفا سوالمو پاسخ بدید!!
ضمنا هر چی گشتم نحوه ساخت کاستوم کنترل رو پیدا نکردم اگر کسی آدرسی داره بگذاره وگرنه یک تایپک بزنم.

Saman_12
جمعه 27 مرداد 1391, 13:46 عصر
و Button را هم از این راه از حالت System.Windows.Forms.Button به Test_Ex.ExButton تغییر میدم.خوب نباید این کار رو بکنید!

خودم هم سرچ کردم چیزی ندیدم اما تا اونجایی که حافظه ام یاری میکنه قبله چند مورد دیده بودم(از چند مورد یکم بیشتر)

این یه نمونه هست(البته ارجاع به codeproject هست)

http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CEkQFjAA&url=http%3A%2F%2Fwww.codeproject.com%2FArticles%2F 26622%2FCustom-Button-Control-with-Gradient-Colors-and-Ext&ei=gBEuUJKoB8rP4QSQq4DABQ&usg=AFQjCNGc89VbHQaSAAOyP65T4ZPTEePJfA