2015-03-18 3 views
0

Я новичок в визуальном базовом и задавался вопросом, можно ли запускать события в классе, основываясь на действии с формой.Невозможно обработать событие в другом классе

Так следующее моя проблема: У меня есть форма с именем Main, с коробкой картина под названием picPID и класс под названием add_new

То, что я хочу сделать, это: , когда правая MouseButton нажата, код для обработки событий помещается внутри класса под названием add_new

Я думал, что я мог бы просто объявить его следующим образом:

Sub meMouseDown (отправитель As Object, е Как MouseEventArgs) Ручки Main.picPID.MouseDown

Но я получаю ошибку о том, что я должен объявить его WithEvents, я попытался объявить PictureBox как:

Общественный общий WithEvents как PictureBox

но dident помощь, любые sugestions? Это не проблема с кодом в основной форме, но это приведет к большому количеству кода, поэтому я надеялся разделить его.

+1

Не уверен, что это хорошая идея. Разделение функциональности пользовательского интерфейса формы в отдельных классах заставляет их зависеть друг от друга. По-видимому, это нарушает некоторые основные принципы ООП. Возможно, если вы хотите создать многоразовый код для функции PictureBox, вы должны попытаться расширить класс PictureBox, создав свой производный класс PictureBox – Steve

+0

'Handles Main.picPID.MouseDown' - довольно неприятная ловушка VB.NET, которая вам понадобится научиться избегать. 'Main' - это имя * типа *, но требуется ссылка на объект. VB.NET слишком прощает, позволяя вам использовать 'Main' в вашем коде, когда вы действительно имеете в виду объект. Здесь это не сработает. Anyhoo, вам нужно использовать оператор AddHandler. –

ответ

2

Так у вас есть класс с EventHandler:

Public Class add_new 

    Public Sub PictureBoxEventHandler(sender As Object, e As MouseEventArgs) 
     'Your Implementation 
    End Sub 

End Class 

Тогда вам нужен экземпляр этого класса в форме, содержащей PictureBox:

Public Class Form1 

    Private add_New_Command As New add_new ' hold a reference to the command 

    'constructor 
    Public Sub New() 

     InitializeComponent() 

     ' and add the handler to the event of the picture box ... hook it up 
     AddHandler PictureBox1.MouseDown, AddressOf add_New_Command.PictureBoxEventHandler 

    End Sub 

End Class 
+0

вот как это было бы сделано. но я предпочел бы следовать предложению @Steve и расчесываться на дизайнерах OOP, прежде чем заниматься большим материалом. есть тонны книг по этой теме, и я рекомендую вам получить один из них ... хороший материал –

+0

Хорошее решение, но обязательно удалите обработчик. В противном случае ваша память может быть необработанной и может стать неприятной ... – Codexer

+0

@ 436f6465786572 должен получить сбор мусора, когда нет ссылки на экземпляр Form1 ... –

Смежные вопросы