View Full Version : سوال: چگونه یک رویداد را به عنوان شرط در نظر بگیریم؟
ghayour
سه شنبه 24 مرداد 1391, 14:32 عصر
سلام
چگونه میشه یک رویداد رو مثل رویداد کلیک Button رو به عنوان شرط در نظر بگیریم. یعنی اگر مثلا روی button کلیک کرد دیگر رویداد mouse leave آن Button اجرا نشود (غیر فعال شود) و اگر روی فرم کلیک کرد رویداد mouse Leave آن Button فعال شود؟
ghayour
سه شنبه 24 مرداد 1391, 15: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, 15: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, 15:57 عصر
میشه این نمونه ای رو که گذاشتید توضیح دهید.
من برای اشیا داخل فرم می خواستم با این حال این هم خوب بود.
لطفا یک کد هم برای اشیا داخل فرم بذارید که به جز رویداد کلیک، رویداد mouse Hover و Mouse Leave هم داشته باشد. در صورت امکان با توضیح(چون من مبتدی هستم).
Saman_12
سه شنبه 24 مرداد 1391, 16:26 عصر
لازم نیست کار خواستی انجام بدین کافیه یه متغییر عمومی تعریف کنید بعد هم هر جا لازمه مقدار کنونی left ابجکت رو بهش بدین و بعد با یک حلقه آبجکت رو تا جایی که مد نظرتون هست انتقال بدید در آخر هم جایی دیگه مقدار left برابر مقدار قبلیش قرار میدین! با حلقه که بلدین کار کنین پس حله(جاییش رو مشکل دارین بگین!)
ghayour
سه شنبه 24 مرداد 1391, 16:57 عصر
اگه بخواد به همون صورتی که گفته بودید (بدون رویداد های mouse hover و mouse leave) نیازی به حلقه و متغیر عمومی نیست، اما وقتی که از این دو رویداد استفاده میشه حتما باید دستور شرطی نوشت تا در صورتی که یک رویداد اجرا شد، رویداد متناقض با اون اجرا نشه.
Saman_12
سه شنبه 24 مرداد 1391, 16: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, 17:12 عصر
این کد زیبایی هست اما هنوز مشکلم برطرف نشده. اگر توی Tablet PC Input Panel دقت کرده باشید وقتی که موس رو روی برنامه وقتی که کنار ویندوز هست میبریم یکمی بیشتر خودش رو نشون میده و وقتی که موس رو از روی آن می بریم، سر جایش برمی گرده. من می خواهم اینگونه نیز باشد اما وقتی که این دو حالت اضافه میشه کدها با هم متناقض میشن.
Saman_12
سه شنبه 24 مرداد 1391, 17: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, 17:45 عصر
یک مشکل کوچیک داره و اون هم اینه که بار اول که روش کلیک می کنی جایی که باید برود، نمی رود و باید بعد از اینکه کلیک کردی یک بار روی آن وایستی تا رویداد mouse hover آن کامل اجرا شود بعد از آن وقتی کلیک کنی دستور درست انجام میشه.
اگه وقتی که فرم اجرا میشه button کنار فرم باشه خیلی بهتره!!
Saman_12
سه شنبه 24 مرداد 1391, 17:53 عصر
یک مشکل کوچیک داره و اون هم اینه که بار اول که روش کلیک می کنی جایی که باید برود، نمی رود و باید بعد از اینکه کلیک کردی یک بار روی آن وایستی تا رویداد mouse hover آن کامل اجرا شود بعد از آن وقتی کلیک کنی دستور درست انجام میشه.
اگه وقتی که فرم اجرا میشه button کنار فرم باشه خیلی بهتره!!
تست کردم مشکلی نداره واسه اسن که از اول گوشه باشه کافیه تو فرم لود اینو بنویسی :
btn1.PerformClick()
بهتره واسه این کار یه کنترل سفارشی بنویسی این طوری راحت تری واسه این هم میتونی تو سایت سرچ کنی نمونه زیاده(نمونه واسه یاد گیری نوشتن کاستوم کنترل)
ghayour
سه شنبه 24 مرداد 1391, 18:44 عصر
با اینکه اون مشکلی که گفتم هنوزم هست و الآن هم با گذاشتن این کد در لود فرم همچنان با شروع برنامه باتون کاملا سمت چپ نیست. با این حال از شما خیلی خیلی متشکرم.:قلب:
Saman_12
سه شنبه 24 مرداد 1391, 19: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, 20:58 عصر
یعنی پروژه جدید باز کنم؟ کدهای قبلی لازم نیستن؟
کدهای اتصال کلاس به فرم و باتون رو چی بنویسم؟
IsEx چیه و کجا باید true کنم؟
expanded چیه و کجا باید True کنم و چگونه بنویسم؟
لطفا کدهای دیگه رو هم بذارید.
Saman_12
سه شنبه 24 مرداد 1391, 21:37 عصر
یه نمونه آپلود کردم بدون حلقه اما شما اگر خواستی باید خودت یه کنترل دکمه بنویسی :
ghayour
چهارشنبه 25 مرداد 1391, 21:42 عصر
سلام. ببخشید که باز هم در این مورد سوال میکنم!!
وقتی که یک کامپوننت کلاس بر اساس کدی که شما نوشتید اضافه می کنم از این راه کلاس را به حالت button تغییر میدم.
91317
و Button را هم از این راه از حالت System.Windows.Forms.Button به Test_Ex.ExButton تغییر میدم.
91315
91316
اما بعد از تغییر، پروژه یا فرمم اینجوری میشه!!
91318
لطفا راه درست تغییر باتون از حالت System.Windows.Forms.Button به Test_Ex.ExButton رو و همچنین کارهایی که در آن پروژه ای که ضمیمه کردید انجام دادید و ما باید در پروژه خودمان هم انجام بدیم رو بگید.
ghayour
جمعه 27 مرداد 1391, 13:53 عصر
لطفا سوالمو پاسخ بدید!!
ضمنا هر چی گشتم نحوه ساخت کاستوم کنترل رو پیدا نکردم اگر کسی آدرسی داره بگذاره وگرنه یک تایپک بزنم.
Saman_12
جمعه 27 مرداد 1391, 14: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
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.