2016-12-06 4 views
0

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

sub or ... control_ypos() 
     if ypos>10 then 
      exit environment 
     end if 
end sub 
sub main() 
    for i=0 to myarray1.length-1 
     ypos +=i 
    next 
    for i=0 to myarray2.length-1 
     ypos +=i 
    next 
.... 
end sub 
+0

Вместо 'Выхода Environment', используйте' End' остановиться близко всей программы.Если вы просто хотите выйти из подкаталога, используйте 'Exit Sub'. Если вы хотите выйти из цикла 'For .. Next',' Exit For' –

+0

благодарим вас за ответ .... Но моя проблема не в том, чтобы выйти из среды, или вот так ... моя проблема - проверить значение переменной автоматически во время выполнения , – MDA

+0

ОК. Какая переменная и вы хотите ее проверять с фиксированными интервалами или в определенных точках во время выполнения кода? –

ответ

2

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

Хорошо, это класс, посмотрите комментарии, чтобы посмотреть, как это работает.

Friend Class MonitoredNumber(Of t As IComparable) 
    ' Using of T means that the variable can be any type - Integer, Single, Double etc 
    Private MonitoredValue As t 
    Private _minValue As t 
    Private _maxValue As t 

    'this creates a an event handler 
    Public Event OutOfRange() 

    'this is the constructor that you will use when you create the "Variable" even though it is actually an instance of the MonitoredNumber class 
    'and it defines the minimum and maximum values 
    Public Sub New(min As t, max As t) 
     _minValue = min 
     _maxValue = max 
    End Sub 

    Public Property Value As t 
     Get 
      Return MonitoredValue 
     End Get 
     Set(value As t) 
      MonitoredValue = value 
      'if the "variable is set to a value outside the defined range, then the OutOfRangeEvent is raised 
      If MonitoredValue.CompareTo(_minValue) < 0 Or MonitoredValue.CompareTo(_maxValue) > 0 Then 
       RaiseEvent OutOfRange() 
      End If 
     End Set 
    End Property 

End Class 

Чтобы создать «переменный» добавьте в свой код, где вы определили переменную, которую вы хотите контролировать - с указанием его, как вам нравится, конечно

Dim WithEvents x As New MonitoredNumber(Of Integer)(4, 5) 

В приведенной выше строке ключевого слова WithEvents что событие OutOfRange обрабатывается обработчиком событий ниже.

Of Integer следует изменить на какой номер номера, который вы хотите отслеживать. Если это двойной, то измените его на Of Double и т. Д.

Эти два параметра являются минимальными и максимально допустимыми значениями для числа - изменили их на все, что вам нужно.

В вашей форме вам, наконец, необходимо добавить обработчик событий ниже для события OutOfRange.

Private Sub MonitoredNumberChanged() Handles x.OutOfRange 
    'do stuff here to do what you want to do if the event is out of range 
    MessageBox.Show("Value out of range. Value =" & x.Value.ToString) 
End Sub 

Так использовать свой код, определить YPos, как

Dim WithEvents ypos As New MonitoredNumber(Of Integer)(0, 10) 

я предполагаю 0 в качестве минимального значения, но вы можете изменить его на что угодно.

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

Чтобы изменить значение числа, используйте ypos.value = ypos.value + 1 «, чтобы добавить один к ней и так далее

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

Если у любого другого пользователя есть лучший способ, напишите свой собственный ответ.

+0

Спасибо ... Я думаю, что это лучше, и мой ответ – MDA

+0

Возможно, было бы даже лучше использовать абстрактный предикат лямбда вместо значений min/max и, если традиционно, перегрузить конструктор по умолчанию. Это также приводит к ограничению использования типа IComparable. Смотрите: pastebin.com/dPbj4Kws – DeFazer

1

Пожалуйста, исправьте меня, если я ошибаюсь; Сейчас у меня нет Visual Studio, поэтому я пишу из памяти. Возможно, есть некоторые синтаксические ошибки, но сам принцип должен быть прав.

Если вы не планируете создавать такие переменные управления во время выполнения, вы можете просто создать свойство в некотором фиктивном модуле:

Module Dummy 
    Dim _ypos As Integer = 0 
    Public Property control_ypos As Integer 
     Get 
      Return _ypos 
     End Get 
     Set 
      If _ypos>10 Then 'Do the checking stuff 
       End 
      Else 
       _ypos = value 
      End If 
     End Set 
    End Property 
End Module 

Sub Main() 
    For I=0 To myarray1.Length-1 
     Dummy.control_ypos += I 
    Next 
    For I=0 to myarray2.Length-1 
     Dummy.control_ypos += I 
    Next 
    ... 
End Sub 
+0

Благодарим вас за ответ – MDA

+0

@MDA, рад, что это помогло, даже если оно не так хорошо, как другое. Пожалуйста, обратите внимание, что здесь, в StackOverflow, он недоволен комментариями, такими как «Спасибо!», «+1», «Я тоже!». и тому подобное. Если вы чувствуете, что этот ответ полезен, просто повысьте его. :) – DeFazer

+0

да, вы правы, но я не позволяю голосовать за ваш ответ, потому что моя репутация меньше 15. – MDA

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