|
|
|
DO FORM <> NAME <> LINKED ???
|
|||
|---|---|---|---|
|
#18+
VFP80SP1. Интересно получается: при вызове формы из ToolBar-а не формируется явно объект формы в памяти (невидно в Debugger-е этого объекта) Код: plaintext А если вызвать форму из меню: ... Код: plaintext Код: plaintext имеется ToolBar : Код: plaintext 1. 2. по событию Click одной из кнопок вызывается форма: Код: plaintext Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext в памяти невидно и следовательно я НЕМОГУ сформировать вызов типа: Код: plaintext А если произошел вызов формы из меню, то объект в памяти виден и я легко произвожу вызов: Код: plaintext Если возмем 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 В старых версиях я не использовал ToolBar-ы и поэтому этого эффекта незамечал. Все четко проходило. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 13:09 |
|
||
|
DO FORM <> NAME <> LINKED ???
|
|||
|---|---|---|---|
|
#18+
Может я что-то плохо описал ситуацию??? Цель: Сформировать вызов метода Click() кнопки ComandButton формы spr_li_sch из другой формы Код: plaintext Код: plaintext Код: plaintext Код: plaintext Код: plaintext Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 16:37 |
|
||
|
DO FORM <> NAME <> LINKED ???
|
|||
|---|---|---|---|
|
#18+
А если так? (не пробовал) _SCREEN.spr_li_sch.ComandButton.Click() Если создаете application collection а в нее вставляте при вызове reference на вторую форму, то брать можно и оттуда... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 17:17 |
|
||
|
DO FORM <> NAME <> LINKED ???
|
|||
|---|---|---|---|
|
#18+
Вообще-то, удивление вызывает не тот факт, что при вызове из ToolBar не создается переменная памяти, а то, что при вызове из пункта меню эта переменная все-таки создается! Проблема в следующем. Когда ты даешь команду DO FORM MyForm.scx то FoxPro, во-первых, создает объект-форму, а во вторых, создает переменную памяти, в которую записывает ссылку на этот созданный объект. В таком синтаксисе, связь переменной и объекта - односторонняя. Т.е. уничтожение переменной не приведет к уничтожению формы. Вся проблема в том, какая область видимости у этой созданной переменной. По умолчанию, если область видимости переменной не указана явно, то она получает область видимости PRIVATE. Это значит, что такая переменная будет существовать до тех пор, пока не будет завершена процедура, в которой она создана. Метод ToolBar отрабатывает "как положено". Убирая за собой весь тот "мусор", который был создан внутри. В том числе и переменную, содержащую ссылку на созданную форму. А вот почему так "коряво" работает меню - не понятно. Теоретически, тоже не должно было остаться никаких переменных. В любом случае, опираться на такие ссылки я бы не стал. Слишком это не надежно. Получить ссылку на существующую форму можно через коллекции _SCREEN.Forms() или _VFP.Forms(). Если в приложении одна и та же форма не может быть запущена дважды (т.е. 2 копии одной формы одновременно), то ссылку на форму можно получить так: Код: plaintext 1. 2. 3. Обратите внимание, что здесь используется системная переменная _VFP. Использовать аналогичный синтаксис с системной переменной _SCREEN - не получиться. Коллекция _SCREEN.Forms() не принимает в качестве параметра символьные значения. Только числовые. Соответственно, обращение к ее методам: Код: plaintext Если же одна и та же форма может быть запущена несколько раз, то придется сканировать всю коллекцию и проверять какой-либо уникальный признак, который позволит отличить один экземпляр формы от другого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 23:23 |
|
||
|
DO FORM <> NAME <> LINKED ???
|
|||
|---|---|---|---|
|
#18+
Hi Владимир! > ПОЧЕМУ??? Чувствую, что я чего-то недопонимаю. Да, ты не допонимаешь понятие области видимости переменных. Автоматически создаваемые переменные имеют область видимости Private - и если запускать из кнопки тулбара, то по завершении метода click переменная выйдёт за свою область видимости и уничтожится. P.S. Вообще в 99% случаев не требуется создания подобной переменной-ссылки, т.к. ссылаться на формы лучше другими способами - и уж совсем никуда не годится подход с автоматически создаваемой переменной-ссылкой. Банальная ситуация - ты 2 раза запустил одну форму - как думаешь ссылка на какую из них будет хранится в подобной переменной :) И как добраться до второй формы. А если потом одну из форм закрыть то что случится с переменной :) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 04:06 |
|
||
|
DO FORM <> NAME <> LINKED ???
|
|||
|---|---|---|---|
|
#18+
Меню создано в стартовом файле. 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. А в методе UNLOAD соответственно: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2005, 06:40 |
|
||
|
DO FORM <> NAME <> LINKED ???
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2005, 00:37 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33441522&tid=1592761]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 499ms |

| 0 / 0 |
