Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запуск программы не из того модуля.. / 10 сообщений из 10, страница 1 из 1
08.10.2012, 07:21
    #37987427
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
Имеем модули , например: PRIMER.PRG
** тело
** че то делаем и вызываем всегда Whener(), Valider(), Okeynik() полагая, что запустятся модули которые находятся в этом PRG файлике ниже.
**
Даже можем запускаем модуль похожий
DO PRIMERnext.PRG - в нем есть свои Whener,Valider,Okeynik
RETURN

В этом же PRG файле ниже свой набор подпрограмм, которые должны исполниться.
--------------------------------
Function Whener
***тело
Return

Function Valider
***тело
return

Function Okeynik
***тело
return

------------------------------------
Редко но все таки, Okeynik,Valider,Whener выполняются не из своего PRG файла, где они находятся, а из файла расположенного выше по вызову. Простой перезапуск программы проблему убирает. Куда копать?
------------------------------------
...
Рейтинг: 0 / 0
08.10.2012, 07:36
    #37987430
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
Ни разу не пробовал использовать одноименные функции, могу только предположить что где-то происходит:
Код: sql
1.
set proc to PRIMER.PRG



Для такого подхода придуманы классы, включив свои функции в класс ты убираешь эту неопределенность, т.к. они становятся одноименными методами разных классов.
...
Рейтинг: 0 / 0
08.10.2012, 07:43
    #37987435
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
MaestroEv,
from helpЕсли выдать команду DO с именем функции, Visual FoxPro ищет заданную функцию по следующей схеме:

1. Visual FoxPro просматривает файл, содержащий данную команду DO.
2. Если в этом файле функция не найдена, Visual FoxPro просматривает открытый файл процедуры. Файлы процедуры открываются по команде SET PROCEDURE.
3. Если в текущем файле процедуры функции нет, Visual FoxPro просматривает все программы в цепочке выполняемых файлов программ. Цепочка просматривается с последней выполнявшейся программы до первой выполнявшейся программы.
4. Если функция и здесь не найдена, Visual FoxPro ищет ее среди автономных программ. Если соответствующий файл программы найден, эта программа выполняется. В противном случае Visual FoxPro генерирует сообщение об ошибке.

Чтобы выполнить функцию из конкретного файла, используйте предложение IN в команде DO.
...
Рейтинг: 0 / 0
08.10.2012, 07:46
    #37987438
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
Вот, понял как правильно спросить! Это одноименные функции находящиеся в разных PRG!
Они ж должны запускаться первыми, вместо таких же функций но находящимися в другом PRG!

Спасибо.
SET PROC нету.
...
Рейтинг: 0 / 0
08.10.2012, 07:56
    #37987446
asdor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
MaestroEv,

Вы пытаетесь применить полиморфизм, без ООП.)))
У вас явно правильное направление мысли, разбиритесь всего лишь с классами.
Создайте, вместо вашего PRIMER.PRG класс например на базе custom, имеющий 3 ваших метода.
Whener(), Valider(), Okeynik()
А дальше, вместо множества прг, просто делайте наследников этого класса.
...
Рейтинг: 0 / 0
08.10.2012, 07:58
    #37987447
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
Jonny540,

1. Visual FoxPro просматривает файл, содержащий данную команду DO.
2. Если в этом файле функция не найдена, а почему после перезапуска программы найдена?
в SET PROCEDURE таких точно у меня нет.
3. Если в текущем файле процедуры функции нет, Visual FoxPro просматривает все программы в цепочке выполняемых файлов программ. Цепочка просматривается с последней выполнявшейся программы до первой выполнявшейся программы.
Функция есть! И после перезапуска программы она ее находит. Ощущение, как будто как-то теряет, и естественно подхватывает предыдущую - тут все верно.

Чтобы выполнить функцию из конкретного файла, используйте предложение IN в команде DO. Это понятно, но в лоб запускать их не могу. Эти програмульки работают фОном, и надо чтобы именно в текущем PRG поднимались свои фоновые програмки.

Набор таких программулек много шире, каждая форма запущеная из PRG работает с ними, то есть я вынес всю обработку кнопок и видимости их и активности и взаимодействия в такие PRG модули "под ноги".
Это избавило меня от брождения по окошкам для их изменений и настроек в формах.
Форма - просто картинка - вся математика снаружи. Легко читать, исправлять. Тока вот иногда очень редко правда но все же гложит....
...
Рейтинг: 0 / 0
08.10.2012, 07:59
    #37987449
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
asdor,

Поздно, 1002 модуля.. :) Это космический корабль. :)
...
Рейтинг: 0 / 0
08.10.2012, 08:04
    #37987452
asdor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
MaestroEvasdor,

Поздно, 1002 модуля.. :) Это космический корабль. :)
Как раз самое время, проводить рефакторинг)
Конечно, если это не последний день работы над ПО, после чего вы уезжаете в Антарктиду))))

И полагаю, такое кол-во одинаковых модулей....
После рефакторинга, вам будет существенно легче дышать.
...
Рейтинг: 0 / 0
08.10.2012, 08:18
    #37987455
MaestroEv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
Не уверен. И что будет делать класс с такими функциями? Они ж все разные внутри! Поля разные, правила разные.

Что-то можно усовершенствовать еще?

На форму кидаете кнопку - кнопка перед появленим на форме выполняет OkNik() из этого же PRG и активируется если ей можно и активирует нижнюю строку сохранить отказаться или еще чего там,
при нажатии выполняет модуль PUSHER() - он по названию поля определяет что в поле и распахивает список - вы выбераете запускается модуль Whener() и если значение там все как надо заполняется поле, а затем выполняется функция Valider()
и Oknik() для проверки активновсти кнопки на форме.

Тела всех этих мелкофункций разные. Общее в них название и параметры. Есть еще AfterSaveForm(), BefoSaveform() и пр..
СloseForm() и др.
И есть модуль который в новый модуль PRG сразу валит все это по текущей таблице и предзаполняет, есть правило наименования полей.

Как то так.. Это чтобы понятно было почему у них всех одинаковые имена.
...
Рейтинг: 0 / 0
08.10.2012, 10:12
    #37987573
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск программы не из того модуля..
MaestroEvНе уверен. И что будет делать класс с такими функциями? Они ж все разные внутри!
Класс будет ЯВНО указывать форме откуда код брать. Сейчас у тебя это происходит неявно, глючит и ты найти не можешь откуда проблема идет. Вполне возможно что глючит фокс из-за большого количества одноименных функций (это предположение).

Задуматься над переделкой стоит. Результат полезный будет. Неужели все 1000 одноименных функций настолько разные что ничего общего в них нет и невозможно написать код одновременно походящий для нескольких? Не верю (с) :)

Понятно что с таким объемом это не быстро и не просто. А сейчас чтобы хоть как-то проблему локализовать и понять это глюк программы или фокса - сделай сохранение стека вызова при ошибке с помощью ASTACKINFO(). Тогда увидишь что в какой последовательности было вызвано.
Примерно так
Код: sql
1.
2.
3.
4.
5.
lcStek = ''
for i = 1 to ASTACKINFO(laStek)
	lcStek = lcStek + '->' + laStek[i, 3] + '(' + laStek[i, 4] + ')' + iif(laStek[i, 5] = 0, '()', '(' + astr(laStek[i, 5]) + ')')
endfor
lcStek = substr(lcStek, 3)



PS твой подход хорошо подходит для процедурного программирования. Я в FPD так же делал. Но там всегда понятно было на которой строке кода идет выполнение программы, в VFP все происходит по событию и тут такой подход уместен если все формы модальные, да и то модальность искуственна и бывают ситуации когда она нарушается.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запуск программы не из того модуля.. / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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