PDA

View Full Version : مدیریت اشیایی که از یک کلاس ساخته شده اند



vbapr2005
شنبه 08 مرداد 1384, 01:47 صبح
سلام بچه ها
اولا بگم من عبارت "آرایه کلاس" رو سرچ کردم اما چیز بدرد بخوری گیرم نیومد.
من یه کلاس کتاب بوجود آوردم و حالا میخوام به کاربر این امکان رو بدم که به صورت نامحدود بتونه به کتابها اضافه کنه و یا اونا رو حذف کنه. نمیدونم توی متد های اضافه و حذف کلاسم باید چیکار کنم. لطفا من رو به صورت آماتور راهنمایی کنید.

vbapr2005
شنبه 08 مرداد 1384, 11:28 صبح
البته این هم یه راهیه که میخوام با کمک شما عملیش کنم:
اول اینکه یه آرایه For Example: Book(30000) As clsBook بسازیم بعد یه پراپرتی
Public Property Used As Boolean بسازیم و بعدش هر وقت کاربر دکمه ی Add Book را کلیک کرد یه Public Book(count +1) As New clsBook تعریف کنیم و بعدش هم یدونه از فرم های اطلاعات کتاب اضافه کنیم یعنی بنویسیم:
Dim frmBookInfo as New frmBookInformation تا بتونه اطلاعات کتاب رو وارد کنه. بعدش هم اطلاعات توی فرم جدید رو به پراپرتی های اون کتاب نسبت بدیم.
من این چیزهایی رو که دارم مینویسم امتحان نکردم و فکر میکنم هم که باید یه آرایه ی 30000 تایی باید از فرم اطلاعات کتاب هم تعریف کنیم که آنوقت مثلا بتونیم بگیم:
frmBookInfo(i).txtBookName.Text=Book(i).BookName

حالا لطفا نظرتون رو راجع به این کد بگید و اصلا بگید که به نظر شما این عملی هستش یا نه و اگه میشه متد Remove آن را هم برایم بنویسید چون خودم چیز خاصی به ذهنم نمیرسد.
از همه تون متشکرم.

vbapr2005
شنبه 08 مرداد 1384, 15:41 عصر
من به کمکتون نیاز دارم
لطفا عجله کنید. این خیلی برام مهمه

vbapr2005
یک شنبه 09 مرداد 1384, 14:09 عصر
راستی بچه ها کد های Add Book رو از همین راهی که گفتم نوشتم و خدا رو شکر جواب هم داد
حالا لطفا در مورد Remove هم (مثل Add ) منو کمک کنید!!!

titbasoft
یک شنبه 09 مرداد 1384, 17:18 عصر
ببخشید ولی من تازه الان این تاپیک رو دیدم. برای مقصود شما به نظر من یک راه حل بهتری هم وجود داره و اون استفاده از collection هاست. برای بوجود آوردن و استفاده از اون این مراحل رو انجام بدید:
1) کلاس مورد نظر خودتون رو بسازید. مثلا در اینجا یک کتاب که یک property به نام name داره در نظر گرفته شده:

Public Class Book
Private mvarName As String

Property Name() As String
Get
Return mvarName
End Get
Set(ByVal Value As String)
mvarName = Value
End Set
End Property

End Class

2) یک collection بنویسید که بتونه تعدادی نامحدود از نمونه های کلاس book رو توی خودش نگه داری کنه:

Public Class Books
Inherits System.Collections.CollectionBase

Public Function Items(ByVal index As Int64) As Book
Return Me.InnerList(index)
End Function

Public Sub Add(ByVal newBook As Book)
Me.InnerList.Add(newBook)
End Sub

End Class

3) ازش توی کدتون به این طریق استفاده کنید:

Dim bs As New Books

Dim b1 As New Book
b1.Name = "vb.net core"
bs.Add(b1)

Dim b2 As New Book
b2.Name = "c# core"
bs.Add(b2)

Dim b3 As New Book
b3.Name = ".net framework"
bs.Add(b3)

MsgBox("you have entered " & bs.Count & " Book(s)")

Dim i As Int64
For i = 0 To bs.Count - 1
MsgBox("book no(" & i & ") is " & bs.Items(i).Name)
Next

bs.RemoveAt(0)

MsgBox("you've removed book no(0) so " & bs.Count & " book(s) left")

bs.Clear()

MsgBox("you've removed all books from collection so you have " & bs.Count & " book")
End Sub
امیدوارم به درد بخوره

vbapr2005
یک شنبه 09 مرداد 1384, 19:00 عصر
تیبا جان دستت درد نکنه به خاطر این کد تقریبا بلند بالا
اگه میشه یه توضیحی هم راجع به قسمت های مختلفش بده(ما هنوز آماتوریم!!)
بعد یه چیز دیگه:همونطوری که میدونی ممکنه کاربر بخواد روزی 10 تا کتاب جدید به برنامه اضافه کنه. اونوقت من باید برای هر کتابی که اضافه میکنم اول یه b4 یا b5 یا bi داشته باشم؟ اینجوری که خوب نیست!

titbasoft
یک شنبه 09 مرداد 1384, 20:14 عصر
ببینید برای اینکه بخواهید یک کتاب به مجموعه خودتون اضافه کنید تنها لازمه که یک نمونه جدید از کلاس book بسازید ، اون رو مقدار دهی کنید و به collecction اون رو add کنید.
در مثال زیر اگر روی کلید cmdAddNew کلیک شود یک نمونه از کلاس book ساخته شده و name آن با استفاده از یک textbox به نام txtName مقداردهی میشه ، اون کتاب به مجموعه اضافه میشه و تعداد کتابها در یک label به نام lblCount نمایش داده میشه. در ضمن با استفاده از کلید cmdUpdateList نام تمامی کتابها در یک listbox به نام lstBooks نمایش داده خواهد شد.
* bs که یک نمونه از collection ماست به صورت سراسری تعریف شده.


Private bs as new Books

Private Sub cmdAddNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAddNew.Click
Dim newBook As New Book
newBook.Name = txtName.Text
bs.Add(newBook)
lblCount.Text = bs.Count
txtName.Text = ""
End Sub

Private Sub cmdUpdateList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdUpdateList.Click
lstBooks.Items.Clear()
Dim i As Int64
For i = 0 To bs.Count - 1
lstBooks.Items.Add(bs.Items(i).Name)
Next
End Sub

vbapr2005
یک شنبه 09 مرداد 1384, 21:19 عصر
راست میگی خیلی راه باحالیه
البته فکر کنم اینجوری کاملتر بشه که یه پراپرتی دیگه به نام BookCount هم بذاریم تا اینجوری بتونیم به هر کتابی دسترسی داشته باشیم به علاوه به نظر من باید همین بلا رو سر یه فرم گرفتن اطلاعات هم بیاریم (منظورم اینه که یه frmBookInfo بسازیم و اونو هم همراه با Book جلو ببریم و به هم ربطشون بدیم)
حالا واقعا به نظر شما من کل سیستم کالکشن رو که خودم به صورت دستی ساختم (و البته تو بعضی جاهاش هم موندم) عوض کنم؟
راست میگی
آقا خیلی ممنون بخاطر وقتی که برام صرف کردی. امیدوارم بتونم برات جبران کنم.
اگه بعدا مشکلی داشتم (که حتما خواهم داشت) بازم میپرسم.
ممنونم تیبا جان
واقعا موفق باشی!

titbasoft
یک شنبه 09 مرداد 1384, 22:10 عصر
یه کم گمان می کنم بعضی جاها رو یا من متوجه نشدم یا شما دارید اشتباه عمل میکنید (مثلا درمورد فرم ها) که امیدوارم حالت اول درست باشه اما به هر حال فکر میکنم اگر روند انجام کارتون رو اینجا به طور خلاصه بیان کنید بد نباشه.
در ضمن خواهش میکنم.

vbapr2005
یک شنبه 23 مرداد 1384, 01:35 صبح
سلام تیتبا سافت عزیز
مدتی بود که اینترنت نداشتم. معذرت میخوام
در مورد جواب قبلی باید بگم که صد در صد من داشتم اشتباه عمل می کردم.
من میخوام یه کلاس کتاب داشته باشم و یه کلکسیون کتاب داشته باشم و بتونم به اون کتابا دسترسی داشته باشم و له اونا اضافه کنم(که شما همه ی اینا رو در بالا گفتید. واقعا دستت درد نکنه کمی از تاخیر در جوابم به خاطر همین موشوع بود که بفهمم چی بهم یاد دادید)
حالا من میخوام ببینم چجوری میشه یه کتاب رو پاک کرد
ممنون

titbasoft
یک شنبه 23 مرداد 1384, 10:38 صبح
سلام
مثل متد add یه متد بنویسید به نام remove از یکی از متد های زیر استفاده کنید:

Me.InnerList.RemoveRange()
Me.InnerList.RemoveAt()
Me.InnerList.Remove()

vbapr2005
سه شنبه 25 مرداد 1384, 01:27 صبح
بعد هرکدوم از اینها چه کاری میکنن؟
من فقط از RemoveAt استفاده می کردم که در نتیجه به یه چیز کاملا بی ربط گیر میداد.

titbasoft
سه شنبه 25 مرداد 1384, 14:55 عصر
زمانی که از RemoveAt استفاده می کنید به این نکته توجه داشته باشید کخ چون دارید با index کاری می کنید وقتی یک obeject رو حذف می کنید کل مجموعه دوباره reindex می شه. فرض کنید 3 تا object اضافه کردید و با استفاده از (removeAt(1 شی دوم رو حذف می کنید حالا دیگه ایندکس 2 وجود نداره و شئ ای که قبلا index اش 2 بود حالا 1 شده و اگر (removeAt(2 رو فراخوانی کنید خطا خواهید گرفت.

remove یک object رو میگیره و اگر اون رو پیدا کرد حذفش میکنه
removerange هم که مشخصه یک دسته شئ رو که پشت سر هم هستند حذف می کنه

اما اگر به نکته اولم توجه کنید removeAt از اون 2 تای دیگه برای حذف ساده یک شئ راحت تره!

vbapr2005
چهارشنبه 26 مرداد 1384, 00:15 صبح
خیلی ممنون