Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в стандартной процедуре обработать условие, с 
:(
    Опции темы
t0r
  Дата 24.10.2003, 05:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте все, кто не поленился это прочитать. Господа прошу помощи вот по какому вопросу. НА VBA в EXCEL-е написал процедуру (назову ее для примера copy-timer), выполняющую, условно непрерывный процесс (заполнение ячеек, по таймеру). На лист поместил кнопку "стоп". Очень бы хотелось, чтобы по нажатии этой кнопки процесс остановился, в условных обозначениях программа выглядела бы так:

sub copy-timer()
<собственно сам процесс связанный с заполнением>
if "стоп" нажата then exit sub' вопрос-как это описать?
end sub
Private Sub стоп_Click()

End Sub
По всей видимости это очень просто, но я что-то в ступор попал.
Заранее благодарен.



  Вверх
~FoX~
Дата 24.10.2003, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 10
Всего: 68



Попробуй так
Код

Private Sub copy-timer(Flag As Boolean)
If Flag = True Then
 ....  твой код
Else: End If
End Sub

Private Sub CommandButton1_Click()
  Call copy-timer(True)
End Sub

Private Sub CommandButton2_Click()
  Call copy-timer(False)
End Sub


Только учти что во времы выполнения цикла ты не можешь кнопки давить, разберись с DoEvents

Удачи



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Alles
Дата 24.10.2003, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 26.6.2003
Где: RUSSIA

Репутация: 2
Всего: 2



Я чот не понял ?! тебе остановить заполнение нужно на время нажатия или ........как ?
если или как тогда внутри твоей процедуры можно обращатся к той- же кнопки с мотреть ие Caption. А принажатии на кнопку просто меняет свой Caption
Код

Private Sub copy_timer()
'.....................тело  твоей  процедуры
If CommandButton1.Caption = "Пуск" Then Exit Sub
'.....................тело  твоей  процедуры
End Sub

Private Sub CommandButton1_Click()
If CommandButton1.Caption = "Пуск" Then CommandButton1.Caption = "Стоп": copy_timer Else CommandButton1.Caption = "Пуск":
End Sub


Да и Fox прав про DoEvents на это обрати внимание !

Удачи!

PM MAIL ICQ   Вверх
Alles
Дата 24.10.2003, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 26.6.2003
Где: RUSSIA

Репутация: 2
Всего: 2



Да ..забыл по умалчанию Caption кнопки будет Стоп
PM MAIL ICQ   Вверх
Mephisto
Дата 25.10.2003, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Цитата
заполнение ячеек, по таймеру

Просто делай
Код
Timer.Enabled = False

PM   Вверх
~FoX~
Дата 27.10.2003, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 10
Всего: 68



U-Boot
Угу, это при условии что таймер компанент........а если это процедура или функция confused.gif wink.gif


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Mephisto
Дата 27.10.2003, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Цитата
а если это процедура или функция

Ну а если всё-таки компонент, то:
Код
Timer.Enabled = False

PM   Вверх
Unregistered
Дата 28.10.2003, 11:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо всем кто ответил. Так как все обсуждение стало уходить в сторону таймера и начинки процедуры - немного напомню: что приведенный пример скорее абстактен чем конкретен smile.gif. Мне же больше хотелось узнать как не в PRIVATE SUB а именно в самой- главной процедуре SUB обрабатывать нажатую "где-то" кнопку. Я для этого и код условный привел. В принципе я еще хочу вопрос немного расширить (а точнее поставить его с ног на голову): как из Private Sub CommandButton1_Click() передать остановку основной процедуры, т.е. в условном коде
sub xxxx()

end sub
Private Sub CommandButton1_Click()
................................................<- здесь что нужно написать, чтобы 'xxxx' процедура остановилась?
end sub

  Вверх
~FoX~
Дата 28.10.2003, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 10
Всего: 68



Чем тебя не устроил мой пример? Вполне нормально останавливает........


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
cardinal
Дата 28.10.2003, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Код
Private Sub copy-timer(Flag As Boolean)
If Flag = True Then
....  твой код
Else: End If
End Sub

Private Sub CommandButton1_Click()
 Call copy-timer(True)
End Sub

Private Sub CommandButton2_Click()
 Call copy-timer(False)
End Sub


~FoX~, то что ты написал ничего вполне нормально не останавливает! Ты просто вызываешь процедуру по разному. Один раз ты ей говоришь, что надо что-то делать, а второй раз говоришь, что делать ничего не надо, но факт что вызыва было два остается. Unregistered надо остановить выполняющую, условно непрерывный процесс процедуру. Если мы сделаем то что предложил ты мы остановим только одну из вызванных процедур, а вторая будет "крутиться" как и крутилась sad.gif. Вот тебе пример показывающий, что то, что ты написал работает не так как ты думаешь.

Код
Private Sub Command1_Click()
Call copytimer(True)
End Sub

Private Sub Command2_Click()
Call copytimer(False)
End Sub

Private Sub copytimer(Flag As Boolean)
Debug.Print "enter"
Do
DoEvents
If Flag = True Then
' ....  твой код
Else
   Debug.Print "exit"
   Exit Sub
End If
Loop
End Sub


Я же предлашаю товарищу Unregistered во-первых, конечно, зарегистрироваться smile.gif, а во вторых сделать следующее: объявить глобальную переменную и управлять ей твоей процедурой. Вот тебе пример:

Код
Public controller As Integer

Private Sub Form_Load()
controller = 0
End Sub

Sub xxxx()
Dim i As Double
Do
   If controller = 1 Then
       controller = 0
       Exit Sub
   Else
       If i Mod 100 = 0 Then
           DoEvents
           Debug.Print i
       End If
   End If
   i = i + 1
Loop
End Sub

Private Sub Command1_Click()
Command1.Enabled = False
Command2.Enabled = True
Call xxxx
End Sub

Private Sub Command2_Click()
Command1.Enabled = True
Command2.Enabled = False
controller = 1  ' остановить процедуру
End Sub


Если ты будешь при этом смотреть в окно Debug`ера, то ты увидишь, что процедура останавливается.
Может этот способ и не очень изящный, но зато ты имеешь кучу возможностей остановки своей процедуры. Я это придумал когда мне надо было организовать один страшный поток, который крутился паралельно с самой программой, а программа должна была им управлять.
Успехов!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
t0r
Дата 29.10.2003, 14:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Еще раз большое, как говорится, человеческое мерси, за участие в обсуждении. Насчет регистрености, - регистреный я, блин, просто спешил очень в прошлый раз вот и влетел на форсаже как "Unregistered "
  Вверх
cardinal
Дата 29.10.2003, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата
человеческое мерси, за участие в обсуждении

так ответ то тебя удолетворил или нет, а то мерси за участие, но вы все лапухи. smile.gif
p.s. но ты все равно Unregistred


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
t0r
Дата 30.10.2003, 09:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да, ответ удовлетворил (поэтому и мерси)- все прозрачно и читаемо (это очень важно, т.к. блуждание по лабиринтам чужого сознания отнимает массу сил, и по итогу заводит в тупик).
Я вобщем, пока в деле-то не попробовал, но код читаем и суть ясна. Насчет введения 2-х кнопок: одна для старта, другая для стопа - правильно я понял? (этот вопрос потому, что вначале я одну кнопку вводил - только для стопа). Насчет изящности согласен - выглядит громоздковато smile.gif Чесно признаюся, идея с с PUBLIC переменной мне и самому в голову приходила, но я чего-то в этом направлении не стал двигать, посчитал, что закручено это все сильно и есть какой-нибудь обходняк простейший (может, кстати и есть).

P.S. на туже тему: чего-то действительно пишут мне, что я "Unregistered", странно, а парол высланный на мыло и все такое, опять же вроде не касячил - вобщем, типа свой я, отечественныйsmile.gif
  Вверх
cardinal
Дата 30.10.2003, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата
Насчет введения 2-х кнопок: одна для старта, другая для стопа - правильно я понял? (этот вопрос потому, что вначале я одну кнопку вводил - только для стопа).


Понял ты правильно. Но проблем сделать одну кнопку из двух тоже никаких нет. Вот тебе пример:

Код
Public controller As Integer

Private Sub Form_Load()
controller = 0  ' процедура не была вызвана
End Sub

Sub xxxx()
Dim i As Double
Do
   If controller = 2 Then
       controller = 0  ' процедура не была вызвана
       Exit Sub
   Else
       If i Mod 100 = 0 Then
           DoEvents
           Debug.Print i
       End If
   End If
   i = i + 1
Loop
End Sub

Private Sub Command1_Click()
Select Case controller
Case 0:
   controller = 1  ' процедура была вызвана
   Call xxxx
Case 1:
   controller = 2  ' остановить процедуру
End Select
End Sub


Нажал - запустилось, нажал еще раз - остановилось и т.д.

Теперь насчет громоздкости. Так то это так, но дело в том что помоему в данном случае не тольк опроще использовать глобальную переменную, но и эффективней. Тут есть другой путь который можно обдумать. Можно попытаться останавливать твою процедуру event`ом, то есть событием, но как это делается в VB я пока не совсем понял. Я это никогда еще не использовал, но вот решил попробовать. В MSDN можно найти след. пример:

RaiseEvent Statment Example
The following example uses events to count off seconds during a demonstration of the fastest 100 meter race. The code illustrates all of the event-related methods, properties, and statements, including the RaiseEvent statement.

The class that raises an event is the event source, and the classes that implement the event are the sinks. An event source can have multiple sinks for the events it generates. When the class raises the event, that event is fired on every class that has elected to sink events for that instance of the object.

The example also uses a form (Form1) with a button (Command1), a label (Label1), and two text boxes (Text1 and Text2). When you click the button, the first text box displays "From Now" and the second starts to count seconds. When the full time (9.84 seconds) has elapsed, the first text box displays "Until Now" and the second displays "9.84"

The code for Form1 specifies the initial and terminal states of the form. It also contains the code executed when events are raised.

Код
Option Explicit

Private WithEvents mText As TimerState

Private Sub Command1_Click()
   Text1.Text = "From Now"
   Text1.Refresh
   Text2.Text = "0"
   Text2.Refresh
   Call mText.TimerTask(9.84)
End Sub

Private Sub Form_Load()
   Command1.Caption = "Click to Start Timer"
   Text1.Text = ""
   Text2.Text = ""
   Label1.Caption = "The fastest 100 meters ever run took this long:"
   Set mText = New TimerState
   End Sub

Private Sub mText_ChangeText()
   Text1.Text = "Until Now"
   Text2.Text = "9.84"
End Sub

Private Sub mText_UpdateTime(ByVal dblJump As Double)
   Text2.Text = Str(Format(dblJump, "0"))
   DoEvents
End Sub


The remaining code is in a class module named TimerState. Included among the commands in this module are the Raise Event statements.

Код
Option Explicit
Public Event UpdateTime(ByVal dblJump As Double)
Public Event ChangeText()

Public Sub TimerTask(ByVal Duration As Double)
   Dim dblStart As Double
   Dim dblSecond As Double
   Dim dblSoFar As Double
   dblStart = Timer
   dblSoFar = dblStart
   
   Do While Timer < dblStart + Duration
       If Timer - dblSoFar >= 1 Then
           dblSoFar = dblSoFar + 1
           RaiseEvent UpdateTime(Timer - dblStart)
       End If
   Loop
   
   RaiseEvent ChangeText
   
End Sub


Я его запустил и увидил, что как-то это все тормозит по страшному (но это наверно потому, что нет DoEvents, только в голову стукнуло, что я его забыл smile.gif), но это не суть. Дело в том, что я пока никакой изящности и тут не увидел. Может как-нибудь специалист по событиям прочитает это и напишет нам что-нибудь полезное по поводу останова бесконечного цикла при помощи событий. smile.gif


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Vach
Дата 31.10.2003, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 17.10.2003
Где: Санкт-Петербург

Репутация: 8
Всего: 18



Можно все запихать в класс модуль
(собственно как и сделано в примере выше)

1. создайте стандартный проект
2. на форму поместите две кнопки
3. добавьте следующий код
Код
Option Explicit
Private WithEvents myLoop As c_myLoop

Private Sub Command1_Click()
myLoop.StartStop
End Sub

Private Sub Command2_Click()
myLoop.SubLoopEvent
End Sub

Private Sub Form_Load()
Set myLoop = New c_myLoop
End Sub

' событие генерируется непрерывно после нажатия на кнопку Command1
' при повторном нажатии - событие перестает происходить .....
Private Sub myLoop_LoopEvent()
Command1.Caption = Rnd 'визоулизация процесса
End Sub


4. Добавьте в проект class module и назовите его c_myLoop
5. В class module c_myLoop поместите следующий код

Код
Option Explicit

'Регистрация событий
Public Event EventStart() ' после старта
Public Event EventStop()  ' после остановки
Public Event LoopEvent()  ' циклически вызываемое событие

Public localcState As Boolean   ' флаг остановки

' запуск - остановка
Public Sub StartStop()
' смена состояния флага
If localcState Then
localcState = False
Else
localcState = True
SubLoopEvent
End If
End Sub

Private Sub Class_Initialize()
'localcState = True '- устанавливается в случае необходимости
'SubLoopEvent '- запуска SubLoopEvent при инициализации
localcState = False
End Sub

'Собственно всё ради чего...
'(при старте процедуры SubLoopEvent - происходит её однократное выполнение)
Public Sub SubLoopEvent()
DoEvents ' Тут и далее DoEvents служит для перестраховки.
        ' Скорее всего, после процесса отладки, некоторые можно будет убрать
RaiseEvent EventStart '- генерация события EventStart
Do
DoEvents

' ... ' - Здесь можно расположить сам код "бесконечного цикла".
' ... ' - (в кавычках по той причине, что это тоже не бесконечный цикл :)
RaiseEvent LoopEvent ' - или создавать событие LoopEvent

DoEvents
Loop While localcState ' - флаг остановки цикла
DoEvents
RaiseEvent EventStop ' - соответственно событие EventStop
End Sub


PS
помните - это не отдельный процесс и его можно с успехом завесить
я им пользуюсь когда надо обогнать таймер smile.gif
PSPS
возможно текст излишне комментирован sad.gif

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.