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

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

->Вячеслав Клепинин
Сомнение: всегда ли выражение _ref_form = 0 означает удаление объекта(т.е. вызов Release)?
...
Рейтинг: 0 / 0
15.06.2004, 14:34
    #32561697
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
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
16.06.2004, 11:34
    #32563161
ilya_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
Это что же получается, что форма , как объект, не может существовать сама посебе - ей обязательно нужен 'поводырь', т.е. переменная. И если я обнуляю эту переменную - это значит я удалаяю форму?!
Более того, если есть необходимость, чтобы форма жила сколь угодно долго - ее [переменную] необходимо объявлять ГЛОБАЛЬНОЙ .
...
Рейтинг: 0 / 0
16.06.2004, 11:47
    #32563197
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OPEN SHORTCUT MENU->SHOW FORM->CLOSE SHORTCUT MENU => AUTO CLOSE FORM?
Ну почитай ты ту статью которая "ровным счетом, ничего не говорит - общее описание". Только читай внимательно!

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

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

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

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

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

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

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

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

This.AddProperty("SELF",THIS)

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

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

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

to piva

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

to ilya_sql

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

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

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

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

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

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

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

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

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


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