PDA

View Full Version : مشکل با Overrides و Protected



UpgradeVB6Code
سه شنبه 08 آبان 1386, 21:18 عصر
سلام
من یه مشکلی دارم با Overrides و Protected
ببینید این کد هست که فرم رو به شکل دایره در میاره


Protected Overrides Sub OnPaint( _
ByVal e As System.Windows.Forms.PaintEventArgs)
Dim shape As New System.Drawing.Drawing2D.GraphicsPath
shape.AddEllipse(0, 0, Me.Width, Me.Height)
Me.Region = New System.Drawing.Region(shape)
End Sub

واژه Protected یعنی این کد توی کلاس جاری که در این جا Form1 هست محافطت میشه و خارج از فرم نمیشه ازش استفاده کرد. درسته ؟

و واژه Overrides که نشان میده این قطعه کد روی یک پراسیجر دیگه با همین نام سوار شده و علاوه بر اینکه دستورالعمل های اونو انجام میشه این هم همزمان انجام میشه !!!
اما اینجا ما Form1_Paint رو داریم پس OnPaint روی چی سوار شده ؟

UpgradeVB6Code
چهارشنبه 09 آبان 1386, 11:45 صبح
کسی میتونه راجع به Onpaint برای من توضیح بده ؟
ببینید من این کد رو توی یه فرم نوشتم اما تا وقتی Onpaint باشه دیگه Form1_Paint اجرا نمیشه, چرا ؟


Public Class Form1

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MsgBox("OnPaint")
End Sub

Private Sub Form1_Paint(ByVal sender AsObject, ByVal e As System.Windows.Forms.PaintEventArgs) HandlesMe.Paint
MsgBox("Form1_Paint")
End Sub

End Class

UpgradeVB6Code
جمعه 11 آبان 1386, 13:52 عصر
کسی این تابع OnPaint رو برای من توضیح نمیده ؟!

__H2__
چهارشنبه 16 آبان 1386, 09:36 صبح
سلام
واژه proytected کلمه سطح دسترسی است
Private کوچکترین محدوده0دسترسی محلی و فقط از داخل ماژول
Protected دسترسی از داخل ماژول و کلیه کلاسسهای وراثتی
Friend دسترسی در داخل کل اسمبلی یا پروژه جاری
Friend Protected دسترسی در کل اسمبلی جاری و کلاسسهای وراثتی خارج اسمبلی جاری
Public بزرگترین محدوده-دسترسی کامل از داخل و خارج پروژه و هر نقطه


و کلمه کلیدی Overrides برای تعریف یک متد جدید به جای متد مشابه در کلاسس مشتق شده اجرا میشود.


در مثال جاری فرم (و کلیه کنترلرها) دارای متد OnPaint هستند و شما با دستور Overrides متد OnPaint جدید خود را جای قبلی تعویض میکنید و دیگر از هر جا درخواستی برای OnPaint فرم صادر شود به جای کد اصلی و بومی کلاسس پایه (در اینجا کد مایکروسافت) کد شمات اجرا میشود، این خیلی کلی تر و پایه ای تر از رویداد Paint است.

اصلاً دستوری که موجب وقوع رویداد Paint میشود خود در متد OnPaint کلاسس پایه وجود دارد و به طور مثال اگر شما متد را به این شیوه خودتان Override بکنید دیگر رویداد Paint کلاً از کار می افتد، چون رویداد مذکور در کد بومی OnPaint اصلی فراخانی میشود و اتفاق می افتد.
و چون شما متد فوق را Override کرده اید کد اصلی که شامل دستورات پرتاپ رویداد Paint هم است دیگر اجرا نمیشود و کلاً هیچ چیزی در روی فرم بجز کد شما رسم نمیشود!


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

مثلاً کد زیر


Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
'.... Drawing
MyBase.OnPaint(e)
End Sub


اول دستورات ترسیمی شما را انجام میدهد و بعد کنترل را به کلاسس پایه میدهد تا آن هم کد پیشین و اصلی خود را اجرا کنید، بدین ترتیب با وجود Override متد OnPaint کد قبلی هم اجرا میشود و رویداد Paint هم کار خواهد کرد.

البته اینکه در چه نقطه ای کد پایه فراخانی ود به برنامه بستگی دارد، شاید شما بخواهید اول تصویر کلاسس پایه ترسیم شود و بعد شما رویش چیزی جدید اضافه و رسم کنید، در این حالت کد فراخانی متد قدیمی پایه باید اولین خط باشد و....


این ها همه داستان سرایی کردم تا شاید فرق متد OnPaint و رویداد Paint و مباحث مشابه را متوجه شوید و بدانید وظیفه هر یک چیست.
باز هم مشکلی داشتید بگویید.

UpgradeVB6Code
چهارشنبه 16 آبان 1386, 10:31 صبح
خیلی خیلی ممنون،
دیگه ناامید شده بودم کسی جواب بده،
الان مطلب قشنگ جا افتاد
فقط یه سوالی داشتم ، این دو تا کلمه یعنی چی ؟ خیلی جا ها بهشون برخوردم اما توضیحی راجع بهشون نداده بودند.

1.کلاسس پایه
2.کلاسس مشتق شده

__H2__
شنبه 19 آبان 1386, 11:59 صبح
سلام
اول از دیر سر زدنم به سایت عضر خواهی میکنم.
روابط زیر را در نظر بگیرید!
شی -> وسیله نقلیه -> سواری -> پیکان!
شی -> وسیله نقلیه -> سواری -> بنز
شی -> وسیله نقلیه -> حمل بار -> کامیون
شی -> وسیله نقلیه -> حمل بار -> وانت
شی -> موجود زنده -> گیاه -> درخت -> کاج
شی -> موجود زنده -> حیوان -> انسان
شی -> موجود زنده -> حیوان -> ببر


هر "پیکانی" حتماً یک "سواری" است!
هر "سواری" لزومی "پیکان" نیست!
هر "کاج" بی شک یک "موجود زنده" است!
هر "موجود زنده" ای لزوماً "کاج" نیست!
و....


هر "انسانی" تمام شرایط و خواص و قوانین حاکم بر "موجود زنده" را شامل میشود.
مثلاً همه نوع "موجود زنده" امکان تولید مثل و بقا و رشد و نمو و تکثیر را دارند و "حیوان" هم که زیر گروهی از "موجود زنده" است این خواص را دارد.
ولی خود "حیوان" خواصی علاوه بر "موجود زنده" دارد، مثلاً "حیوان" توانی جرکت آزادانه در محیط را دارد ولی "گیاهان" ...
"انسان" هم توانایی ها و خواص "حیوان" و طبیعتاً "موجود زنده" را دارد ولی خودش چیزی افزون بر خواص آنها دارد... زندگی جمعی، هوش و...

حال از نظر برنامه نویسی میگوییم.
"شی" کلاسس پایه و "وسیله نقلیه" کلاسس مشتق شده است.
"وسیله نقلیه" کلاسس پایه و "سواری" کلاسس مشتق شده است.
"شی" کلاسس پایه و "سواری" کلاسس مشتق شده است.
و...

در دات نت هر کلاسسی خود مشتقی از سلسله مراتب Object است و خود میتواند سر منشع و کلاسس پایه ای برای دیگر کلاسسها باشد.
کلاسس مشتق شده تمام خواص کلاسس پایه را دارد ولی عکسش لزوماً صادق نیست!
بنابر این هر نوع متغیر کلاسس مشتق را میتوان در متغییر کلاسس پایه هم جا دهد.

مثلاً سلسله مراتب کلاسس Form (همان پنجره در برنامه نویسی ویندوزی) بدین شکل است


System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Windows.Forms.Control
System.Windows.Forms.ScrollableControl
System.Windows.Forms.ContainerControl
System.Windows.Forms.Form


پس کد زیر با وجودی که ظاهراً نوع متغییرها فرق دارد، همواره و بدون شک صحیح است


Dim f As New System.Windows.Forms.Form
Dim c As System.Windows.Forms.Control
Dim o As Object

c = f
o = f

و اصولاً به همین دلیل است که هر چیزی را میتوان در Object ریخت، چون مجدداً میگویم که هر چیزی در دات نت وراثتی از Object است .
همانطور که میتوان به "کاج" گفت یک "درخت" یا یک "موجود زنده"
یا به "بنز" و "پیکان" میتوان گفت "وسیله نقلیه"
به "هر نوعی در دات نت" میتوان گفت یک "شی" و آنرا میتوان در متغییری از نوع Object ریخت!

البته یک وسیله نقلیه بودن پیکان جای بحث بیشتری دارد! :لبخند::چشمک:

موفق و پیروز و سربلند باشید.

UpgradeVB6Code
پنج شنبه 01 آذر 1386, 19:43 عصر
سلام
خیلی ممنون
توضیحات کاملی بود !