powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Timer
7 сообщений из 7, страница 1 из 1
Timer
    #33752773
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотел на время работы exe-шника навесить общий таймер. Чтобы висел над главным меню и не был привязан к моим окнам.

Сделал это так: (1)

Код: plaintext
1.
2.
3.
4.
5.
6.
_Screen.AddObject('Hronik','Timer2')
_Screen.Hronik.Interval= 1000 
Define Class Timer2 As Timer
Procedure Timer
		=Messagebox("Таймер сработал")
	Endproc
Enddefine
Проще не получилось. Например, это не работало: (2)
Код: plaintext
1.
2.
_SCREEN.AddObject('Hronik','Timer')
_SCREEN.Hronik.WriteMethod('Timer','=Messagebox("Таймер сработал")')
_SCREEN.Hronik.Interval= 1000 


Но даже если вставить работающие строчки варианта (1) в start.prg, то возникает ошибка компилирования.
Приходится блок (1) записывать отдельным файлом, например Budilnik.prg,
и запускать из start.prg всю конструкцию (1) командой DO Budilnik.prg

Вопросы:
1. Почему прямое размещение кода в start.prg терпит фиаско, и приходится двигаться "огородами"?
2. Почему при выполнении _SCREEN.Removeobject('Hronik') ФОКС назойливо предлагает удалить класс Timer2 ? И если без этого не обойтись, то как его "замочить" по тихому, чтобы пользователь ни сном, ни духом...?
3. Можно ли привести в чувство код(2), чтобы не объявлять новый класс Timer2?
...
Рейтинг: 0 / 0
Timer
    #33752997
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Ваш вариант 1 прекрасно работает, но..приведите ВЕСЬ код вашего start.prg - не везде можно размещать DEFINE CLASS... Например это:
You cannot place class definitions created with DEFINE CLASS within structured programming commands, for example, IF ... ENDIF or DO CASE ... ENDCASE, or in loops, such as DO WHILE ... ENDDO or FOR ... ENDFOR.
И откройте тайну о вашей версии VFP ?
2. А вы вообще читали HELP прежде, чем использовать WriteMethod?!
Что написано там:
"Writes the specified text to the specified method. Available at design time only ." Надеюсь, что переводить не надо?
С уважением, Алексей
...
Рейтинг: 0 / 0
Timer
    #33754369
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP 9.0 SP1.

2. Help читал. Там, действительно, написано, что во WriteMethod класс определять можно только в режиме отладки. Но о WriteExpression сказано: Available at design time and run time.
Поэтому я решил, что в Help может быть опечатка... Отчего же не попробовать при таком допущении вариант (2)? В Хелпах много чего-написано. Но всегда всё соответствует действительности. :)
"Прекрасно работающий" вариант (1), вроде и не нарушал указанных в Хелпе условий, но заработал только в "огородном" режиме. Одновременно эта же неприятность произошла у моего приятеля его стартовом файле. Поэтому возник несколько праздный вопрос: "Почему?"

1. Текст своего start.prg упростил до минимума:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
_Screen.AddObject('Hronik','Timer2')
_Screen.Hronik.Interval= 1000 
Define Class Timer2 As Timer
Procedure Timer
		=Messagebox("Таймер сработал")
	Endproc
Enddefine

Do mainmenu.mpx
Read Event

Да, действительно работает. Но, через пень-колоду...
Если я зашел в среду VPF, произвел какую-нибудь символическую модификацию start.exe (например, добавил пробел и тут же его удалил), то при получении exe-шника пишет:

Код: plaintext
Compile Error in file   start.app

Но, если я покину среду VFP, после этой корректировки-записи, затем снова вернусь и приступлю к компиляции немодифицированного start.prg, то ошибки не будет.

Предположу ваш резонный вопрос: "Что стоит за Do mainmenu.mpx ?"
Обычное меню. Причем, эту строку можно поставить даже первой в файле start.prg -
работать будет также.

-------------------------------------------------------------------------------------
Я немного поэкспериментировал и предлагаю вам самому почувствовать разницу
между вариантами А, Б, В и Г:

ВАРИАНТ А: единый start.prg с непосредственным определением таймера

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
_Screen.AddObject('Hronik','Timer2')
_Screen.Hronik.Interval= 5000 
Define Class Timer2 As Timer
Procedure Timer
	=Messagebox("Таймер сработал")
Endproc
Enddefine

On Shutdown quit
wait
Read Event

ВАРИАНТ Б: единый start.prg с процедурным запуском таймера

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Do Budilnik
On Shutdown quit
wait
Read Event

Procedure Budilnik
_Screen.AddObject('Hronik','Timer2')
_Screen.Hronik.Interval= 5000 
Define Class Timer2 As Timer
Procedure Timer
	=Messagebox("Таймер сработал")
Endproc
Enddefine

Return

ВАРИАНТ В: двухфайловый: start.prg + budilnik.prg

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
*          Текcт файла start.prg 
On Shutdown quit
Do Budilnik.prg
Wait
Read Event

*           Текcт файла Budilnik.prg
_Screen.AddObject('Hronik','Timer2')
_Screen.Hronik.Interval= 5000 
Define Class Timer2 As Timer
Procedure Timer
	=Messagebox("Таймер сработал")
Endproc
Enddefine

Return
ВАРИАНТ Г: двухфайлово- препроцессорный: start.prg + вставка budilnik.prg
Код: plaintext
1.
2.
3.
4.
5.
On Shutdown quit
#include  Budilnik.prg
Wait
Read Event

* текст budilnik.prg тот же, что ив варианте В
Попробуйте сделать exe-шник.
Как вы увидите, работать и компилироваться без ошибок будет только варианты В-Г.
Хочу знать: "Отчего так?"

Кстати, повторюсь: как этот объект Hronik безболезненно ампутировать, чтобы ФОкс не беспокоился по поводу класса Timer2?
...
Рейтинг: 0 / 0
Timer
    #33754405
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дополнение к AddObject() есть, как это ни странно, RemoveObject().
Загруженный для исполнения код блокируется от изменения на диске. Если необходимо его поменять - выгружаем код. Можно посмотреть в сторону CLEAR PROGRAM и CLEAR ALL
...
Рейтинг: 0 / 0
Timer
    #33754664
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же вам писал, что нельзя в исполняемую структуры вовлекать DEFINE CLASS.

Перенесите ВСЕ DEFINE CLASS ... в самый конец start.prg.
А вы его оставили в цикле обработки событий READ EVENTS!
DEFINE CLASS - это НЕ исполняемый код, а, по сути, шаблон, заготовка по которому будет создаваться объект по командам типа AddObject, NEWOBJECT и пр.!

С уважением, Алексей
...
Рейтинг: 0 / 0
Timer
    #33756348
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо. Теперь все работает. Даже RemoveObject стал беспрекословен. :)
Осталась самая малость. Мистер Любознайкин хочет узнать отчего тогда вариант Г с использованием препроцессора тоже успешно работал? Ведь определение класса Timer2 стояло-то в цикле READ EVENT? (правда, до этого я считал не считал это за цикл).
...
Рейтинг: 0 / 0
Timer
    #33766949
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi men dea!

Only the #DEFINE ... #UNDEF, #IF ... #ENDIF, and #INCLUDE preprocessor
directives are recognized in a header file. Comments and Visual FoxPro
commands included in a header file are ignored.

> отчего тогда вариант Г с использованием препроцессора тоже успешно работал

Ты где-то ошибся при тестировании - вариант Г не работает и не может
работать. Читай внимательнее хелп по #INCLUDE.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Timer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]