Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: как обнулить переменную, объявленную Static? Добавлено: 24.09.08 01:29  

Автор вопроса:  DimDoc
Есть ли способ обнулить переменную, объявленную static из другой процедуры? Неужели перезапускать программу?

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 24.09.08 01:57
Ну если извратиться, то можно так:
  1. Sub Main()
  2.     Call Sub1(1, 2)
  3.     '...
  4.     ' do something
  5.     '...
  6.     Call Sub1(0, 0, True)
  7. End Sub
  8.  
  9. Private Sub Sub1(param1, param2, Optional ByVal ZeroStaticVariables As Boolean = False)
  10.     Static StaticVariable1 As Long
  11.     Static StaticVariable2 As Long
  12.     If ZeroStaticVariables Then
  13.         StaticVariable1 = 0
  14.         StaticVariable2 = 0
  15.         Exit Sub
  16.     End If
  17.     StaticVariable1 = StaticVariable2 + param1 + param2
  18.     StaticVariable2 = StaticVariable1 + param1 - param2
  19. End Sub

Ответить

Номер ответа: 2
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #2 Добавлено: 24.09.08 02:17
Самый верный способ - пересмотреть архитектуру своего приложения. Т.к. если возникает такое желания, как обнулить статик переменную из другого метода - это уже похоже на ошибку в днк.

Ответить

Номер ответа: 3
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #3 Добавлено: 24.09.08 08:48
Спасибо!
вот почему возник вопрос...
В числовом поле ввода необходимо запретить второй decimalpoint. Если в процедуре KeyPress объявить статическую переменную для подсчёта попыток ввода десятичного разделитея - тогда всё работает отлично. Но...
При повторном использовании этого поля ввода - уже нельзя ввести ни одного decimalpoint!!!
.... я сейчас на работу. завтра пообщаемся.

Ответить

Номер ответа: 4
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #4
Добавлено: 24.09.08 12:52
Не проще ли объявить публичную/глобальную переменную?

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 24.09.08 16:22
В правильно спроектированном приложении не используются Static-переменные в процедурах.

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

Ответить

Номер ответа: 6
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #6 Добавлено: 24.09.08 23:06
Да... Чего то я наворотил вначале...
вот вариант, который работает (пока ошибок не нашёл)
  1.  
  2. Private Sub txt1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt1.KeyPress
  3.         Dim c As Char = e.KeyChar
  4.  
  5.         If Char.IsDigit(c) Or Char.IsPunctuation(c) Then
  6.             If Char.IsPunctuation(c) Then
  7.                 If InStr(txt1.Text, ".") = 0 Then
  8.                     e.KeyChar = "."
  9.                 Else
  10.                     e.KeyChar = ""
  11.                 End If
  12.             End If
  13.         Else
  14.             e.KeyChar = ""
  15.         End If
  16.     End Sub

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 25.09.08 21:16
Для отмены символа можно делать e.Cancel=True
InStr не используй, вместо него лучше txt1.Text.Contains(...)

Ответить

Номер ответа: 8
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #8 Добавлено: 26.09.08 02:40
Для отмены символа можно делать e.Cancel=True
Не работает. Прерывает отладчик.
Зато нашёл такой вариант:
e.Handled = True ' значит - как будто событие произошло, но символ реально не вводится.
....
Заменил строку
If InStr(txt1.Text, ".";) = 0 Then
на
If sender.text.contains(".";) Then
замена txt1.Tex на sender.text позволяет не писать этот код для следующего поля ввода! для этого необходимо дописать в конце объявления процедуры txt1_KeyPress:
 Handles txt1.KeyPress, txt2.KeyPress, txt3.KeyPress и т.д.
да, InStr я вспомнил из VB6, и сработало. А почему так делать не надо? Чем Contains() лучше???
Сейчас процедура выглядит так:
  1.  
  2.     Private Sub my_KPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt1.KeyPress, txt2.KeyPress
  3.         Dim c As Char = e.KeyChar
  4.         If Char.IsDigit(c) Or Char.IsPunctuation(c) Then
  5.             If Char.IsPunctuation(c) Then
  6.                 If sender.text.contains(".") Then
  7.                     e.Handled = True
  8.                 Else
  9.                     e.KeyChar = "."
  10.                 End If
  11.             End If
  12.         ElseIf Asc(c) = 8 Then
  13.         Else
  14.             e.Handled = True
  15.         End If
  16.     End Sub

Ответить

Номер ответа: 9
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #9 Добавлено: 26.09.08 02:41
смайлики случайно приклеились...

Ответить

Номер ответа: 10
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #10 Добавлено: 26.09.08 02:43
да...
процедуру txt1_KeyPress переименовал в my_KPress

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам