PDA

View Full Version : سوال: ایجاد کامپوننت در 2008



shocraneh
چهارشنبه 27 خرداد 1388, 10:32 صبح
من می خواهم در حین اجرا با کلیک روی دکمه ای به صورت لیست بازشو در بیاید و
به میزان تعداد رکورد های جدولی خاص, دکمه در حین اجرا در لیست ایجاد شودانشا ا.. قسمتی رو که زیر خط دار کردم خودم بتونم انجام بدم اما قسمت اول سوالم را نمی دانم , آخه گمان نمی کنم چیزی که دیدم ایجاد لیست در حین اجرا باشه . برنامه نویسا کمک کنن

shocraneh
پنج شنبه 28 خرداد 1388, 22:32 عصر
من یک label در حین اجرا درست کردم . واما .. من می خواهم چند بار این عمل n() تکرار بشه به خاطر همین برنامه رو به شکل زیر تغییر دادم اما دیگه نمایشی در گار نیست یا فقط آخرین مورد را نشان می ده

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
i = 1
For Me.i = 1 To 2
Dim l As New Label
With l
Select Case i
Case i = 1
l.Location = New Point(400, 400)
Case i = 2
l.Location = New Point(400, 405)
End Select
.Size = New Size(100, 50)
.AutoSize = True
.Text = "Lable RunTime"
.TabIndex = 0
End With
Controls.Add(l)
Next
End Sub

Mani_rf
شنبه 30 خرداد 1388, 17:04 عصر
سلام.
عجله نکن؛ حالا کو تا تحویل پروژه ها .
روش که به کار بردی یک مشکل کوچک دارد. فقط یک متغیر برای لیبلی هات تعریف کردی.

برای اطلاع شما و دیگر دوستانی که می خوان در زمان اجرا شئ بسازن من یک مثال ساده می زنم.

مواد لازم :
متغیر آرایه ای داینامیک از نوع Object مورد نظر به تعداد لازم .
مختصات دهی برای صحیح برای شئ جدید.
تخصیص عملکر مورد نظر به شئ ایجاد شده.

در نمونه برنامه زیر چند دکمه در زمان اجرا ایجاد می شوند و با کلیک بر روی هر کدام عنوان آن برگشت داده می شود.

ابتدا به یک متغیر از نوع شئ مورد نظر که اینجا Button است نیاز داریم که بتوانیم تعداد آن را به دلخواه کم و زیاد کنیم.

برای تعریف آن در قسمت عمومی فرم آرایه ای بدون تعداد از نوع Button تعریف می کنیم .


Public B() As Button


در مرحله بعد، در قسمتی که می خواهیم Button ها ایجاد شود به این صورت کد نویسی می کنیم (من اینجا تو Form Load نوشتم اگر می خواهید در زمان دیگری Button ها ایجاد شود در Event شئ دلخواه بنویسید)

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

با این فرمان ما تعداد آرایه b را به تعداد 5 عنصر تغییر می دهیم. ReDim B(5)


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


از از اولین عنصر آرایه تا آخرین For I As Byte = 0 To B.GetUpperBound(0)


چون Button جزو کلاس های VB.net است باید در قسمت بعد باید با کلمه کلیدی New آن را بارگذاری کنیم.(I اندیس دکمه ای که قرار است عملیات بر روی آن انجام شد را به ما می دهد.)


B(I) = New Button

از این قسمت شروع می کنیم به تعریف خواص شئ مان.

تعیین اندازه شئ.(من آنرا از کنترل قبلی گرفتم) B(I).Size = Button1.Size

تعیین مکان قرار گیری دکمه If I = 0 Then
B(I).Location = New Point(Button1.Left, Button1.Top + Button1.Height + 10)
Else
B(I).Location = New Point(B(I - 1).Location.X, B(I - 1).Location.Y + B(I -1).Size.Height + 10)
End If

در اینجا من یک دکمه به صورت پیش فرض بر روی فرم اصلی قرار داده ام و مختصات اولین دکمه را به نسبت آن محاسبه کردم. و مابقی را به نسبت قبلی هرکدام.


تعیین عنوان دکمه B(I).Text = "دکمه شماره " & I

مابقی خواصی را که می خواهید تغییر دهید از جمله رنگ ، فونت و ... را نیز در همین قسمت باید مشخص کنید.



در مرحله بعدی باید دکمه ساخته شده را به فرم اضافه کنیم. پس:

Me.Controls.Add(B(I))

توجه : در صورتی که می خواهید دکمه به یک Group Box یا یک Panel اضافه شود بجای Me باید نام آنرا بنویسید.
تا این قسمت دکمه ها ساخته می شوند با اجرای برنامه بر روی فرم دیده می شوند اما بعد از کلیک شدن بر روی آنها هیچ اتفاقی نمی افتد.
برای اضافه کردن Event به دکمه های ابتدا باید یک Sub بنویسیم که موقع زده شدن دکمه آن فراخوانی شود، و یا از رویداد های آماده اشیاء دیگر استفاده کنیم.(دومیش راحت تره)

من روی فرمم یک باتن گذاشتم و رویداد Click آن را به این صورت تعریف کردم.



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(DirectCast(sender, Button).Text)
End Sub


DirectCast(sender, Button).Text باعث می شود تا خاصیت Text دکمه فشرده شده خوانده شود. همه خواص دکمه را از این طریق می توانید به کار گیرید. توجه کنید که اگر می خاهید کنترل دیگری را ایجاد کنید به جای Button نوع آن را بنویسید.

تا اینجا ما عملی که انجام شود را هم مشخص کردیم.
به ادامه حلقه For بر می گردیم و این کد را می نویسیم :

AddHandler B(I).Click, AddressOf Button1_Click



این کد رویداد کلیک Button1 مان را به رویداد کلیک B(I) نسبت می دهد.
و در انتها هم حلقه را می بندیم.

Next


این هم از کد کامل :
امیدوارم مطلب مفیدی بوده باشد.





Public Class Form1

Public B() As Button

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

For I As Byte = 0 To B.GetUpperBound(0)
B(I) = New Button
B(I).Size = Button1.Size

If I = 0 Then
B(I).Location = New Point(Button1.Left, Button1.Top + Button1.Height + 10)
Else
B(I).Location = New Point(B(I - 1).Location.X, B(I - 1).Location.Y + B(I - 1).Size.Height + 10)
End If

B(I).Text = "دکمه شماره " & I

Me.Controls.Add(B(I))

AddHandler B(I).Click, AddressOf Button1_Click
Next
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(DirectCast(sender, Button).Text)
End Sub
End Class






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



موفق باشید...
:لبخند:

shocraneh
شنبه 30 خرداد 1388, 23:32 عصر
با تشکر ,
روی هر کدوم از باتون های ایجاد شده کلیک کنی یک عمل انجام می ده
من می خام رو کلیک هر کدوم کد های متفاوت بنویسم . ؟؟؟
سوال بعدی آخرش من نفهمیدم?!! یه دکمه پایین فرم بود که با کلیک روی ان به
صورت لیست باز شو در می امد .اگه یک list بود چه جوری با کلیک مجدد بسته
می شد . توضیح بدین

Mani_rf
یک شنبه 31 خرداد 1388, 18:06 عصر
:لبخند: باحاله نه؟؟؟؟
دوتا پنل توی هم هستن که بین این دوتا یک دکمه گذاشتم و موقع زدن آن پنل بالا کشیده می شود و موقع دوباره زدن یا انتخاب یک گروه به جای خودش بر می گرده.

برای اینکه هر کلید کار خاصی انجام بدهد هم باید با شرط If یا Select Case مشخص کنی که اگر مثلا نام کلید چیزه خاصی بود آن کار را انجام بده.
مثلاً

DirectCast(Sender,Button).Text = "دکمه اول"

shocraneh
یک شنبه 31 خرداد 1388, 19:57 عصر
:لبخند: باحاله نه؟؟؟؟
دوتا پنل توی هم هستن که بین این دوتا یک دکمه گذاشتم و موقع زدن آن پنل بالا کشیده می شود و موقع دوباره زدن یا انتخاب یک گروه به جای خودش بر می گرده.

خیلی عالی بود:تشویق: . می شه بگی برای فهمیدن دوباره زدن چی کار باید کرد

Mani_rf
دوشنبه 01 تیر 1388, 17:22 عصر
خیلی ساده.
یا یک متغیر مثل Tag خود Buttton را به صورت پیش فرض یک قرار بده ،‌موقع زده شدن چک کند اگر صفر بود یعنی بسته است و باید باز شود و اگر یگ بود باز است و باید بسته شود.

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

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

shocraneh
سه شنبه 02 تیر 1388, 14:31 عصر
با تشکر از حوصله ای که به خرج می دهید
لطفا یه نگاهی به این کد بندازید چرا همش صفر می ده
می خام تعداد دکمه ها رو از اینجا بردارم در واقع تعذاذ سطر ای جدول در sql رو می خام
در ضمن ارتباط پایگاهم درسته
Dim a = ds.Tables("OSTAD").Rows.Count
Label1.Text = a


برای اینکه سایز پنل عوض بشه هر کاری کردم نشد ؟؟؟برای
همین از مخفی کردن استفاده کردم که زیاد جالب نیست
??ضمن اینکه برای عوض کردن لوکیشن باتن 1 مشکل داشتم

می خام به صورت سطری در هر سطر 2 تا
دکمه ایجاد بشه . تا 4 درست میره بقیه رو سطری می زنه ؟؟؟؟



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If (Button1.Tag = 1 Or DirectCast(sender, Button).Tag = 1) Then
Panel1.Show()
Panel1.BackColor = Color.White
'Panel1.AutoSize = True
'Panel1.Size(279, 248)
' ReDim B(a)
ReDim B(6)
Dim k As Integer = 1
For I As Byte = 0 To B.GetUpperBound(0)
B(I) = New Button
B(I).Size = Button2.Size
If I = 0 Then
B(I).Location = New Point(Button2.Left, Button2.Top + Button2.Height - 200)
ElseIf I = 2 * k Then
B(I).Location = New Point(B(I - 2).Location.X, B(I - 2).Location.Y + B(I - 2).Size.Height + 10)
Else
B(I).Location = New Point(B(I - 1).Location.X - B(I - 1).Size.Width - 10, B(I - 1).Location.Y)
End If
B(I).Text = "دکمه شماره " & I
B(I).BackColor = Color.Blue
Panel1.Controls.Add(B(I))
AddHandler B(I).Click, AddressOf Button2_Click
Next
Button1.Tag = 0
DirectCast(sender, Button).Tag = 0
Else
Panel1.Hide()
Button1.Tag = 1
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'MsgBox(DirectCast(sender, Button).Text)
Panel1.Hide()
Button1.Tag = 1
DirectCast(sender, Button).Tag = 1
Dim casesearch As String = DirectCast(sender, Button).Text
End Sub

shocraneh
چهارشنبه 03 تیر 1388, 18:47 عصر
فعلا من روش کارمو عوض کردم و از fade استفاده کردم ولی هر کاری یه قشنگی داره . اگه میشه زودتر به اشکالم رسیدگی کن

Mani_rf
پنج شنبه 04 تیر 1388, 13:59 عصر
چشم...
من چند روزی سرم شلوغه کم تر می توانم بیان تو سایت اما سرم خلوت تر شد حتما همه سوال هات را جواب می دم.

shocraneh
دوشنبه 08 تیر 1388, 19:16 عصر
1-من اشکالام برطرف شد فقط مونده ایجاد پنل باز شو و تغییر لوکیشن همون دکمه بزرگه

البته اگه از کامپوننت زیر بخام استفاده کنم (که به گمانم همین کارو کرده بودید ) علاوه
بر مشکل الوکیشن , سایز رو هم بر نمی گردونه

Private Sub GroupPanel1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupPanel1.Click
GroupPanel1.Tag = 1
'GroupPanel1.Location
If GroupPanel1.Tag Then
GroupPanel1.Height = 200
GroupPanel1.Tag = 0
Else
GroupPanel1.Height = 50
End If
End Sub

2-من بعد از کلیک روی دکمه ران تایم , لیبل ران تایم می سازم و به آنها تکس می دم .
بار اول درست اما برای بار دوم تکس ها را عوض نمی کند مگر انهایی که جدید ساخته
حتی تکس رو که خالی می کنم بازم سفید نشون می ده

shocraneh
جمعه 12 تیر 1388, 22:05 عصر
فقط دومی رو پاسخ بدین .اولی رو از fade استفاده کردم

shocraneh
یک شنبه 21 تیر 1388, 13:26 عصر
کمک !!! ds که درسته ,پس مشکل چیه ؟؟