Часы на форме.

Программирование на Visual Basic for Applications
FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Часы на форме.

Сообщение FLAGER » 18.09.2005 (Вс) 17:42

Товарищи! У VBA нужно в форму вставить часы. Я вставил с помощью функцыи Time, но тогда их значение фиксируеться, т.е. часы не идут. Как сделать так, чтобы часы на форме шли, но притом не мешали выполнению других задач на форме? Помогите, пожалуйста!

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 18.09.2005 (Вс) 18:00

Посмотри в хэлпе Application.OnTime
Life is what happens to us when we are planning to do something else...

FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Сообщение FLAGER » 18.09.2005 (Вс) 21:42

Смотрел, ничего не понял - все по английски, еще и написано сложно.
Вопрос остаеться в силе.

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 18.09.2005 (Вс) 22:27

Код: Выделить всё
'Это в отдельный модуль:
Public Sub ChangeTime()
     'Отображаем время на лэйбле Label1 формы UserForm1
     UserForm1.Label1.Caption = Now()
     'Устанавливаем время следующего запуска этой процедуры
     Application.OnTime Now + TimeValue("00:00:01"), "ChangeTime"
End Sub

'Это в код формы:
Private Sub UserForm_Initialize()
     'инициируем запуск процедуры по таймеру при загрузке формы
     Call ChangeTime
End Sub

Private Sub UserForm_Terminate()
     'При выходе из формы отменяем установленное нами расписание запуска процедуры
     Application.OnTime Now + TimeValue("00:00:01"), "ChangeTime", Schedule:=False
End Sub

...пришлось даже убедиться что работает...
Life is what happens to us when we are planning to do something else...

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 18.09.2005 (Вс) 22:42

А в общем случае, конечно, логичнее было бы подключить компонент Timer (как в VB). Бесплатный подобный компонент можно скачать отсюда: http://visual.2000.ru/develop/vb/source/ietimer.zip
Если не знаешь как подключать, то читай здесь:http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/VBA/302.mspx
Life is what happens to us when we are planning to do something else...

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 19.09.2005 (Пн) 12:01

Можно и без таймера:
Код: Выделить всё
Private Sub UserForm_Activate()
ChangeTime
End Sub

Public Sub ChangeTime()
      Do
     UserForm1.Label1.Caption = Now()
       DoEvents
     Loop
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'завершаем работу всех процедур
End
End Sub

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 19.09.2005 (Пн) 12:33

Да, действительно Do...Loop подойдет. Правда, я сейчас затестил - в этом коде на моем компе лэйбл обновляется примерно 26000 раз в секунду. При этом загрузка проца сразу поднимается до 100%. Не думаю, что каждый согласится насиловать свой комп...
Life is what happens to us when we are planning to do something else...

FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Сообщение FLAGER » 19.09.2005 (Пн) 14:15

Спасибо всем!
Но с цыклом Do...Loop висяки получаються, попробую как писал K.Sergey. Еще раз спасибо!

FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Сообщение FLAGER » 19.09.2005 (Пн) 22:49

С цыклом Do...Loop тормозит очень, этот вариант не подходит.

2K.Sergey: а тот вариант, что вы написали, не работает. Дает ошыбку "Expected variable or procedure, not module." и подсвечивает строку Call ChangeTime. Я уже пробовал ставить Call FLAGER1.ChangeTime, где FLAGER1 - название проекта, все равно не работает. Что делать?

FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Сообщение FLAGER » 20.09.2005 (Вт) 8:19

Ошыбки уже не выдает, так как я указал полный путь к той процедуре FLAGER1.aaa.ChangeTime (где FLAGER1- проект, aaa - модуль, а дальше сама процедура). Но часы дальше показывают токо одно значение и все, дальше не идут. ПОМОГИТЕ!!!

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 20.09.2005 (Вт) 8:33

У меня работает, а у тебя нет. А чудес на свете не бывает. Держи мою книгу.
Плюс посмотри в эту тему: http://bbs.vbstreets.ru/viewtopic.php?t=19244. Там похожая задача и тоже проект валяется. Если не найдешь ошибки - кидай свой прокет - посмотрим...
Вложения
OnTime2.rar
(7.09 Кб) Скачиваний: 174
Life is what happens to us when we are planning to do something else...

FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Сообщение FLAGER » 20.09.2005 (Вт) 14:52

Спасибо, что помогаеш. Попробую, разберусь потом, напишу тут, что вышло. Только я это делаю не в Excel, a в Word-е, если что не так - дам свой документ.

FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Сообщение FLAGER » 20.09.2005 (Вт) 15:41

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

K.Sergey
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 11.10.2004 (Пн) 0:42
Откуда: Санкт-Петербург

Сообщение K.Sergey » 20.09.2005 (Вт) 16:38

Все понятно. В ворде OnTime немного по-другому устроено. Во-первых, событие не наступает если открыто какое-либо модальное окно (включая Message box). Т.е. единственным выходом будет установить свойству ShowModal твоей формы значение False.
Во-вторых в справке не написано как можно отменить расписание. В эксель это делается просто - параметру Schedule присвояется False. В ворде такого параметра просто не существует. Я вижу только один способ его отменить - установить в качестве даты следующего запуска уже прошедший день (например, 1 января 1930 года, 20:00). Также желательно установить минимальное значение срока ожидания этого таймера (1 сек.).
Другое что я заметил - это то, что при закрытии приложения таймер отменяется. Не знаю как в Эксель, а времени проверять нет.
Одним словом - лажатина...
На всякий случай высылаю обратно тебе документ. У меня он работает...
Вложения
FLAGER.rar
(7.28 Кб) Скачиваний: 135
Life is what happens to us when we are planning to do something else...

FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Сообщение FLAGER » 20.09.2005 (Вт) 21:18

Спасибо, попробую.

FLAGER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 67
Зарегистрирован: 12.09.2005 (Пн) 13:49

Сообщение FLAGER » 21.09.2005 (Ср) 7:47

2K.Sergey: большое спасибо! Все работает. Но только, когда я хочу сменить название модуля Module1 на другое, более сподручное, снова дает ошыбки. Поясните, пожалуйста, в чем дело?


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList  
cron