رویدادهای شی مرتبط به شی ساخته شده

ms_vb

Member
سلام
با دستور
کد:
    Public Property ViewPictureBox As PictureBox
از یه شی picturebox توی شی ای که ساختم استفاده کردم
حالا میخواهم هر وقت روی این PictureBox کلیک کردم یه سری کارها انجام بشه چکار کنم؟
نمیدانم توانستم چیزی رو که می خواهم درست انتقال بدم یا نه؟
اگه متوجه نشدید بگید بیشتر توضیح بدم
 

the_king

مدیرکل انجمن
سلام
با دستور
کد:
    Public Property ViewPictureBox As PictureBox
از یه شی picturebox توی شی ای که ساختم استفاده کردم
حالا میخواهم هر وقت روی این PictureBox کلیک کردم یه سری کارها انجام بشه چکار کنم؟
نمیدانم توانستم چیزی رو که می خواهم درست انتقال بدم یا نه؟
اگه متوجه نشدید بگید بیشتر توضیح بدم

Property شیء نمی سازه، Property به یک چیزی مقدار میده یا از چیزی مقدار می گیره. از Property زمانی استفاده کنید
که بخواهید یک متغیری در بیرون از کلاس تون قابل دسترسی باشه اما این دسترسی خارج از کنترل شما و
بی حساب و کتاب نباشه و شما روی این دسترسی کنترل کامل و دقیقی داشته باشید.
اگه می خواهید شی ای بسازید اون عبارت کلیدی Property بی مورده.

برای مدیریت رخداد های یک شیء از AddHandler استفاده کنید :

کد:
[COLOR="Gray"]Public Class Form1[/COLOR]
    Private ViewPictureBox As PictureBox

    Private Sub PictureBox_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        MessageBox.Show("Click!")
    End Sub

[COLOR="Gray"]    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load[/COLOR]
        ViewPictureBox = New PictureBox()
        With ViewPictureBox
            .Parent = Me
            .BackColor = Color.White
            AddHandler .Click, AddressOf PictureBox_Click
        End With
[COLOR="Gray"]    End Sub
End Class[/COLOR]
 

ms_vb

Member
ببخشید ظاهرا نتوانستم درست منظورم را برسانم
فرض کنید یک شی داریم که از ListBox ارث بری کرده است ، که محتوی آدرس تعدادی عکس میباشد، که با دستور
کد:
Public Property ViewPictureBox As PictureBox
برای آن یک پروپرتی ساخته ایم که این پروپرتی تمام pictureBox هایی که در فرم استفاده شده را لیست میکند و به کاربر این امکان را میدهد که یکی از آنها را انتخاب کند.(مانند ContextmenuStrip در بعضی از اشیا)
بعد از این که کاربر یکی از PictureBox ها را انتخاب کرد و برنامه اجرا کرد. دیگر با انتخاب هر گزینه از ListBox عکس انتخاب شده در pictureBox که توسط کاربر انتخاب شده به نمایش در می آید.
حالا میخواهم اگر کاربر روی PictureBox که انتخاب کرده کلیک کرد آن عکس در حالت FullScreen نمایش داده شود. به عبارتی در قسمت رویداد کلیک آن PictureBox کدی نوشته شود
نمیدانم شما VisualStudio2010 دارید برنامه را برایتان آپلود کنم؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ببخشید ظاهرا نتوانستم درست منظورم را برسانم
فرض کنید یک شی داریم که از ListBox ارث بری کرده است ، که محتوی آدرس تعدادی عکس میباشد، که با دستور
کد:
Public Property ViewPictureBox As PictureBox
برای آن یک پروپرتی ساخته ایم که این پروپرتی تمام pictureBox هایی که در فرم استفاده شده را لیست میکند و به کاربر این امکان را میدهد که یکی از آنها را انتخاب کند.(مانند ContextmenuStrip در بعضی از اشیا)
بعد از این که کاربر یکی از PictureBox ها را انتخاب کرد و برنامه اجرا کرد. دیگر با انتخاب هر گزینه از ListBox عکس انتخاب شده در pictureBox که توسط کاربر انتخاب شده به نمایش در می آید.
حالا میخواهم اگر کاربر روی PictureBox که انتخاب کرده کلیک کرد آن عکس در حالت FullScreen نمایش داده شود. به عبارتی در قسمت رویداد کلیک آن PictureBox کدی نوشته شود
نمیدانم شما VisualStudio2010 دارید برنامه را برایتان آپلود کنم؟

بله، Visual Studio 2010 را دارم، شما لابد مقداری که در Property مربوط به PictureBox نوشته میشه جایی نگه می دارید.
اسم متغیر آنرا با AddHandler بکار خواهید برد.
 

ms_vb

Member
ممنون از محبتتون
توی قسمت کامپاننت این برنامه توضیح دادم مشکل کجاست
 

پیوست ها

  • question.zip
    289.1 کیلوبایت · بازدیدها: 1

the_king

مدیرکل انجمن
ممنون از محبتتون
توی قسمت کامپاننت این برنامه توضیح دادم مشکل کجاست

نیازی به تعریف کردن کلاس و PictureBox برای فرم نبود. از Property های خودکار و بدون متغیر فقط زمانی استفاده کنید
که احتیاجی به نظارت بر دسترسی بهش نداشته باشید، در این مثال شما باید روی عوض شدن مقدار
PictureBox نظارت می کردید تا رخداد کلیک اش رو تحت کنترل می گرفتید.

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

question2.zip
 

پیوست ها

  • question2.zip
    284.6 کیلوبایت · بازدیدها: 2

ms_vb

Member
خیلی خیلی ممنون مشکلم حل شد
فقط حالا یه سوال اگه بخواهم نسبت به تغییرات ImageLocation شی ViewPictureBox یه سری دستور العمل اجرا شه چه کنم؟
می خواهم وقتی که مقدار ""<>ViewPictureBox.ImageLocation بود Cursor شی به Hand تبدیل بشه
 

the_king

مدیرکل انجمن
خیلی خیلی ممنون مشکلم حل شد
فقط حالا یه سوال اگه بخواهم نسبت به تغییرات ImageLocation شی ViewPictureBox یه سری دستور العمل اجرا شه چه کنم؟
می خواهم وقتی که مقدار ""<>ViewPictureBox.ImageLocation بود Cursor شی به Hand تبدیل بشه

ImageLocation وقتی تغییر می کنه که رخداد NewListBox_SelectedIndexChanged اتفاق می افته،
هر کدی که لازمه اونجا بنویسید.
 

ms_vb

Member
ممنون از راهنماییتون
نمیشه جدا از اینکه Imagelocation کجا تغییر میکنه تغییراتش رو کنترل کرد؟
مثل خود شی ViewPictureBox
 

the_king

مدیرکل انجمن
ممنون از راهنماییتون
نمیشه جدا از اینکه Imagelocation کجا تغییر میکنه تغییراتش رو کنترل کرد؟
مثل خود شی ViewPictureBox

تا اونجا که مربوط به شیء گرایی میشه، محدودیت های Net. خیلی کمه، کمتر کاری پیدا میشه که نتوانید انجام بدهید.

کلاس PictureBox برای تغییراتی که روی ImageLocation اتفاق می افته رخدادی نداره، اما بجایش می توانید روی
LoadCompleted حساب باز کنید چون زمانی که اطلاعات داخل تصویر جدید دریافت میشه یعنی ImageLocation
تغییر می کنه همین رخداد روی میده.

کد:
    <Browsable(True), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
    Public Property ViewPictureBox() As PictureBox
        Get
            Return mViewPictureBox
        End Get
        Set(ByVal value As PictureBox)
            If Not mViewPictureBox Is Nothing Then
                RemoveHandler mViewPictureBox.Click, AddressOf ViewPictureBox_Click
[COLOR="Blue"]                RemoveHandler mViewPictureBox.LoadCompleted, AddressOf ViewPictureBox_LoadCompleted[/COLOR]
            End If
            mViewPictureBox = value
            If Not mViewPictureBox Is Nothing Then
                AddHandler mViewPictureBox.Click, AddressOf ViewPictureBox_Click
[COLOR="Blue"]                AddHandler mViewPictureBox.LoadCompleted, AddressOf ViewPictureBox_LoadCompleted[/COLOR]
            End If
        End Set
    End Property

[COLOR="Blue"]    Private Sub ViewPictureBox_LoadCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
        mViewPictureBox.Cursor = Cursors.Hand
    End Sub
[/COLOR]

درضمن اگه ازش ارث بری کنید می توانید خودتان همچین رخدادی رو به کلاس تان اضافه کنید.
 

جدیدترین ارسال ها

بالا