PDA

View Full Version : سوال: پاس كردن مقدار از درون يك كلاس به سطح بالاتر



jalalnooritehrani
چهارشنبه 09 بهمن 1387, 15:45 عصر
من به يك مشكل برخورد كردم و آن هم اين بود كه نميدانم چطوري ميتوان يك مقدار يا هر چيز ديگري از درون يك كلاس به بيرون آن پاس بدم

مثلاً من درون برنامه ام يك تكس باكس و يك دكمه دارم وقتي دكمه را ميزنم يك كلاس فرخواني ميشه و يك فرم نمايش داده ميشه و مثلاً درون آن فرم يك تكس باكس با تكس متغير دارم

حالا ميخوام وقتي تكس باكس درون كلاس را عوض ميكنم آن وقت تكس باكس درون برنامه ام تغيير بكنه :متفکر:

mostafaaa
چهارشنبه 09 بهمن 1387, 17:21 عصر
سلام دوست من
برای این کار چند راه حل داری !! بهترینش به نظر من اینه که برای کلاس Child یه Event درست کنی که با تغییر TextBox داخل کلاست، اون Event فراخوانی بشه ، و همراهش مقدار داخل TextBox را به کلاس Parent پاس بدی. مثلا این کلاس رو ببین :

Public Class Sample
Inherits Form
Public Event TxtChanged As EventHandler
Private WithEvents TextBox1 As New TextBox
Sub New()
Me.Text = "Sample form"
TextBox1.Left = 100
TextBox1.Top = 100
Me.Controls.Add(Me.TextBox1)
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
RaiseEvent TxtChanged(sender, e)
End Sub
End Class
برای استفاده از این کلاس هم میتونی از این کد استفاده کنی :

Private WithEvents NewInstance As New Sample
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
NewInstance.Show()
End Sub
Private Sub NewInstance_TxtChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NewInstance.TxtChanged
Me.TextBox1.Text = DirectCast(sender, TextBox).Text
End Sub

jalalnooritehrani
شنبه 12 بهمن 1387, 11:04 صبح
دوست عزيز خيلي ممنون هستم كد شما را نوشتم و به واجب رسيدم
آيا سورسي يا منبع سراغ داري تا بيشتر راجب اين موضوع اطلاعات كسب كنم

من ميتوانم اين ايونت را در پراپرتي كلاس بذارم
وقتي مقدار پراپرتي به يك مقدار خاصي رسيد اين ايونت فراخواني بشه

jalalnooritehrani
شنبه 12 بهمن 1387, 11:11 صبح
من يك ايونت در برنامه ام دارم آيا از كلاس ميتوانم اين ايونت را اجرا كنم

mostafaaa
شنبه 12 بهمن 1387, 11:19 صبح
دوست عزيز خيلي ممنون هستم كد شما را نوشتم و به واجب رسيدم
آيا سورسي يا منبع سراغ داري تا بيشتر راجب اين موضوع اطلاعات كسب كنم

من ميتوانم اين ايونت را در پراپرتي كلاس بذارم
وقتي مقدار پراپرتي به يك مقدار خاصي رسيد اين ايونت فراخواني بشه
بله میتونید ، در واقع یکی مزیت های استفاده کردن از Event هم همینه!

jalalnooritehrani
شنبه 12 بهمن 1387, 12:04 عصر
ميشه راهنمايي كني و مثال بزني
بيشتر در باره
من يك ايونت در برنامه ام دارم آيا از كلاس ميتوانم اين ايونت را اجرا كنم
اطلاعات ميخواهم
مرسي

mostafaaa
شنبه 12 بهمن 1387, 17:40 عصر
سلام دوست من
ببین سوالت کمی نامفهومه ، اگه امکان داره دقیق تر بگو چیکار میخوای بکنی !

jalalnooritehrani
یک شنبه 13 بهمن 1387, 08:09 صبح
سلام دوست عزيز

منظور من برعكس جوابي كه شما به من داديد

سوالم را دقيق تر بيان ميكنم اولين از شما پرسيدم كه ميتوان رويدادي را از درون كلاس به سطح بالاتر پاس داد كه شما لطف كرديد و جواب داديد

حالا سوالم اينه كه من درون برنامه كه سطح بالاتر از كلاس است كه رويداد (فانكشن يا سابروتين) دارم و وقتي كلاس را لود ميكنم آيا ميتوانم ران تايم از درون كلاس فانكشن سطح بالا را اجرا و مقدار خروجي آن را به كلاس برگردانم و آيا ميتوانم اين عمل را براي سابروتين انجام دهم

mostafaaa
یک شنبه 13 بهمن 1387, 09:30 صبح
اصلا لزومی نداره برای همچین کاری از Event استفاده کنید ، شما اگه میخوای یه مقدار رو به یه کلاس دیگه از برنامه اصلیت پاست بدی ، خوب یه Property برای اون کلاست در نظر بگیر و هر وقت رویداد موردنظرت در برنامه اصلی اتفاق افتاد مقدار رو به اون Property بفرست مثلا :

Public Class Sample
Inherits Form
Private WithEvents TextBox1 As New TextBox
Sub New()
Me.Text = "Sample form"
TextBox1.Left = 100
TextBox1.Top = 100
Me.Controls.Add(Me.TextBox1)
End Sub
Public Property Value() As String
Get
Return Me.TextBox1.Text
End Get
Set(ByVal value As String)
Me.TextBox1.Text = value
End Set
End Property
End Class
برای استفاده هم به این شکل :

Public Class Form1
Private WithEvents NewInstance As New Sample
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
NewInstance.Show()
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
NewInstance.Value = Me.TextBox1.Text
End Sub
End Class

این مثال دقیقا کارش برعکس کد بالاست!
یا علی

jalalnooritehrani
یک شنبه 13 بهمن 1387, 12:32 عصر
سلام دوست عزيز
من به يك مشكل جديد در همين ضمينه برخورد كردم اول پروژه ام را توضيح ميدم بعد مشكل را بيان ميكنم

من يك برنامه ويندوز اپليكيشن دارم (تصوير1)
وقتي دكمه هاي ButtonBar سمت راست صفحه را كليك ميكنم


Imports JntBaseData

PrivateWithEvents Frm AsNew BaseData


PrivateSub ButtonBar_ItemClick(ByVal sender As System.Object, ByVal e As Janus.Windows.ButtonBar.ItemEventArgs) Handles ButtonBar1.ItemClick
Frm.MdiParent = Me
Frm.Connection = LoginFrm.Connection
Frm.Nameuser = Nameuser
SelectCase e.Item.Key.ToString
' اطلاعات پايه
Case"BseNameArz"
Frm.Show(NameFrm.BseNameArz)
Case"BseNoeArz"
Frm.Show(NameFrm.BseNoeArz)
Case"BseBank"
Frm.Show(NameFrm.BseBank)
Case"BseCountry"
Frm.Show(NameFrm.BseCountry)
Case"BseNoeKala"
Frm.Show(NameFrm.BseNoeKala)
EndSelect
EndSub


كلاسي بنام (BaseData) فراخواني ميشه و در آن كلاس يك تابع بنام Show وجود داره كه اين تابع داراي متغييري بنام NameFrm است.
وقتي اين تابع اجرا بشه يك فرم به نمايش داده ميشه و در آن فرم براساس متغيير NameFrm اطلاعات از جداول sql به نمايش در مياد.
در اين فرم طبق اطلاعات شما ميتوانم مقاديري به سطح بالاتر كه كلاس (BaseData) است بفرستم و بعد از اين كلاس اطلاعات را باز به سطح بالاتر يعني فرم اصلي ميفرستم تا اينجا مشكلي ندارم
همانطور كه در تصوير1 (فرم اصلي) ميبيني وقتي دكمه كشور را كليك ميكنم كلاس (BaseData) اجرا و بعد از آن فرمي به نمايش و اطلاعات مربوط به كشور از ديتابيس به نمايش در مياد تصوير2
همانطور كه در تصوير2 پيداست من در تكس باكس مقدار 55 نوشتم و در فرم اصلي مقدار ProgressBar به 55 تغيير كرد.
مشكل اينجاست كه وقتي كار با اين فرم تمام ميشه و وقتي ميخواهم فرم ديگر از همين كلاس باز كنم به اررور برخورم ميكنم (تصوير5) 2 روز است كه تمام وقت روي اين مسئله كار ميكنم ولي به نتيجه اي نرسيدم لطفا راهنماييم كنيد

و در ضمن از جوابت ممنونم
ولي منظور من اين نبود
من يك تابع در فرم اصلي دارم و وقتي در كلاس يك اتفاق ميافته ميخواهم تابع در فرم اصلي اجرا بشه
مثلاً اطلاعات در كلاس ذخيره ميكنم ميخوام ProgressBar در فرم اصلي كه سطح بالاتر از كلاس است تغيير كنه

mostafaaa
یک شنبه 13 بهمن 1387, 19:39 عصر
سلام دوست من
کاملا معلومه چرا ارور میده !!
شما یک نمونه از کلاست ساختی و اولین بار اون رو Show میکنی ، تا اینجا درست. خوب زمانی که فرم رو میبندی این کلاست در واقع از بین رفته ، و برای اینکه دوباره بتونی بازش کنی باید یه نمونه دیگه ازش بگیری !!
برای رفع مشکلت کدت رو به این شکل میتونی تغییر بدی :

Private WithEvents Frm As BaseData

PrivateSub ButtonBar_ItemClick(ByVal sender As System.Object, ByVal e As Janus.Windows.ButtonBar.ItemEventArgs) Handles ButtonBar1.ItemClick
Frm=New BaseData
Frm.MdiParent = Me
Frm.Connection = LoginFrm.Connection
Frm.Nameuser = Nameuser
SelectCase e.Item.Key.ToString

mostafaaa
یک شنبه 13 بهمن 1387, 19:48 عصر
در ضمن یه چیزی رو یادم رفت بگم اینه که ..
برادر من شما که میخوای عکس خطا رو بفرستی ، حداقل خطای Debug رو بفرست نه خطای RunTime رو !!

jalalnooritehrani
دوشنبه 14 بهمن 1387, 09:20 صبح
با سلام
خيلي خيلي ممنون
بنظر شما هر بار كه بخواهيم از اين كلاس استفاده كنيم ايستنس هاي جديد ايجاد ميشه
آيا رم اشغال نميشه

اگه راجب موضوع دوم پست قبلي من اطلاعات داريد ميتوان به من هم انتقال دهيد خيلي ممنون ميشم



من يك تابع در فرم اصلي دارم و وقتي در كلاس يك اتفاق ميافته ميخواهم تابع در فرم اصلي اجرا بشه
مثلاً اطلاعات در كلاس ذخيره ميكنم ميخوام ProgressBar در فرم اصلي كه سطح بالاتر از كلاس است تغيير كنه

mostafaaa
دوشنبه 14 بهمن 1387, 10:12 صبح
سلام دوست من

بنظر شما هر بار كه بخواهيم از اين كلاس استفاده كنيم ايستنس هاي جديد ايجاد ميشه
آيا رم اشغال نميشه
نه دوست من ، هر وقت که یه فرم رو میبندی اون فرم از بین میره، البته ممکنه که بلافاصله سیستم اون فضا رو آزاد نکنه ولی زمانی که بهش نیاز پیدا کردم فضا رو از حافضه میگیره .

اگه راجب موضوع دوم پست قبلي من اطلاعات داريد ميتوان به من هم انتقال دهيد خيلي ممنون ميشم
موضوع دومتون رو توی اولین پستم فکر کنم جواب دادم ، یکی از راههای که میتونی یهمقدار رو به یه کلاس بالاتر انتقال بدی همون Event ها هستند، که مثالش رو برات زدم. راه دیگش اینه که توی فرم اصلیت یه متد ایجاد کنه که بشه از توی زیر کلاسهات اون رو فرواخوانی کرد، راه دیگه استفاده از Property هست ....
امیدوارم جوابت رو گرفته باشی !
یا علی

jalalnooritehrani
دوشنبه 14 بهمن 1387, 13:17 عصر
سلام دوست من :لبخندساده:
خيلي ممنون از راهنماي هايت :تشویق:

لازم ديدم حتما با پست از شما تشكر كنم :قهقهه:

يك سوال دارم من كلاس و 6 عدد سي دي آموزش دات نت را دوره ديده ام
ولي معلوماتم خيلي خيلي پايين تر از شماست
ميخواهم بدانم شما دوره اي خاص يا كتاب خلاصه چه كار كرده ايد كه معلومات زيادي داريد
اگر ميفرمائيد وقت زيادي گذاشتيد. فكر كنم با وقت زياد بدون منبع ياد گيري نميتوان از نتيجه كار راضي بود
لطفا روش يا جزوات آموزشي دات را به من هم معرفي كنيد :تشویق: