Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / DO FORM <> NAME <> LINKED ??? / 7 сообщений из 7, страница 1 из 1
16.12.2005, 13:09
    #33440591
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO FORM <> NAME <> LINKED ???
VFP80SP1.
Интересно получается: при вызове формы из ToolBar-а
не формируется явно объект формы в памяти
(невидно в Debugger-е этого объекта)
Код: plaintext
?TYPE("имя переменной") && выдает "U"
Хотя все четко работает.
А если вызвать форму из меню:
...
Код: plaintext
ON SELECTION BAR  2  OF Pop_edit DO FORM spr_li_sch
то объект сформирован и виден в Debugger-е.
Код: plaintext
?TYPE("имя переменной") && выдает "O"
Хочу по другому выразиться. То есть:
имеется ToolBar :
Код: plaintext
1.
2.
m.o_tb = CREATEOBJECT("main_tb")
o_tb.Dock( 0 )
o_tb.Visible = .T.
в нем были построены кнопки вызова форм,
по событию Click одной из кнопок вызывается форма:
Код: plaintext
DO FORM spr_li_sch
и в Debugger-е
Код: plaintext
?TYPE("spr_li_sch") && выдает "U"
но и оформлено меню:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
DEFINE PAD P_edit OF _MSYSMENU PROMPT "Редактировать" COLOR SCHEME  3  ;
  MESSAGE 'Редактировать'
ON PAD P_edit OF _MSYSMENU ACTIVATE POPUP Pop_edit
....
DEFINE POPUP Pop_edit MARGIN RELATIVE SHADOW COLOR SCHEME  4 
....
DEFINE BAR  2  OF Pop_edit PROMPT "Справочник лицевых счетов" ;
 PICTURE 'spr_li_sch.bmp' ;
 MESSAGE 'Справочник лицевых счетов'
ON SELECTION BAR  2  OF Pop_edit DO FORM spr_li_sch
и в Debugger-е
Код: plaintext
?TYPE("spr_li_sch") && выдает "O"
Получается, что если произошел вызов формы из ToolBar-а, то как бы объекта
в памяти невидно и следовательно я НЕМОГУ сформировать вызов типа:
Код: plaintext
spr_li_sch.ComandButton.Click()
из другой формы.
А если произошел вызов формы из меню, то объект в памяти виден
и я легко произвожу вызов:
Код: plaintext
spr_li_sch.ComandButton.Click()
из другой формы.
Если возмем Help по DO FORM, то можно задать и NAME VarName [LINKED]
Specifies a variable or array element with which you can
reference the form or form set. If you specify a variable
that doesn't exist, Microsoft Visual FoxPro automatically creates it.
If you specify an array element, the array must exist before you
issue DO FORM. If the variable or array element you specify already
exists, its contents are overwritten.
If you omit the NAME clause, Visual FoxPro creates an object type
variable with the same name as the form or form set file.
Include LINKED to link the form to the variable associated with
it so that the form is released when the variable goes out of scope.
If you don't include LINKED, a form can still be active, even though
there is no object variable associated with the form.

Я пробовал и это, но приходится в событии Click кнопки ToolBar-а прописывать
Код: plaintext
DO FORM spr_li_sch NAME spr_li_sch LINKED
а переменную spr_li_sch тогда уже опысывать в более верхней программе. А у меня это уже стартовая программа. Тогда закономерен вывод, что все формы, которые я формирую в кнопках ToolBar-а, надо прописать как переменные в стартовой программе. Что не совсем правильно на мой взгляд.
В старых версиях я не использовал ToolBar-ы и поэтому этого эффекта незамечал. Все четко проходило.
...
Рейтинг: 0 / 0
16.12.2005, 16:37
    #33441399
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO FORM <> NAME <> LINKED ???
Может я что-то плохо описал ситуацию???
Цель: Сформировать вызов метода Click() кнопки ComandButton формы spr_li_sch из другой формы
Код: plaintext
spr_li_sch.ComandButton.Click()
Этим я часто пользовался и все проходило нормально. Но заметил, что при выполнении команды
Код: plaintext
DO FORM spr_li_sch
в методе MyToolBar.ComandButton.Click(), объекта spr_li_sch в пямяти нет. Хотя форма открывается и все работает. Но обращения
Код: plaintext
spr_li_sch.ComandButton.Click()
не создать. т.к. объекта spr_li_sch нет.
Код: plaintext
?TYPE("spr_li_sch") && выдает "U"
Если вызывать форму через меню
Код: plaintext
ON SELECTION BAR  2  OF Pop_edit DO FORM spr_li_sch
то объект spr_li_sch в памяти имеет место быть. И обращение к методу
Код: plaintext
spr_li_sch.ComandButton.Click()
будет работать.
Код: plaintext
?TYPE("spr_li_sch") && выдает "O"
ПОЧЕМУ??? Чувствую, что я чего-то недопонимаю.
...
Рейтинг: 0 / 0
16.12.2005, 17:17
    #33441522
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO FORM <> NAME <> LINKED ???
А если так? (не пробовал)

_SCREEN.spr_li_sch.ComandButton.Click()

Если создаете application collection а в нее вставляте при вызове reference на вторую форму, то брать можно и оттуда...
...
Рейтинг: 0 / 0
16.12.2005, 23:23
    #33442091
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO FORM <> NAME <> LINKED ???
Вообще-то, удивление вызывает не тот факт, что при вызове из ToolBar не создается переменная памяти, а то, что при вызове из пункта меню эта переменная все-таки создается!

Проблема в следующем. Когда ты даешь команду

DO FORM MyForm.scx

то FoxPro, во-первых, создает объект-форму, а во вторых, создает переменную памяти, в которую записывает ссылку на этот созданный объект.

В таком синтаксисе, связь переменной и объекта - односторонняя. Т.е. уничтожение переменной не приведет к уничтожению формы.

Вся проблема в том, какая область видимости у этой созданной переменной.

По умолчанию, если область видимости переменной не указана явно, то она получает область видимости PRIVATE. Это значит, что такая переменная будет существовать до тех пор, пока не будет завершена процедура, в которой она создана.

Метод ToolBar отрабатывает "как положено". Убирая за собой весь тот "мусор", который был создан внутри. В том числе и переменную, содержащую ссылку на созданную форму.

А вот почему так "коряво" работает меню - не понятно. Теоретически, тоже не должно было остаться никаких переменных.

В любом случае, опираться на такие ссылки я бы не стал. Слишком это не надежно.

Получить ссылку на существующую форму можно через коллекции _SCREEN.Forms() или _VFP.Forms().

Если в приложении одна и та же форма не может быть запущена дважды (т.е. 2 копии одной формы одновременно), то ссылку на форму можно получить так:

Код: plaintext
1.
2.
3.
IF TYPE("_VFP.Forms('MyForm')")="U"  
	* Формы со свойством name = MyForm не существует (не открыта)  
ENDIF


Обратите внимание, что здесь используется системная переменная _VFP. Использовать аналогичный синтаксис с системной переменной _SCREEN - не получиться. Коллекция _SCREEN.Forms() не принимает в качестве параметра символьные значения. Только числовые.

Соответственно, обращение к ее методам:

Код: plaintext
_VFP.Forms('MyForm').ComandButton.Click()

Если же одна и та же форма может быть запущена несколько раз, то придется сканировать всю коллекцию и проверять какой-либо уникальный признак, который позволит отличить один экземпляр формы от другого.
...
Рейтинг: 0 / 0
17.12.2005, 04:06
    #33442164
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO FORM <> NAME <> LINKED ???
Hi Владимир!

> ПОЧЕМУ??? Чувствую, что я чего-то недопонимаю.

Да, ты не допонимаешь понятие области видимости переменных. Автоматически
создаваемые переменные имеют область видимости Private - и если запускать из
кнопки тулбара, то по завершении метода click переменная выйдёт за свою
область видимости и уничтожится.

P.S. Вообще в 99% случаев не требуется создания подобной переменной-ссылки,
т.к. ссылаться на формы лучше другими способами - и уж совсем никуда не
годится подход с автоматически создаваемой переменной-ссылкой.
Банальная ситуация - ты 2 раза запустил одну форму - как думаешь ссылка на
какую из них будет хранится в подобной переменной :) И как добраться до
второй формы. А если потом одну из форм закрыть то что случится с переменной
:)

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
17.12.2005, 06:40
    #33442175
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO FORM <> NAME <> LINKED ???
Меню создано в стартовом файле.
1 случай. При начальном вызове формы из меню создались и объект и переменная, в которую записывается ссылка на этот созданный объект. Но переменная имеет область видимости Private и поэтому я ее вижу из вызванной другой формы. Добраться до объекта можно через ссылку spr_li_sch. При закрытии формы, объект уничтожился, но переменная неуничтожена в моем случает, т.к. меню создано в стартовом файле, и переменная создалась в этом же файле и эта переменная уничтожится только тогда, когда закроется приложение (переменная spr_li_sch имеет значение .NULL.). И теперь (что для меня удивительно) если я вызову форму из ToolBar-а (DO FORM spr_li_sch), то т.к. имеет место переменная spr_li_sch, она активизируется ссылкой на объект формы и так же можно добраться до объекта через ссылку spr_li_sch.
2 случай. При начальном вызове формы из ToolBar-а (DO FORM spr_li_sch), то объект конечно создается, а переменная действительно имеет область видимости другую (вот где моя ошибка), и при закрытии формы уничтожается не только объект но и та переменная внутри метода кнопки объекта ToolBar-а. И добраться до объекта можно только через _VFP.Forms().
Так что в любом случае через _VFP.Forms() будет правильнее.
Большое спасибо Вам всем, в особенности Владимиру Максимову классно объясняете. Еще раз спасибо.
Кстати _SCREEN.Forms() у меня неотработал.
P.S.
Igor Korolyov:
...2 раза запустил одну форму... - я этого недопускаю проверками. Как раз в данном моем случае в методе LOAD формы spr_li_sch:
Код: plaintext
1.
2.
3.
SET SKIP OF BAR  2  OF Pop_edit .T.
IF TYPE('o_tb') = 'O'
  o_tb.Cmd_spr_li_schet.Enabled = .F.
ENDIF
т.е. отключаю и меню и выключаю кнопку на ToolBar-е.
А в методе UNLOAD соответственно:
Код: plaintext
1.
2.
3.
SET SKIP OF BAR  2  OF Pop_edit .F.
IF TYPE('o_tb') = 'O'
  o_tb.Cmd_spr_li_schet.Enabled = .T.
ENDIF
а здесь наоборот все включаю.
...
Рейтинг: 0 / 0
19.12.2005, 00:37
    #33443210
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DO FORM <> NAME <> LINKED ???
Hi Владимир!

> Вообще-то, удивление вызывает не тот факт, что при вызове из ToolBar не
> создается переменная памяти, а то, что при вызове из пункта меню эта
> переменная все-таки создается!

ON SELECTION BAR работает в каком-то "своём" контексте - видимо в контексте
текущего метода (т.е того который находится в стеке вызовов непосредственно
"под" этой ON), хотя в отладчике этот ON и виден отдельным элементом в
стеке.
В частности в конструкциях с контекстным меню, он видит LOCAL переменные
объявленные в модуле где находится ACTIVATE POPUP.
Подчёркиваю - речь идёт про СОБСТВЕННО команду стоящую в ON SELECTION BAR -
а вовсе не про процедуру, которую такая команда может вызывать :)
Не знаю как оно будет (или НЕ будет) работать для подменю привязанного к
главному меню - вроде бы работает так как описано выше - т.е. в зависимости
от того где мы "висим" в момент выбора из меню - на READ EVENTS или на
SomeModalForm.Show() тот "контекст" и будет использован - но IMHO не стоит
на это особо полагаться...

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


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