Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/32: Рейтинг темы: голосов - 32, средняя оценка - 4.84
4 / 4 / 0
Регистрация: 12.09.2011
Сообщений: 148
1

Создать событие onchange на изменение переменной

23.10.2012, 10:55. Показов 5872. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребята! Привет! Вопрос такой: есть переменная, которая постоянно изменяется(неважно почему). Надо сделать событие наподобии,которое есть в textboxе "textchange", чтобы как только она(переменная) менялась выскакивал ивент. Прочитал MSDN нифига не понял. Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2012, 10:55
Ответы с готовыми решениями:

Создать событие на изменение переменной
Помогите создать событие на изменение переменной CALLERNUMBER Собственно причина в том что, внутри...

Создать событие на изменение значения переменной
есть переменая типа инт мне необходимо создать событие которое бы происходило при изменении...

Событие onChange
Здравствуйте всем! Такая проблема при переключении языка переключается только последний в списке,...

Событие onchange
Здравствуйте кодеры) Установил на сайт скриптовый календарь на Input и теперь при клике на него...

14
96 / 96 / 3
Регистрация: 01.12.2011
Сообщений: 94
23.10.2012, 11:16 2
Вот в примере программа следит за состоянием переменной с именем "переменная".
На форме кнопка, при нажатии на кнопку значение переменной изменяется и соответственно показывается сообщение.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Public Class Form1
    Dim переменная As Object
 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        tmp = переменная 'заносим нашу переменную во временную
        a1.Start() 'запускаем поток с вечным циклом
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        переменная = (New Random).Next(0, 1000000000) 'генерируем случайное число, тем самым изменяя значение переменной
    End Sub
 
 
 
    Public Event changemy()
    Private Sub переменная_change() Handles Me.changemy
        MsgBox("Значение переменной ""переменная"" изменилось!")
    End Sub
    Dim a1 As New Threading.Thread(AddressOf wait)
    Dim tmp As Object
    Delegate Sub invoker()
    Sub invokermy()
        RaiseEvent changemy()
    End Sub
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        a1.Abort()
    End Sub
    Sub wait()
        Do
            If Not tmp = переменная Then
                tmp = переменная
                Dim a1 As New invoker(AddressOf invokermy)
                Me.Invoke(a1)
            End If
        Loop
    End Sub
End Class
0
7484 / 4148 / 474
Регистрация: 25.08.2012
Сообщений: 11,529
Записей в блоге: 11
23.10.2012, 11:20 3
Как идея.
При загрузке формы запускается процедура, которая в бесконечном цикле
сравнивает старое и новое значение переменной.
Обязательно включить DoEvents.
Если изменение есть - смена старого на новое и обработка события. Как.
Удачи.

Добавлено через 1 минуту
Извините не увидел вадим2. Не писал бы.
0
96 / 96 / 3
Регистрация: 01.12.2011
Сообщений: 94
23.10.2012, 11:23 4
Ничего)) Только лучше в поток этот цикл запихнуть, так как при DoEvents программа не заедает, но ничего сделать нельзя
0
7484 / 4148 / 474
Регистрация: 25.08.2012
Сообщений: 11,529
Записей в блоге: 11
23.10.2012, 11:39 5
Все верно, вадим2.
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
23.10.2012, 11:50 6
а так?
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Public Class Form1
 
    Dim WithEvents NewVar As New MyVariable(Of String)
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        NewVar.Value = Date.Now.ToString
    End Sub
    
 
    Private Sub NewVar_OnChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles NewVar.OnChange
        MsgBox(NewVar.Value.ToString)
    End Sub
End Class
 
Friend Class MyVariable(Of T)
    Private pvalue As T
    Friend Event OnChange(ByVal sender As Object, ByVal e As System.EventArgs)
    Friend Property Value() As T
        Get
            Return pvalue
        End Get
        Set(ByVal value As T)
            pvalue = value
            RaiseEvent OnChange(Me, New System.EventArgs)
        End Set
    End Property
End Class
тут у нас переменная будет пользовательского класса с изменяемым типом (тип задается такой, какой нам надо, при объявлении нового экземпляра. Для доступа к ее значению используем свойство Value. Ну и взамен имеем событие OnChange
1
7484 / 4148 / 474
Регистрация: 25.08.2012
Сообщений: 11,529
Записей в блоге: 11
23.10.2012, 13:20 7
Отлично, Дмитрий!
0
4 / 4 / 0
Регистрация: 12.09.2011
Сообщений: 148
23.10.2012, 14:02  [ТС] 8
Дмитрий, Что такое "T"?
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
23.10.2012, 14:31 9
просто обозначение типа. Он в-общем случае (в теле класса не указан).
Это дает возможность на основе одного и того же класса создавать экземпляры переменных разных типов. Смотри на стр.№3 в моем коде - там объявлена переменная NewVar как новый экземпляр класса MyVariable и указано, что это будет тип String. Соотв. и свойство Value будет типа String для переменной NewVar.
Никто не мешает рядом объявить другую переменную - экземпляр класса MyVariable но с другим типом. И потом обрабатывать и ее событие OnClick отдельно от аналогичного события NewVar
1
4 / 4 / 0
Регистрация: 12.09.2011
Сообщений: 148
23.10.2012, 14:57  [ТС] 10
Дмитрий, спасибо! Еще один вопросик: как сделать так, чтобы событие возникало реально при изменении переменной: просто ее значение может повторяться несколько раз подряд( в дебуггере будет выглядеть так:4,2,2,2,2,2,8) а мне надо чтобы приходили значение (4,2,8)Вот так
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
23.10.2012, 15:04 11
как-то так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Class Form1
 
    Dim WithEvents NewVar As New MyVariable(Of String)
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        NewVar.Value = Date.Now.ToString
    End Sub
    
 
    Private Sub NewVar_OnChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles NewVar.OnChange
        MsgBox(NewVar.Value.ToString)
    End Sub
End Class
 
Friend Class MyVariable(Of T)
    Private pvalue As T
    Friend Event OnChange(ByVal sender As Object, ByVal e As System.EventArgs)
    Friend Property Value() As T
        Get
            Return pvalue
        End Get
        Set(ByVal value As T)
if not pvalue.equals (value) then
 pvalue = value
            RaiseEvent OnChange(Me, New System.EventArgs)
end if
            End Set
    End Property
End Class
0
4 / 4 / 0
Регистрация: 12.09.2011
Сообщений: 148
23.10.2012, 15:13  [ТС] 12
Дмитрий! СУПЕР! СПАСИБО!

Может подскажите какую-нибудь хорошую литературку по VB.net и VS2010? СПАСИБО!
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
23.10.2012, 15:16 13
да в гугл залезь и скачай. Скорее всего будет все интересно.
1
4 / 4 / 0
Регистрация: 12.09.2011
Сообщений: 148
23.10.2012, 15:46  [ТС] 14
VB.NET
1
2
3
4
5
Public Sub order_OnChange(ByVal sender As Object, ByVal e As System.EventArgs) Handles 1.OnChange, 2.OnChange
        If 1.Value = "16" And 2.Value <= -60 Then
            Call Sub(процедура)
        End If
    End Sub
Дмитрий, когда делаю вот так вот, то приходит значение "16" все равно 2 раза, хотя если поотдельности вызывать события все нормально. Я так предполагаю, что каждый onchange работает в своем потоке и 1 обновляется быстрей, чем 2 поэтому приходит два раза "16" и соответсвенно процедура вызвается дважды. Может ли такое быть или причина в другом?
0
1710 / 1198 / 227
Регистрация: 23.12.2010
Сообщений: 1,527
23.10.2012, 16:17 15
Цитата Сообщение от Fardo Посмотреть сообщение
1 обновляется быстрей, чем 2
ну тут уж как ты указал в коде. Конечно, они не одновременно оба изменяются. Ну и тогда количество вызовов "процедуры" будет зависеть от того, на что изменились эти значения.
Т.е. положим, что у тебя в коде есть фрагмент:
VB.NET
1
2
1.value = 16
2.value = -20
при этом старое значение переменной 2 тоже <=60.
Тогда Call Sub(процедура) будет 2 раза.
А вот если
VB.NET
1
1.value =15
то ни разу не должно вызваться.
Или если старое значение 2.value>-59 то вызовется 1 раз.
А изменение значений идет в одном потоке (ну если ты специально с потоками не химичишь) и причем в той очередности, как прописано у тебя в коде.
1
23.10.2012, 16:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2012, 16:17
Помогаю со студенческими работами здесь

Не могу сделать событие на изменение данных в переменной , int или CString
как сделать что бы генерировалось событие ? если делать через while то в отдельном потоке надо да и...

Тег Select событие onchange
Как сделать так, что бы выполнялась функция на языке c#, при изменении поля в select

событие onchange тэга select
&lt;select id=&quot;street&quot; onchange=&quot;getstations()&quot;&gt; &lt;option value=0&gt;Виберіть вулицю&lt;/option&gt; ...

Вычисления по условию. Событие OnChange
Лабораторная работа 4. Вычисления по условию. Событие OnChange. Задание для выполнения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru