PDA

View Full Version : پاس دادن فرم به کامپوننتی که آن را روی فرم قرار دادیم(برای هندل کردن)



Chabok
پنج شنبه 25 اسفند 1384, 19:26 عصر
با سلام خدمت دوستان عزیز
چجوری میشه توی کامپوننتی که نوشتیم فرم رو هندل کنیم
یعنی در واقع فرم رو بطور خودکار به کامپوننت پاس بدیم .

من خودم یه تابع نوشتم که مینویسم :


A.GetForm(Me)

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

Farhad.B.S
جمعه 26 اسفند 1384, 01:17 صبح
در صورتی که کامپوننت شما از کلاس Control مشتق میشه ، دارای خصوصیتی به نام Parent هست که کنترلی که بر روی اون واقع شده رو برگشت میده.

Chabok
جمعه 26 اسفند 1384, 10:12 صبح
مرسی از اینکه جواب دادین .
راستش کنترل نیست . یعنی فقط دستوره و وقتی روی فرم میزاریم میاد پایین فرم (مثل تایمر و ...)
قرار میگیره .

اینو میشه کاریش کرد ؟
مرسی (راستی عید همگی هم مبارک باشه)

Farhad.B.S
جمعه 26 اسفند 1384, 13:04 عصر
خوب زمانی که کنترل نیست یعنی ویژوال هم نیست.
بنابراین هیچ ازتباطی بین این شئ و فرم نمیتونه به طور پیش ساخته وجود داشته باشه... تنها ارتباط منطقی اینه که فرم مورد نظر instance مورد نظر رو تعریف کرده (در واقع کامپوننت در اون فرم تعریف شده)
با استفاده از این رابطه و همچنین استفاده از Reflection میشه به شئ تعریف کننده دسترسی داشت.
کد زیر رو ببین ، در این کد من یک کلاس که از تایمر مشتق میشه ساختم و در متد test اون به شئ تعریف کننده دسترسی پیدا کردم.
فرض رو بر این گذاشتم که شئ تعریف کننده یک Form هستش بنابراین اون رو مستقیما به Form تبدیل کردم و نامش رو نمایش دادم.




Public Class MyTimer
Inherits Timer

Public Sub test()
Dim declaratorType As Type = Me.GetType().DeclaringType

Dim declarator As Object = declaratorType.Assembly.CreateInstance(declaratorT ype.FullName)

MessageBox.Show(CType(declarator, Form).Name)
End Sub
End Class

Chabok
جمعه 26 اسفند 1384, 17:53 عصر
مرسی از راهنماییتون .
ولی باز هم کارم راه نیفتاد .

بذارین یه بار دیگه توضیح بدم ببینید میشه کاریش کرد یا نه ؟
من دارم یه کامپوننت میسازم که باید فرم به اون پاس داده بشه .

A.SetForm(form1)
ولی میخوام کاربر این تابع رو ننویسه و هنگامی که کامپوننت رو روی فرمش قرار داد فرم رو بدست بیارم .

مطهر
شنبه 27 اسفند 1384, 21:24 عصر
می خواهی فرمی که کامپوننت روی آن قرار میگیره را بدست بیاری؟
درسته؟؟
جواب:
اگر کامپوننت شما از کلاس Control ارث ببره یه متدی در اختیار شما قرار می گیره به نام

FindForm()
که فرمی که کنترل روش قرار گرفته را بر می گردنه.
بعد که کامل خونم متوجه شدم که کامپوننت شما از Control مشتق نمیشه.
میتونم بپرسم برا چه کاری می خوای؟شاید یه راه حل دیگه داشته باشه

Chabok
یک شنبه 28 اسفند 1384, 07:15 صبح
ببینید . اصل کار بر میگرده به این تاپیک :
http://barnamenevis.org/forum/showthread.php?t=38871
میبنید که کاربر باید فرم خودش رو پاس بده (همین!).
در صورتی که من اگر فرم رو به دست بیارم میتونم خودم فرم رو هندل کنم (FormLoad,FormClosing)
و دیگه لازم نیست کاربر این همه کد بنویسه و فقط کامپوننت رو روی فرم قرار میده .

حالا من اومدم برای اینکه از متد Parent استفاده کنم (که ویژوال باشه) کامپوننتم رو از نوع Panel انتخاب کردم .
فقط یه مشکل دارم اونم اینه که خیلی از خاصیت های Panel به کامپوننت اضافه شده که من بهشون احتیاج ندارم . که برای حل این مشکل در ادامه تاپیک زیر مطرح کردم :
http://barnamenevis.org/forum/showthread.php?t=38501
حالا شما بگید من چیکار کنم ؟
1.آیا از پنل استفاده کنم و یک سری از خواص اون رو حذف کنم (که هنوز بلد نیستم)
2.یا کامپوننت از خواص Control ارث ببره که بشه به قول شما از FindForm استفاده کرد ؟

خیلی ممنون

Farhad.B.S
یک شنبه 28 اسفند 1384, 09:56 صبح
خوب وقتی احتیاج به خواص پنل ندارید میتونید از کلاس Control که کلاس پایه همه کنترل های ویژوال هست استفاده کنید.

Farhad.B.S
یک شنبه 28 اسفند 1384, 10:29 صبح
در جواب سوال بعدی،
زمانی که یک کلاس از کلاس دیگه ای مشتق میشه امکان حذف اعضاء کلاس پدر در کلاس فرزند وجود نداره.
تنها کاری که میشه انجام داد override کردن این اعضا در کلاس فرزنده.

Chabok
یک شنبه 28 اسفند 1384, 18:16 عصر
مشکل پاس دادن فرم حل شد (از طریق ارث بری از حالت Control) . خیلی ممنون .

معنی لغوی Override که یعنی لغو کردن و باطل کردن.
حالا اگه Override کنیم چه اتفاقی می افته و چجوری میشه این کارو انجام داد .
بازم از شما کمال تشکر را دارم .

Farhad.B.S
دوشنبه 29 اسفند 1384, 16:01 عصر
Override کردن به فرایندی گفته میشه که طی اون یک member رو بازنویسی میکنید.
به عبارت دیگه زمانی که شما یک فانکشن رو آوررید میکنید فانکشن مورد نظر از کلاس حذف نمیشه بلکه فقط کدی که شما مشخص کردید به جای کد اجرایی که فانکشن از قبل داشته قرار میگیره و کد شما زمان فراخوانی فانشکن آوررید شده اجرا میشه.

Chabok
سه شنبه 01 فروردین 1385, 10:34 صبح
پس در واقع نمیشه یه جوری سرش کلاه گذاشت .
آخه من مجبور شدم کامپوننتم از نوع Control باشه و یه عالمه خواص عمومی داره که هیچ کدوم به کارم نمیاد و فقط شلوغ پلوغ میکنه .(مشکلم فقط همینه که زیاد هم مهم نیست )
ولی به هر حال خیلی از جوابهای شما و سایر دوستان استفاده کردم و ممنونم.
سال خوبی داشته باشید .