theskiguy Ответов: 2

Правильный способ создания событий в публичном классе в VB.NET


Я использую классы уже некоторое время, но я относительно новичок в создании событий в своих классах. Перед использованием событий, если бы я хотел сделать общедоступный класс, который был бы доступен во всем моем проекте, я бы создал глобальную переменную для класса, а затем инициализировал бы класс, прежде чем мне нужно было бы использовать этот класс:

Public ClassMFTV As New ClassMachineFunctionsTimerVars


Что я уже пробовал:

Теперь, когда я использую события, я обнаружил, что больше не могу использовать этот метод. Чтобы использовать события, мне нужно включить ключевые слова WithEvents в объявление класса:

Public WithEvents ClassMFTV As New ClassMachineFunctionsTimerVars


Когда я пытаюсь это сделать, я получаю следующую ошибку:

Предложение Handles требует переменной WithEvents, определенной в содержащем типе или одном из его базовых типов

Если я перемещаю объявление класса в свою стартовую форму, ошибка исчезает, но тогда я могу получить доступ только к переменным класса в этой форме. Мне нужно иметь возможность читать и обновлять переменные в моем классе на протяжении всего проекта. Как правильно это сделать плюс возможность запускать пользовательские события?

Вот часть моего урока. Я в основном использую этот класс для проверки изменений в серии переменных, которые собираются с помощью таймера. Когда переменная изменяется, я запускаю событие для обновления таких вещей, как графический интерфейс, база данных и т. д.

Public Class ClassMachineFunctionsTimerVars

    'Raises events to update the machine function screens

    Private _Var826 As Integer = -9999
    Private _Var827 As Integer = -9999
   
    Public Event Var826ChangedEvent()
    Public Event Var827ChangedEvent()
     
    Public Property Var826() As Integer
        Get
            Var826 = _Var826
        End Get
        Set(ByVal value As Integer)
            If value <> _Var826 Then
                _Var826 = value
                RaiseEvent Var826ChangedEvent()
            Else
                _Var826 = value
            End If
        End Set
    End Property

    Public Property Var827() As Integer
        Get
            Var827 = _Var827
        End Get
        Set(ByVal value As Integer)
            If value <> _Var827 Then
                _Var827 = value
                RaiseEvent Var827ChangedEvent()
            Else
                _Var827 = value
            End If
        End Set
    End Property

End Class


Вот мой код для обработки событий:

Public Sub Var826ChangedEventFired() Handles ClassMFTV.Var826ChangedEvent

        'Update the radio button
        If Var826 = 0 Then
            Me.RadioXMasterHole.Checked = True
            FormOperatorCDC.RadioXMasterHole.Checked = True
        Else
            Me.RadioXSetPoint.Checked = True
            FormOperatorCDC.RadioXSetPoint.Checked = True
        End If


    End Sub


    Public Sub Var827ChangedEventFired() Handles ClassMFTV.Var827ChangedEvent

        'Update the radio button
        If Var827 = 0 Then
            Me.RadioBNotTilted.Checked = True
            FormOperatorCDC.RadioBNotTilted.Checked = True
        Else
            Me.RadioBTilted.Checked = True
            FormOperatorCDC.RadioBTilted.Checked = True
        End If

    End Sub

CHill60

Используйте Улучшить вопрос ссылка для публикации кода из вашего класса - deos не обязательно должен быть всем этим, но убедитесь, что вы включили события и любые обработчики событий

Ralf Meier

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

theskiguy

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

Richard Deeming

WithEvents и Handles это просто "синтаксический сахар". Вы можете достичь того же результата, вручную добавив обработчики событий с помощью AddHandler.

Как написать обработчики событий[^]

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

2 Ответов

Рейтинг:
0

Ralf Meier

Здесь вы можете найти то, что должно вам помочь :
vb.net -обработка события статического класса-переполнение стека[^]

Единственный способ использовать событие из модуля-это то, что Ричард Диминг уже описал в своем комментарии ...