PDA

View Full Version : سوال: افزودن رویداد به اشیا در حال اجرا



benighted.boy
یک شنبه 13 اردیبهشت 1388, 18:54 عصر
با سلام خدمت تمام دوستان و اساتید گرامی
قبل از هر چیز عذر خواهی میکنم اگه تاپیک تکراری میباشد.من خیلی search کردم اما چیزی دستگیرم نشد.
من یک windows form control درست کردم و اون رو در برنامه به صورت run time و با توجه به مقداری که از دیتابیس میخونه میسازم و مختصاتی رو به صورت پیش فرض به اون میدم.
حالا من نیاز دارم که از یه سری از رویدادها مثل Mouse down,Mouse click و ... استفاده کنم .
اما مشکلم اینجاست چون اشیا رو به صورت آرایه میسازم نمیتونم رویدادی رو بهشون نسبت بدم.
میخواستم بدونم 1.چه طور میتوان فهمید که روی کدام یک از اشیا کلیک شده
2.چه طور میتوان از رویدادها استفاده کرد؟
توی فروم msdn چیزی در مورد add handler گفته بود اما خوب سر در نیاوردم و کمی گنگ بود :لبخند:
با تشکر.

arman_Delta2002
دوشنبه 14 اردیبهشت 1388, 22:15 عصر
Const Nuppe As Integer = 20
Dim Nupud(Nuppe) As Button
Dim Nupp As Button

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Panel1 As New System.Windows.Forms.Panel
Panel1.Parent = Me
Panel1.AutoScroll = True
Panel1.Location = New System.Drawing.Point(12, 12)
Panel1.Name = "Panel1"
Panel1.Size = New System.Drawing.Size(152, 235)
Panel1.TabIndex = 2
Const laius As Integer = 120
Const kaurgus As Integer = 25
For I As Integer = 1 To Nuppe
Nupp = New Button
Nupp.Parent = Panel1
Nupp.Size = New Size(laius, kaurgus)
Nupp.Text = CType(I, String)
Nupp.Top = CType((I - 1) * 30, Integer)
Nupp.BackColor = Color.CadetBlue
Nupp.Visible = True
AddHandler Nupp.Click, AddressOf Nupp_Click
Nupud(I) = Nupp

Next I

End Sub
Private Sub Nupp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
MsgBox("Click" & sender.ToString)
End Sub

benighted.boy
دوشنبه 14 اردیبهشت 1388, 22:28 عصر
با سلام . دوست عزیز ممنون از پاسخت .اما مشکل من جای دیگست

Dim i As Integer = 2
Dim PoolDesk(i) As DeskComponent.PoolDesk
Private Sub LoadDesk()
GetDeskID()
Dim cnn As New SqlConnection(My.Settings.PoolClubDBConnectionStri ng)
Dim cm As New SqlCommand
Dim Reader As SqlDataReader

For j = 1 To i
ReDim PoolDesk(i)
PoolDesk(j) = New DeskComponent.PoolDesk
PoolDesk(j).BackColor = System.Drawing.Color.Silver
PoolDesk(j).Name = "PoolDesk" & i.ToString
With cm
.Connection = cnn
.CommandText = "SELECT DeskXLocation,DeskYLocation,DeskTypeIndex FROM tblDesk Where DeskNumber ='" & j & "'"
If .Connection.State <> ConnectionState.Open Then
.Connection.Open()
End If
Reader = .ExecuteReader
If Reader.Read Then
If Not Reader.Item("DeskXLocation") Is DBNull.Value Then
x = Val(Reader.Item("DeskXLocation").ToString)
End If
If Not Reader.Item("DeskYLocation") Is DBNull.Value Then
y = Val(Reader.Item("DeskYLocation").ToString)
End If
If Not Reader.Item("DeskTypeIndex") Is DBNull.Value Then
DeskIndex = Val(Reader.Item("DeskTypeIndex").ToString)
End If
End If
.Connection.Close()
End With
PoolDesk(j).Location = New Point(x, y)
'PoolDesk(j).Size = New System.Drawing.Size(220, 170)
Me.Controls.Add(PoolDesk(j))
PoolDesk(j).GetTypeDesk(DeskIndex)
Next

End Sub
اگر دقت کنین اشیا به شکل آرایه تولید میشن و اینکه طولش رو از دیتا بیس میخونه .
در نهایت شیئی که تولید میشه با عنوان یک آرایه است و حالا مشکل در قرار دادن رویداد برای این اشیاست .

benighted.boy
دوشنبه 14 اردیبهشت 1388, 22:42 عصر
فکر کنم جواب سوال رو پیدا کردم.موقع add handler کردن هم میشه از همون آرایه استفاده کرد.
نمونه کد رو کامل اینجا میزارم تا اگر کسی هم نیاز پیدا کرد استفاده کنه

Dim x1, y1 As Integer

Dim x As Integer = 0
Dim y As Integer = 0
Dim DeskIndex As Integer = 1
Dim i As Integer = 2
Dim PoolDesk(i) As DeskComponent.PoolDesk
Private Sub LoadDesk()
GetDeskID()
Dim cnn As New SqlConnection(My.Settings.PoolClubDBConnectionStri ng)
Dim cm As New SqlCommand
Dim Reader As SqlDataReader

For j = 1 To i
ReDim PoolDesk(i)
PoolDesk(j) = New DeskComponent.PoolDesk
PoolDesk(j).BackColor = System.Drawing.Color.Silver
PoolDesk(j).Name = "PoolDesk" & i.ToString
With cm
.Connection = cnn
.CommandText = "SELECT DeskXLocation,DeskYLocation,DeskTypeIndex FROM tblDesk Where DeskNumber ='" & j & "'"
If .Connection.State <> ConnectionState.Open Then
.Connection.Open()
End If
Reader = .ExecuteReader
If Reader.Read Then
If Not Reader.Item("DeskXLocation") Is DBNull.Value Then
x = Val(Reader.Item("DeskXLocation").ToString)
End If
If Not Reader.Item("DeskYLocation") Is DBNull.Value Then
y = Val(Reader.Item("DeskYLocation").ToString)
End If
If Not Reader.Item("DeskTypeIndex") Is DBNull.Value Then
DeskIndex = Val(Reader.Item("DeskTypeIndex").ToString)
End If
End If
.Connection.Close()
End With
PoolDesk(j).Location = New Point(x, y)
PoolDesk(j).Size = New System.Drawing.Size(220, 170)
Me.Controls.Add(PoolDesk(j))
PoolDesk(j).GetTypeDesk(DeskIndex)
AddHandler PoolDesk(j).Click, AddressOf PoolDesk_MouseUp
AddHandler PoolDesk(j).Click, AddressOf PoolDesk_MouseDown
AddHandler PoolDesk(j).Click, AddressOf PoolDesk_MouseMove
Next

End Sub
Private Sub PoolDesk_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
x1 = e.X
y1 = e.Y
End Sub
Private Sub PoolDesk_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
PoolDesk(i).Location = New Point(e.X + PoolDesk(i).Location.X - x1, e.Y + PoolDesk(i).Location.Y - y1)
End If
End Sub
Private Sub PoolDesk_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)

x1 = 0
y1 = 0
End Sub

با این دستورات میتونیم شیئی رو در حالت اجرا تغییر مکان بدیم و مختصات اون رو بدست بیاریم

RAHA_AVA
سه شنبه 15 اردیبهشت 1388, 12:04 عصر
قبل از خط ایجاد اشیات اینو بنویس بعد برای هر رویداد یک ساب تعریف کن امیدوارم دست گفته باشم

نام سابADDRESSOF , رویداد .نام شیADDHANDLER

benighted.boy
سه شنبه 15 اردیبهشت 1388, 15:00 عصر
دوست عزیز من هم همین کار رو کردم . فقط یک مسئله هستش که اشیا رو میسازه . رویداد رو تشخیص میده اما index اون شیئ رو بر نمیگردونه
و روی هر شیئ که کلیک میکنم در واقع عمل رو بروی آخرین شیئ ساخته شده انجام میده نه شیئ جاری .در رابطه با اشیاء استانداردی مثل bottum درست کار میکنه اما در مورد کنترلی که من ساختم نه .:ناراحت:
کسی راه حلی میدونه ؟

benighted.boy
پنج شنبه 17 اردیبهشت 1388, 18:03 عصر
یعنی هیچ کس راه حلی نداره واسه اینکه بشه تشخیص داد الان روی کدام یک از کنترل ها کلیک شده ؟
من کنترلی دارم که تعداد عمل محاسباتی انجام میده و باید معلوم شه که در حال حاضر کدام کنترل اینکار رو انجام میده تا تغییرات را بتوان در دیتابیس ثبت کرد .

حامد مصافی
پنج شنبه 17 اردیبهشت 1388, 18:07 عصر
در رویداد مریوطه یک آرگومان با نام serder ارسال می شود که حاوی کنترل فرستنده پیغام است. شما با بررسی این شی می توانید پی به این نکته ببرید که کدام یک از کنترل ها کلیک شده است.

benighted.boy
پنج شنبه 17 اردیبهشت 1388, 18:11 عصر
خوب مشکل درست همینجاست ، در تمام کنترلها یک مقدار برای sender داده میشه اونم DeskComponent.PoolDesk هستش . در صورتی که حتی زمان نام گذاری اسم شیئ هم به صورت آرایه ثبت میشه .

حامد مصافی
پنج شنبه 17 اردیبهشت 1388, 18:40 عصر
DeskComponent.PoolDesk نوع مقدار دریافتی شماست:


void ..._Click(sender ...
{
DeskComponent.PoolDesk con = sender as DeskComponent.PoolDesk;

MessageBox.show (con.Name);
}

sari-1369
جمعه 18 اردیبهشت 1388, 00:30 صبح
سلام .

ببین ، من خودم اینتوری با اشیائ آرایه ای کار می کنم .

فرض کن می خوام یه آرایه 10 تایی از نوع لیبل بسازم و یه رویداد mouse move واسش بنویسم و وقتی موس روی هر کدوم از لیبل ها رفت رنگش سفید بشه .

شروع می کنیم : اول ساخت اشیا




Dim lbl(10) As Label
Dim id As Integer
----------------------------------------------------
lbl(id) = New Label
lbl(id).Tag = id ===========> تو این خط ایندکس هر لیبل رو تو تگش ذخیره می کنیم که وقت استفاده بدونیم کدوم لیبل کلیک شده یا موس روش قرار داره
Me.Controls.Add(lbl(id))

AddHandler lbl(id).MouseMove, AddressOf label_MouseMove =====> اینجا هم یه رویداد تعریف می کنیم

id=id+1



در هر دفعه اجرای کد بالا یک لیبل ساخته میشه که میتونی تو یه حلقه قرار بدی و همه رو بسازی .

حالا میایم سراغ رویداد mouse move و تشخیص لیبل .

حالا اینجا می تونیم از اون ایندکسی که تو tag ذخیره کردیم استفاده کنیم .





Dim la As Label
Dim index As Integer
------------------------------------------
Protected Sub label_MouseMove(ByVal sender As System.Object, ByVal e As System.EventArgs)
la = CType(sender, Label)
index = la.Tag
lbl(index).ForeColor = Color.White
End Sub








یه نمونه برنامه هم واست گزاشتم

Cybersilent
سه شنبه 22 دی 1388, 22:16 عصر
با تشکر از راهنماییتون
اماااا...
من می خوام یه آرایه از کنترل وینسوک بسازم که خصوصیت tag رو نداره حالا باید چیکار کنم میشه یه راهنمایی کنید؟
لطفا:خجالت:

sari-1369
چهارشنبه 23 دی 1388, 01:47 صبح
من اینجا از پروپرتی تگ استفاده کردم ، شما میتونی توی اون کنترل از یه پروپرتی دیگه که استفاده نمیشه بهره بگیری ، چمیدونم مثل Text , ... یا مثلا روی یه خصوصیتی که توی همه کنترل هات منحصر به فرد هست اونارو تفکیک کنی .

hossein-khoshseyar
شنبه 03 بهمن 1388, 14:40 عصر
دوست عزسز کاری نداره که چرا از پرورتی اس استفاده نمی کنی
موقعی که اون رخداد اتفاق افتاد می تونی توی یه حلقه فور یه دستور شرطی بزاری که



if (e.sender is component(i))

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

اگه باز مشکلی داری بگو تا یه نمونه برنامه از این برات بزارم