نمایش نتایج 1 تا 7 از 7

نام تاپیک: مشکل با Overrides و Protected

  1. #1

    Tick مشکل با Overrides و Protected

    سلام
    من یه مشکلی دارم با 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 روی چی سوار شده ؟

  2. #2
    کسی میتونه راجع به 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

  3. #3
    کسی این تابع OnPaint رو برای من توضیح نمیده ؟!

  4. #4
    کاربر دائمی آواتار __H2__
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    یک جایی بین Framework و نارمک!
    پست
    1,059
    سلام
    واژه 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 و مباحث مشابه را متوجه شوید و بدانید وظیفه هر یک چیست.
    باز هم مشکلی داشتید بگویید.

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

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

  6. #6
    کاربر دائمی آواتار __H2__
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    یک جایی بین Framework و نارمک!
    پست
    1,059
    سلام
    اول از دیر سر زدنم به سایت عضر خواهی میکنم.
    روابط زیر را در نظر بگیرید!
    شی -> وسیله نقلیه -> سواری -> پیکان!
    شی -> وسیله نقلیه -> سواری -> بنز
    شی -> وسیله نقلیه -> حمل بار -> کامیون
    شی -> وسیله نقلیه -> حمل بار -> وانت
    شی -> موجود زنده -> گیاه -> درخت -> کاج
    شی -> موجود زنده -> حیوان -> انسان
    شی -> موجود زنده -> حیوان -> ببر


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


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

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

    در دات نت هر کلاسسی خود مشتقی از سلسله مراتب 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 ریخت!

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

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

  7. #7
    سلام
    خیلی ممنون
    توضیحات کاملی بود !

تاپیک های مشابه

  1. استفاده از وقفه ها در protected mode
    نوشته شده توسط Delphi Coder در بخش توسعه‌ی هسته‌ی سیستم عامل
    پاسخ: 8
    آخرین پست: پنج شنبه 27 دی 1386, 17:20 عصر
  2. Protected Properties
    نوشته شده توسط pooyansystem در بخش C#‎‎
    پاسخ: 1
    آخرین پست: چهارشنبه 19 دی 1386, 22:51 عصر
  3. تفاوت private و protected
    نوشته شده توسط SYSMAN در بخش C#‎‎
    پاسخ: 4
    آخرین پست: جمعه 28 اردیبهشت 1386, 22:22 عصر
  4. Protected StoredProcedures
    نوشته شده توسط MH2538 در بخش SQL Server
    پاسخ: 6
    آخرین پست: سه شنبه 22 آذر 1384, 10:30 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •