Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Исчезновение глобальной переменной при передаче ее как параметра в другую форму / 15 сообщений из 15, страница 1 из 1
09.10.2013, 12:10
    #38421332
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
В форме formА в методе formА.init создаем глобалную переменную gcValue . Добавляем на форму formА кнопку commandA с вызовом другой формы formB , где в качестве параметра подаем глобальную переменную gcValue , например,
Код: sql
1.
do form formB with gcValue

.
После этой команды глобальная переменная исчезает, и на команду
Код: sql
1.
vartype(gcValue)

выдается значение 'U' как в вызываемой форме, так и в вызывающей(например в коде кнопки command1 после команды запуска 2-й формы). Но, если код кнопки изменить:
Код: sql
1.
2.
store gcValue to lcValue
do form formb with lcValue


то глобальная переменная останеться. Может кто нибудь объяснить что происходит с глобальной переменной при переаче ее как параметра в другую форму ?
...
Рейтинг: 0 / 0
09.10.2013, 12:21
    #38421349
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
faustgreenВ форме formА в методе formА.init создаем глобалную переменную gcValue . Добавляем на форму formА кнопку commandA с вызовом другой формы formB , где в качестве параметра подаем глобальную переменную gcValue , например,
Код: sql
1.
do form formB with gcValue

.
После этой команды глобальная переменная исчезает, и на команду
Код: sql
1.
vartype(gcValue)

выдается значение 'U' как в вызываемой форме, так и в вызывающей(например в коде кнопки command1 после команды запуска 2-й формы). Но, если код кнопки изменить:
Код: sql
1.
2.
store gcValue to lcValue
do form formb with lcValue


то глобальная переменная останеться. Может кто нибудь объяснить что происходит с глобальной переменной при переаче ее как параметра в другую форму ?

1. Как создаётся глобальная переменная, пример кода в студию.

2. Почитай Почему созданный массив или переменную не "видно" в других методах формы
...
Рейтинг: 0 / 0
09.10.2013, 12:27
    #38421356
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
Код: sql
1.
public gcValue
...
Рейтинг: 0 / 0
09.10.2013, 12:28
    #38421358
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
faustgreen, странно, у меня никуда паблик не исчезает.
...
Рейтинг: 0 / 0
09.10.2013, 12:37
    #38421372
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
ищи где переменная удаляется
Код: sql
1.
release gcValue
...
Рейтинг: 0 / 0
09.10.2013, 12:44
    #38421395
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
Код кнопки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
MESSAGEBOX(gn_ParamSprav)

* Если есть запись для редактирования
IF gn_SimpleSpravId != 0
	ln_SimpleSpravId = gn_SimpleSpravId
	*ln_ParamSprav = gn_ParamSprav
	DO FORM frmSingleValue WITH .F., ln_SimpleSpravId, gn_ParamSprav
	MESSAGEBOX(gn_ParamSprav)  && Тут уже выдает ошибку - переменна не существует.
ENDIF	



Метод init вызываемой формы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
LPARAMETERS tlNewZap, tnIdZap, tnParam

MESSAGEBOX(gn_ParamSprav) && Переменная не существует.

* Параметры:
* tlNewZap - Режим запуска формы (.T. - Создание новой записи, .F. - редактирование записи).
* tnIdZap - номер редактируемой записи.
* tnParam - id записи в таблице psimplesprav, для которой производится добавление или редактирование записи.
PUBLIC glNewZap, gnIdZap, gcOldValue
.........



Между кодом кнопки первой формы и кодом инита 2-й формы кода нет(например в методе, load), т.е. debuger с команды
Код: sql
1.
DO FORM frmSingleValue WITH .F., ln_SimpleSpravId, gn_ParamSprav

сразу попадает в инит 2-й формы и там не находит глобальной переменной.
...
Рейтинг: 0 / 0
09.10.2013, 12:49
    #38421407
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
Если в коде кнопки раскоментировать строку
Код: sql
1.
*ln_ParamSprav = gn_ParamSprav

и в качестве параметра подавать ln_ParamSprav, то все ок, глобальная переменная остаеться.
...
Рейтинг: 0 / 0
09.10.2013, 12:52
    #38421419
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
Может быть дело в каких то настройках SET... ?
...
Рейтинг: 0 / 0
09.10.2013, 12:57
    #38421433
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
faustgreen, А что показывет DISPLAY MEMORY LIKE gcValue TO FILE DISPLMEM.txt ???
Я подозреваю, что будет что-то вроде атрибута HIDDEN для gcValue
...
Рейтинг: 0 / 0
09.10.2013, 13:03
    #38421448
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
faustgreenКод кнопки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
MESSAGEBOX(gn_ParamSprav)

* Если есть запись для редактирования
IF gn_SimpleSpravId != 0
	ln_SimpleSpravId = gn_SimpleSpravId
	*ln_ParamSprav = gn_ParamSprav
	DO FORM frmSingleValue WITH .F., ln_SimpleSpravId, gn_ParamSprav
	MESSAGEBOX(gn_ParamSprav)  && Тут уже выдает ошибку - переменна не существует.
ENDIF	



Метод init вызываемой формы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
LPARAMETERS tlNewZap, tnIdZap, tnParam

MESSAGEBOX(gn_ParamSprav) && Переменная не существует.

* Параметры:
* tlNewZap - Режим запуска формы (.T. - Создание новой записи, .F. - редактирование записи).
* tnIdZap - номер редактируемой записи.
* tnParam - id записи в таблице psimplesprav, для которой производится добавление или редактирование записи.
PUBLIC glNewZap, gnIdZap, gcOldValue
.........



Между кодом кнопки первой формы и кодом инита 2-й формы кода нет(например в методе, load), т.е. debuger с команды
Код: sql
1.
DO FORM frmSingleValue WITH .F., ln_SimpleSpravId, gn_ParamSprav

сразу попадает в инит 2-й формы и там не находит глобальной переменной.

Ещё раз.

Где определение gn_ParamSprav как глобальной переменной?

И прочти приведённую ссылку.
...
Рейтинг: 0 / 0
09.10.2013, 13:04
    #38421452
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
faustgreen, мои подозрения оправдались. Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CLEAR
PUBLIC gcValue
DO Sub WITH m.gcValue

PROCEDURE Sub
LPARAMETERS m.tcPar01
DISPLAY MEMORY LIKE gcValue
? TYPE ('m.gcValue')

дал результат
GCVALUE (hid) L .F.
U
...
Рейтинг: 0 / 0
09.10.2013, 13:11
    #38421465
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
faustgreen, в общем, если приспичило передавать глобальную переменную через параметры и не терять её из виду в подпрограмме, передавай ею не по ссылке, а по значению как DO Sub WITH (m.gcValue) или DO Sub WITH m.gcValue+''.

Но лучше избегать таких излишеств.
...
Рейтинг: 0 / 0
09.10.2013, 14:07
    #38421543
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
Rostislav D. Kudryashov, спасибо.

ps. Два небольших вопроса:

1).Зачем указывать префикс m. ? (Я так понимаю, это явное указание на то, что эта переменная памяти и foxpro не будет сначала искать, например, поля в таблице с таким именем, а сразу среди переменных). В чем выигрыш записи m.lcValue по сравнению с lcValue.

2). Что означает запись
Код: sql
1.
DO Sub WITH m.gcValue+''

? Раньше не сталкивался с таким вариантом записи этой команды (+'').
...
Рейтинг: 0 / 0
09.10.2013, 14:27
    #38421577
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
faustgreenМожет быть дело в каких то настройках SET... ?

Дело в правилах хорошего тона при программировании.
Глобальную переменную нет необходимости передавать как параметр, ее и так везде видно.
Предпочтительно глобальные переменные создавать в начале программы и при необходимости уничтожать при закрытии.
В формах также нет необходимости их создания, т.к. там можно создавать свойства.
...
Рейтинг: 0 / 0
09.10.2013, 16:14
    #38421781
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исчезновение глобальной переменной при передаче ее как параметра в другую форму
faustgreen, 1) префикс "m." указывают из чувства самосохранения - для однозначности. В противном случае, если где-то окажется активная область с таблицей, в которой есть одноименное поле, в выражении будет использовано это поле.
2) Передать переменную по значению можно, включив её в выражение. Чтоб не менять её значение, прибавим к ней пустое значение символьного типа, т.к. венгерская запись gcValue мнемонически указывает на глобальную переменную символьного типа.
На мой вкус, более выразительная версия венгерской нотации с суффиксами - m.Value_gc.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Исчезновение глобальной переменной при передаче ее как параметра в другую форму / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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