Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / include file / 5 сообщений из 5, страница 1 из 1
12.03.2004, 08:23
    #32439071
Shurick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include file
Создаю класс myform на основе form цепляю к нему file1.h (в котором описаны некоторые константы). На основе класса myform создаю форму, запускаю, констант она в упор не видит. Если этот файл (file1.h) цеплять на форму (а не на класс) все в порядке все константы прекрасно видны. Внимание вопрос. В чем причина неработоспособности первого варианта?

з.ы. VFP8SP1
...
Рейтинг: 0 / 0
12.03.2004, 09:44
    #32439174
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include file
Дело в том, что все команды типа #DEFINE ... это директивы компиляции . Т.е. они выполняются не в Run-Time (во время исполнения программы), а во время компиляции исполняемого кода из исходного текста программы.

Т.е. представь как работает компилятор FoxPro:

-) Ты создал класс. Физически, это некоторый файл VCX (VCT) или PRG (если ручками создавал). Заметь, ты прицепил свой файл File1.h именно к этому файлу VCX (или к какой-то его области, если вставка НЕ через пункт меню Class - Include)

-) Если ты создаешь форму на базе данного класса, то это уже другой файл. И естесственно, он ничего не знает ни о каких командах #DEFINE другого файла, поскольку каждый файл в FoxPro компилируется отдельно, сам по себе.

Ну действительно, ты же не видишь содержание кодов методов и событий родительского класса. А директивы #DEFINE - это именно содержание, а не свойство класса.

Использование INCLUDE-файлов в FoxPro - это очень неудобная работа. Если есть возможность, то лучше обходится без них или явно писать команды #DEFINE в коде.
...
Рейтинг: 0 / 0
12.03.2004, 10:35
    #32439277
Shurick
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include file
Огромное спасибо за ответ. Но у меня возникает вопрос где именно описывать дерективы #DEFINE, что бы константы были видимы во все форме?
...
Рейтинг: 0 / 0
12.03.2004, 10:48
    #32439312
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include file
Для начала: А они тебе действительно нужны? Может лучше использовать Property класса (формы)?

Область действия #DEFINE внутри формы (класса) предсказать сложно. Если они действительно нужны, то придется оставить INCLUDE и втыкать его во ВСЕ формы и классы.

Процесс "втыкания" можно автоматизировать, но лучше это делать вручную. Дело в том, что отсутствие INCLUDE выяснится только в Run-Time, а компиляция пройдет без ошибок. Т.е. про него можно случайно забыть.

Альтернативой может служить набор глобальных переменных (или свойств глобального объекта goApp), значение которых присваивается через #INCLUDE в стартовой проге.
...
Рейтинг: 0 / 0
12.03.2004, 11:49
    #32439511
NNN
NNN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
include file
Немного не по теме, но все таки..
А откуда собственно отношение к дерективам предкомпиляции исключительно как к константам? Это проще рассматривать как "вставку" в исходный текст кода.
Например,
Код: plaintext
1.
#define SOMESTRING  "Некоторая строка" 
lcString=SOMESTRING

и
Код: plaintext
lcString= "Некоторая строка" 

после компиляции будут совершенно идентичны. Кто не верит - refox в руки.

ИМХО все эти директивы - довольно удобная штука и их можно испоользовать не только для констант. Например, вот такой код прекрасно работает во всех версиях vfp:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#define ADDBSFUNC  addbs
#define NVERSION   val(substr(version(), 15 ))
#define MAX_PATH    260 

DECLARE integer GetSystemDirectory IN WIN32API string @, integer
lcBuffer=SPACE(MAX_PATH)
lnBuffer=MAX_PATH
lnLen=GetSystemDirectory(@lcBuffer, lnBuffer)
CLEAR DLLS 
lcBuffer=LEFT(lcBuffer,lnLen)
lcBuffer=ADDBSFUNC(lcBuffer)
=MESSAGEBOX(lcBuffer)

#IF NVERSION<= 5 
FUNCTION addbs
LPARAMETERS cString
IF RIGHT(cString, 1 )#'\'
	cString=cString+'\'
ENDIF 
RETURN cString
#ENDIF
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / include file / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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