powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
22 сообщений из 22, страница 1 из 1
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32557825
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
Если запустить форму из меню (DEFINE ..), то форма закрывается автоматически. Как изменить данное поведение, чтобы форма не закрывалась ?
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32558763
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561108
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Схема вызова форм такая : форма Form2 (немодальная, MDI) вызывается из формы Form1 (немодальная, MDI). В debug видно, что как только окно показано (вызван матод Show) и управление передано Form1, форма Form2 тут же закрывается. По идее все MDI-окна одновременно видны и реагируют на действия пользователя.
Предложенная статья, ровным счетом, ничего не говорит - общее описание.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561122
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не пробовали использовать Toolbar в который уже вставлять Menu?
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561139
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ToolBar или контекстное меню значения не имеет, задача в том, чтобы выяснить такое непонятное для меня поведение.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561307
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно странно...
Но по приведенному Вами описанию я так ничего и не понял.
Нельзя ли поподробнее - привести пример кода и среды...

Кстати, вот пример с MS сайта - тут две формы, причем перемещаяся по Grid в 1 форме, иэменения происходят во 2 форме (VFP 8.0) и ничего не закрывается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
********************************************************************************
* 4_EventBinding_Forms.prg
* Description:	This program will show how you can bind the AfterRowColChange
*				event of a grid to another form to refresh the associated child
*				data for the current record.
********************************************************************************
#DEFINE CRLF CHR( 13 )+CHR( 10 )

PUBLIC oForm1
PUBLIC oForm2
PUBLIC cDataPath
LOCAL lnSelect as Integer

* Save environment.
lnSelect = SELECT()
SELECT  0 

* Set location of where the sample data is stored
cDataPath = _samples + "\Data\"

* Select records from the sample Customer table
SELECT cust_id, company, contact FROM (cDataPath + "Customer") ;
	INTO CURSOR curCust
GO TOP

* Create an instance of the Orders Form.
oForm2=NEWOBJECT("Form2")
oForm2.Show()

* Create an instance of the Customers Form.
oForm1=NEWOBJECT("Form1")
oForm1.Show()

* Bind the AfterRowColChange event of the Customers form's grid to the Orders
* form's RefreshData method.  This method refreshed the orders for the customer
* selected on the Customer's form.
BINDEVENT(oForm1.Grid1,"AfterRowColChange",oForm2,"RefreshData")

lcStr = "Move around to different records in the Customers form and see how the" + ;
		" Orders form is updated to reflect the current customer's orders.  The" + ;
		" AfterRowColChange event for the grid that displays the customer records" + ;
		" is bound to the refreshing of data in the Orders form."
MESSAGEBOX(lcStr)

* Restore environment.
USE
SELECT (lnSelect)

RETURN


* Customer Form class used for this sample.
DEFINE CLASS Form1 AS form
	Height = 250
	Width = 483
	Caption = "Customers"
	Name = "Form1"

	ADD OBJECT Grid1 AS grid WITH ;
		Height = 200, ;
		Left = 24, ;
		RecordSource = "curCust", ;
		Top = 25, ;
		Width = 432, ;
		Name = "Grid1"
		
		
ENDDEFINE

* Order Form class used for this sample.
DEFINE CLASS Form2 AS form
	Height = 250
	Width = 483
	Top = 300
	Caption = "Orders"
	Name = "Form2"
	
	ADD OBJECT grid1 AS grid WITH ;
		Height = 200, ;
		Left = 24, ;
		Top = 25, ;
		Width = 432, ;
		Name = "Grid1"

	PROCEDURE Init
		* Refresh the order information displayed in the Orders grid.
		This.RefreshData()
	ENDPROC
	
	PROCEDURE RefreshData
		PARAMETERS tRowCol
		
		* Select the Orders associated with the selected Customer.
		SELECT * FROM (cDataPath + "Orders") ;
			WHERE Cust_ID = curCust.Cust_ID ;
			INTO CURSOR curOrders

		* Set the Orders grid's RecordSource property to the selected orders.
		This.Grid1.RecordSource = "curOrders"
		
		* Autofit all the Order information in the grid.
		This.Grid1.AutoFit()
		
		* Refresh the Order form.
		this.Refresh()
	ENDPROC
	
ENDDEFINE
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561446
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
->Sergey Ch
Что-то вроде этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
DEFINE CLASS Form1 AS form
	Height =  250 
	Width =  483 
	...
	PROCEDURE RightClick
		DO shortcut_menu.prg && показывает меню
		IF BAR() =  1 
			_form = NEWOBJECT('Form2')
			_form.Show( 2 )
		ENDIF
	ENDPROC		
ENDDEFINE

DEFINE CLASS Form2 AS form
	Height =  250 
	Width =  483 
	...
ENDDEFINE

** Где-то в главном окне(MainForm) в Button1::Click
_form = NEWOBJECT('Form2')
_form.Show( 2 )

И Form1, и Form2 являются дочерними(MDI) окнами главного окна.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561448
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
->Sergey Ch
Что-то вроде этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
DEFINE CLASS Form1 AS form
	Height =  250 
	Width =  483 
	...
	PROCEDURE RightClick
		DO shortcut_menu.prg && показывает меню
		IF BAR() =  1 
			_form = NEWOBJECT('Form2')
			_form.Show( 2 )
		ENDIF
	ENDPROC		
ENDDEFINE

DEFINE CLASS Form2 AS form
	Height =  250 
	Width =  483 
	...
ENDDEFINE

** Где-то в главном окне(MainForm) в Button1::Click
_form = NEWOBJECT('Form1')
_form.Show( 2 )

И Form1, и Form2 являются MDI-окнами, скажем главного окна.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561541
Ваша ошибка в том, что вы при создании новой MDI формы связываете её с той же (видимо, глобальной) переменной _form . Естественно, что ранее связанная с этой пернеменной форма уничтожается при создании новой формы.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561612
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_form - это локальная переменная:
Код: plaintext
LOCAL _form AS Form@
Более того, Form2 'живет' в памяти, но невидимый , хотя определялся как видимый (может я не прав?). Form2 'прячется', когда управление передается MainForm в процедуре Form1::RightClick.

->Вячеслав Клепинин
Сомнение: всегда ли выражение _ref_form = 0 означает удаление объекта(т.е. вызов Release)?
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32561697
to ilya_sql

По поводу Вашего сомнения. Метод Release может быть вызван только явно. При присваивании переменной, ссылающейся на объект (форму), любого иного значения (в т.ч. ссылки на другой объект) метод Release не вызывается - см. окно свойств, чтобы увидеть, что Release не есть обработчик событий (как и метод Show, в котором вы так же можете писать любой код).
Когда ссылочная переменная получает новое значение, то для связанного с ней объекта выполняются события:

Destroy Event
QueryUnload Event
Unload Event

В вашем примере используются, как вы пишете, локальные переменные. Но это никак не следует из приведённого кода. В частности, в методе RightClick формы Form1 переменная _form не объявлена как локальная, следовательно, она является PRIVATE и видна только в создавшем её методе и всех методах (процедурах), вызываемых из этого метода. Поэтому при завершении метода RightClick переменная _form уничтожается (вместе со связанной с ней немодальной формой). Вот если бы запускаемая форма была модальной, то выполнение метода RightClick было бы приостановлено до завершения работы с этой модальной формой.
Использование локальных переменных здесь так же недопустимо.
Что нужно сделать:
1. Используйте разные переменные для связывания с запускаемыми формами
2. Эти переменные д.б. либо глобальными, либо являться свойствами той формы, из которой запускаются ваши немрдальные формы.
3. Есть некоторые моменты при работе с немодальными формами, которые необходимо учитывать. Как уже сказано выше, немодальная форма не прекращает выполнение процедуры, её вызвавшей. Поэтому весь код, расположенные после оператора вызова такой формы, будет выполнен до конца, после чего программа перейдёт в состояние ожидания событий.

Успехов!!!
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563161
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это что же получается, что форма , как объект, не может существовать сама посебе - ей обязательно нужен 'поводырь', т.е. переменная. И если я обнуляю эту переменную - это значит я удалаяю форму?!
Более того, если есть необходимость, чтобы форма жила сколь угодно долго - ее [переменную] необходимо объявлять ГЛОБАЛЬНОЙ .
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563197
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну почитай ты ту статью которая "ровным счетом, ничего не говорит - общее описание". Только читай внимательно!

Форма МОЖЕТ существовать БЕЗ переменной.
Форма МОЖЕТ быть привязана к переменной так, что БЕЗ переменной она существовать не может.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563244
Форма МОЖЕТ существовать БЕЗ переменной
Когда форма создана, например, в конструкторе форм (файлы .SCX и SCT), и запускается командой
DO FORM MyForm
то фокс создаёт ссылочную переменную с именем аргумента команды (здесь - MyForm). Например, такая конструкция нормально работает:
Код: plaintext
1.
2.
3.
DO FORM MyForm NOSHOW      && Загрузить форму в память (не выводим на экран)
MyForm.Picture = имя_файла && Загрузить фоновый рисунок
MyForm.Visible = .T.       && Сделать форму видимой
Использование ссылочных переменных очень удобно. В частности, позволяет легко обмениваться информацией между формами, из одной формы вызывать методы другой формы и т.д.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563294
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав, не надо путать Илью. Он и так плохо понимает о чем идет речь.

Да, при создании формы (если речь идет о DO FORM) создается ссылочная переменная. НО! По-умолчанию, эта переменная не связана с формой в том смысле, что уничтожение этой переменной не приводит к уничтожению формы. Для организации такой "жесткой" связи необходимо использовать опцию LINKED.

Если переменная не ассоциирована с формой, то после удаления такой переменной ссылку на форму можно вытащить только через коллекцию _SCREEN.Forms().

Впрочем, обо всем этом написано по приведенной ссылке в разделе "Именование форм"

Однако в данном случае создается объект через CreateObject(), а тут ни о какой "незваисимости" не может быть речи. Форма жестко ассоциирована с переменной. Но это вопрос не собственно формы. Такое поведение характерно для ЛЮБОГО объекта.

Опять же в приведенной статье была высказан идея о создании "менеджера" форм. В простейшем случае - это глобальный объект, содержащий ссылки на ВСЕ открытые формы проекта. Обращение к формам через этот глобальный объект.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563329
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх! дайте и мне пару камушков кинутб в беседу.
У меня есть формы которые живут сами по себе и им не нужна накакая ссылочность на переменные т.е. именно

Форма МОЖЕТ существовать БЕЗ переменной

Только в Init формы есть код

This.AddProperty("SELF",THIS)

И живет же безо всяких переменных :))
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563386
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
->Вячеслав Клепинин
В любом случае неявно создается переменная 'MyForm'.

Если Вы заметели я использую NewObject(..) и Show(..) , т.к. для меня они более понятны и не использую конструкцию 'DO FORM ..'. Видимо при использовании NewObject происходит привязка (LINKED) формы к переменной, потому как если я присваиваю NULL, происходит удаление объекта (а не Hide, как я думал раньше). Мне приходится 'следить', чтобы не произошла ситуация, когда ни одна переменная не указывает на этот объект, иначе я безвозвратно теряю его. Я сделал вывод, что такое поведение свойственно всем объектам FoxPro, и к форме(Form) в частности. Думаю, теперь уважаемый ВладимирМ меня поймет.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563445
to ВладимирМ

Ну спасибо, разъяснили! :)))

to piva

Вы о чём? Или поговорим о том, что означают синонимы THIS, THISFORM и т.д.? (при всём моём огромном уважении!!!)

to ilya_sql

Я полагаю, что достаточно подробно рассмотрел Вашу проблему. Команда DO FORM есть наследие ещё со времён dBase, и вполне естественно пользоваться механизмом ООП (одобряю). Но проблема-то была:
1. в области видимости переменных
2. в непонимании работы механизма ссылок на объекты.
И я не вижу, в каком месте мог ввести Вас в заблуждение.

Так что всем большой привет! :)))

P.S. Я не писал, что "В любом случае неявно создается переменная 'MyForm'." Это Вы уже от себя...
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563639
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
->Вячеслав Клепинин
В любом случае неявно создается переменная 'MyForm'.

Если Вы заметели я использую NewObject(..) и Show(..) , т.к. для меня они более понятны и не использую конструкцию 'DO FORM ..'. Видимо при использовании NewObject происходит привязка (LINKED) формы к переменной, потому как если я присваиваю NULL, происходит удаление объекта (а не Hide, как я думал раньше). Мне приходится 'следить', чтобы не произошла ситуация, когда ни одна переменная не указывает на этот объект, иначе я безвозвратно теряю его. Я сделал вывод, что такое поведение свойственно всем объектам FoxPro, и к форме(Form) в частности. Думаю, теперь уважаемый ВладимирМ меня поймет.
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563756
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
->ВладимирМ

Поясните более подробно " Форма жестко ассоциирована с переменной ".
Не означает ли это, что данная операция приведет к удалению формы:

Код: plaintext
1.
2.
3.
_oForm = NEWOBJECT('Form')
_oForm1 = _oForm
RELEASE _oForm
&& На что ссылается _oForm1?

П.С. Мои благодарности всем за разьяснение данного вопроса. Я выяснил, что основная моя ошибка была в обнулении ссылки на форму (в свое время я искал описание десруктора объекта, но как оказалось явно его нет - все очень просто присваиваешь NULL и нет проблем).
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563862
to ilya_sql

А можно, я отвечу за Владимира?
Самому слабо запустить этот код на выполнение, а потом посмотреть, на что ссылается _oForm1 ?

Насчёт образного выражения Владимира "Форма жестко ассоциирована с переменной" - так это то, что вы получаете в результате выполнения функции NewObject (или CreateObject - кому как нравится).
...
Рейтинг: 0 / 0
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
    #32563963
ilya_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никто никого не принуждает к беседе. Посмотрите сколько человек прочитало эту тему, и что? каждый будет проверять ('проверять' будешь уже в реальном коде). Узнать мнение специалиста бывает гораздо оптимальнее , чем идти методом проб и ошибок.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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