:: Visual Foxpro, Foxpro for DOS
Re: Как передать массив в SCX-файл?
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Представь, что тебе в программе нужно вызывать некую функцию/процедуру, которой не будет в этом EXE (например, будет создаваться на лету или будет находиться во внешнем (процедурном или непроцедурном) файле).

() Если внешний файл с процедурами, то его можно "подключать" налету, перед:
SET PROCEDURE TO (имя_процедурного_файла) ADDITIVE

и "отключить" (на всякий случай) после использования:
RELEASE PROCEDURE (имя_процедурного_файла)
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
sphinx
Автор

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Нет, Олег, ты не понял. При SET PROCEDURE процедурный файл закомпилится в проект, а Сергей (akvvohinc) пишет о том, что получится вызвать из готового EXE другой, внешний файл.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
Если внешний файл с процедурами, то его можно "подключать" налету, перед:
SET PROCEDURE TO (имя_процедурного_файла) ADDITIVE
К тому же в FPD не было возможности этого ADDITIVE (опция отсутствовала) - нормально можно было подцепить лишь один процедурный файл одновременно.
Для обхода этого ограничения мы применяли другую "хитрость". Я уже как-то ее здесь описывал.
Не думаю, что сейчас это актуально, но если кому интересно, то могу повторить.
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
И что за хитрость?
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
sphinx
Нет, Олег, ты не понял. При SET PROCEDURE процедурный файл закомпилится в проект, а Сергей (akvvohinc) пишет о том, что получится вызвать из готового EXE другой, внешний файл.

> При SET PROCEDURE процедурный файл закомпилится в проект - это не так. Имя процедурного PRG/FXP вообще может быть неизвестно проекту, и вобще может быть только в фантазиях разраба, создаваться "динамически"...

> Олег, ты не понял
Нет, я понял. Просто процедурный файл не компилится как проект, а просто компилится PRG->FXP. В таком слабом "компилении" можно применять в коде неизвестные имена и процедуры...
Ratings: 0 negative/1 positive
Re: Как передать массив в SCX-файл?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
Просто процедурный файл не компилится как проект, а просто компилится PRG->FXP.

Если компилятор при создании EXE не будет "видеть" процедурный файл, то это и есть ситуация, которую я описывал.
Но тогда мне непонятно, с какой целью ты вообще упомянул о SET PROCEDURE?
of63
Если внешний файл с процедурами, то его можно "подключать" налету, перед:
SET PROCEDURE TO (имя_процедурного_файла) ADDITIVE
Проблема же не в том, как и когда подключать процедурный файл, а в том, что при создании EXE без процедурного файла компилятор выдаст тебе кучу сообщений Unable to find Unknown ... так как будет искать вызываемые процедуры, находящиеся в процедурном файле и не найдет их.

of63
В таком слабом "компилении" можно применять в коде неизвестные имена и процедуры...
Применять можно.
Но придется нажимать кнопку Ignore All при каждой сборке EXE.

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



Исправлено 2 раз(а). Последнее : akvvohinc, 07.12.20 06:14
Ratings: 0 negative/1 positive
Re: Как передать массив в SCX-файл?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Simple777
И что за хитрость?
Сейчас уже поздно (или рано? ), пора баиньки - завтра днем расскажу.



Исправлено 1 раз(а). Последнее : akvvohinc, 07.12.20 06:18
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
akvvohinc, это лирическое отступление, навеяло темой. Виноват.
Саша начинал ветку про реальный массив внутри одного проекта в разных модулях, меня повело на отсутствующие элементы внутри проекта вообще, что их можно определить в специальном PRG и подключить SET PROC ADDI...
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
akvvohinc
Но Саша и создал эту тему как раз для того, чтобы избавиться от выскакивающих сообщений, хотя тоже мог их просто игнорировать.

Кстати, совершенно верно про: "чтобы просто не выскакивало" при компиляции.
Сейчас вот припомнился один давнишний проект на FPD2.6, который, когда компилировал, выскакивало сообщение об отсутствии массива. Но я знал, что он создается там "из воздуха" еще до этой процедуры, просто жал "игнорировать", и оно нормально компилировалось и потом без проблем работало.
Хотя по идее вот такая вставка указания на "внешность массива" конечно убирала бы такие предупреждения.
Но раз уж оно работало, стало быть предупреждение было не критическим, т.е. не "фатальной ошибкой", а как бы просто "на всякий случай".


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 07.12.20 10:36
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Crispy
Хотя по идее вот такая вставка указания на "внешность массива" конечно убирала бы такие предупреждения.

Меня удивляло, что разработчики не дали возможности отключить данное предупреждение по желанию какой-нибудь настройкой.

И вообще я не понимаю, почему они так озаботились именно массивами - можно подумать, что с возможным отсутствием скалярной внешней переменной проблем в рантайме не будет.
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Simple777
И что за хитрость?

Она подсмотрена, если память не подводит, в каком-то журнале FoxTalk.

Принцип прост - он основан на "зацикливании" вызовов программ, которые в результате не завершаются, а остаются в памяти на все время выполнения головной программы, а поэтому все содержащиеся в них процедуры/функции доступны из любого места:
1) Головная программа вызывает первый процедурный файл и через параметры передает ему имена остальных процедурных файлов, требующих подключения.
2) Каждый вызванный процедурный файл проверяет параметры:
- если параметров нет, то он является последним подключаемым файлом в цепи и должен вызвать определенную процедуру головного файла - цепь замкнется.
- если параметры есть, то он вызывает процедурный файл, имя которого содержится в первом параметре, передавая ему остальные параметры.

Структура головного файла (main.prg):
PROCEDURE main
начальные команды
* подключение процедурных файлов
DO procfile1 WITH 'procfile2,procfile3'
PROCEDURE main1
продолжение команд
Структура любого процедурного файла (procfile.prg):

PROCEDURE procfile
PARAMETERS procfile_list
IF EMPTY(procfile_list)
DO main1
ELSE
nextprocfile = <получаем имя следующего процедурного файла из procfile_list>
procfile_list = <убираем имя следующего процедурного файла из procfile_list>
* вызываем следующий процедурный файл, передавая ему имена оставшихся, требующих подключения
* перед каждым таким вызовом procfile_list сокращается на 1 процедурный файл
DO (nextprocfile) WITH procfile_list
ENDIF
* далее идут его процедуры/функции
PROCEDURE proc1
...
PROCEDURE proc2
...

Получилась такая цепочка вызовов:
main
procfile1
procfile2
procfile3
main1 (процедура в main)
И пока main1 не завершится, все программные файлы, расположенные выше в стеке вызовов, тоже не завершатся (будут оставаться в памяти) и их процедурами можно свободно пользоваться.

При этом SET PROCEDURE осталась без дела и ей можно пользоваться в обычном режиме.



Исправлено 8 раз(а). Последнее : akvvohinc, 07.12.20 17:24
Ratings: 0 negative/1 positive
Re: Как передать массив в SCX-файл?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
ХитрО! [sm128]
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
А какова максимально допустимая глубина вложенности вызовов в FPD была? Не будет ли "лекарство" хуже болезни Пожрав половину возможного колл-стэка


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
В FPD было 32, так что количество файлов, прицепленных таким путем, безграничным не назовешь.
У нас их было 3 - жить не мешало. А кому-то могло и не подойти.
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
sphinx
Я просто уперся на EXTERNAL ARRAY и вкуда его грамотно прописать.
В FPD-редакторе экранной формы в разделе SETUP пишем:
#SECTION 1
* это самое начало SPR-файла
external array aMyArray
parameters p1,p2
* прочий наш init-код
*** сюда генератор воткнёт "define window"
#SECTION 2
* сюда можно прописать код, который вставится после "define window", но перед "activate window" и GET-ами
Можно, конечно, где-то в SPR воткнуть dimension, компилятор ругаться не будет, но это ж костыль.


akvvohinc
На самом деле я в свое время использовал EXTERNAL ARRAY еще одним способом (можно назвать это Undocumented feature ).
Представь, что тебе в программе нужно вызывать некую функцию/процедуру, которой не будет в этом EXE (например, будет создаваться на лету или будет находиться во внешнем (процедурном или непроцедурном) файле).
akvvohinc
ту же проблему можно решить иначе - создав где-то, например, в головном файле процедуру-пустышку с именем proc1. Компилятор ее увидит и ругаться не будет, а при работе EXE вызываться будет не она, а реальная процедура из процедурного файла согласно приоритету вызовов.
Я этот вопрос и в FPD и в VFP решил, по-моему, ещё лучше. Создал Unknowns.prg, в котором перечислены все «внешние» процедуры:
func OrgName
func LibVersion
func DbDir
Эту Unknowns.prg добавил в проект и сделал Exclude. Вполне себе штатное решение вопроса.


of63
SET PROCEDURE TO (имя_процедурного_файла) ADDITIVE
Опции additive в FPD нет, к сожалению.

akvvohinc
Принцип прост - он основан на "зацикливании" вызовов программ, которые в результате не завершаются, а остаются в памяти на все время выполнения головной программы, а поэтому все содержащиеся в них процедуры/функции доступны из любого места
Оно работает, но нужно помнить, что в FPD лишь 32 уровня вложенности вызовов, потом "Do nesting too deep". А при такой технологии каждый процедурный файл отнимает один уровень и в конце ещё один для "do main1".

akvvohinc
У нас их было 3 - жить не мешало. А кому-то могло и не подойти
Ну да, и я о том же.
Я решил этот вопрос так. У меня каждый процедурный файл – это не исполняемая PRG-шка, а типа библиотека процедур на одну тему. Головной файл проекта - меню, то есть MPR-файл. У него в Cleanup-коде вставил директивы "#Insert procs1.prg", "#Insert procs2.prg"… Таким образом, генератор меню по итогу создаёт здоровенный MPR-файл, который содержит все процедуры из всех procs*.prg. А поскольку он запускается первым, то все эти процедуры видны везде без SET PROCEDURE.
Все эти procs*.prg включены в проект, поэтому проверяются при сборке. Но сделаны Exclude – чтоб код в APP не задваивался.
При этом в программе остаётся возможность при работе подключить SET PROCEDURE <АвтоСобираемая.prg>
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
А ведь всего проблем-то - перенести все эти "DOC-изобретения" из .prg в Custom-классы, которые для этого и предназначены.
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
lulgu
перенести все эти "DOC-изобретения" из .prg в Custom-классы
Речь идёт про FPD.
Ratings: 0 negative/0 positive
Re: Как передать массив в SCX-файл?
Божья_коровка

Сообщений: 25731
Дата регистрации: 23.08.2001
От модератора:

Весь флуд был перенесен в Курилку. Для желающих, вот ссылка на тему - forum.foxclub.ru


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 18 (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика