powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создание формы программным способом
9 сообщений из 34, страница 2 из 2
Создание формы программным способом
    #33669187
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0) Точка с запятой означает перенос команды на следующую строку. ADD OBJECT - это ОДНА команда. Все, что после WITH - это параметры , которые идут, как и положено параметрам, через запятую.

1) Событие QueryUnload - это событие формы. Для PageFrame ты ее, конечно, тоже можешь написать, но там она будет не событием, а просто неким пользовательским методом, который еще надо вызвать.

Соответственно, закрытие формы не приводит к выполнению команды CLEAR EVENTS, поскольку событие QueryUnload формы осталось не перекрытым и, естесственно, форма остается висеть.

2) В данном случае делать переменную ofrm глобальной нет никакой необходимости. Форму бедет "держать" команда READ EVENTS
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33670430
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ0) Точка с запятой означает перенос команды на следующую строку. ADD OBJECT - это ОДНА команда. Все, что после WITH - это параметры , которые идут, как и положено параметрам, через запятую.

Да, это я понял и уяснил.

ВладимирМ
1) Событие QueryUnload - это событие формы. Для PageFrame ты ее, конечно, тоже можешь написать, но там она будет не событием, а просто неким пользовательским методом, который еще надо вызвать.

Это моя ошибка, я ее уже устранил, но вино забыл исправить в посте. Конечно я не туда поместил событие

ВладимирМ
Соответственно, закрытие формы не приводит к выполнению команды CLEAR EVENTS, поскольку событие QueryUnload формы осталось не перекрытым и, естесственно, форма остается висеть.

Я поместил условие CLEAR EVENTS на событие формы

ВладимирМ
2) В данном случае делать переменную ofrm глобальной нет никакой необходимости. Форму бедет "держать" команда READ EVENTS

Я сменил видимсоть переменной, но это особо ни к чему не приводит

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
local ofrm
ofrm=NEWOBJECT("form1")
ofrm.Show( 1 )

MESSAGEBOX("Работа с программой завершена"+chr( 13 )+"Нажмите ОК для завершения", 0 ,"Сообщения") 
CLEAR EVENTS
return

Работа происходит так, загружается и форма и окно с ообщением. Естественно после закрытия окна формы завершение работы не происходит. В режиме IDE приходится лезть в Project и делать cancel программы. В рантайм режиме - только путем завершения процесса.
Объясни, пожалуйста, как остановить работу главного программного файла после появления формы, а когда работа с формой завершена передать управление событию Clear Events.

Т.е. если форма создана визуальным редактором, я просто использую команду DO FORM FORM1
READ EVENTS

а вот через программный интерфейс ничего не получается. И добавление Read events и return в разных сочетаниях Ничего не помогает.
Понимаю, что я просто не понимаю каких-то общих принципов. Просьба или пояснить на живом примере, или отослать к первоисточникам (ссылкам)
Заранее спасибо
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33670494
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще немного подумал и сделал так. Кажестя работает. Но желательен комментарий специалиста. А то я не совсем понимаю, что делаю:-). Не люблю делать что-то не понимая..

файл config.fpw
Код: plaintext
1.
2.
cogepage=auto
screen=off

главный исполняемый файл (источник)
Код: 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.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
local ofrm
ofrm=NEWOBJECT("form1")
ofrm.Show( 1 )
READ events
MESSAGEBOX("Работа с программой завершена"+chr( 13 )+"Нажмите ОК для завершения", 0 ,"Сообщения") 
return


CLEAR EVENTS

DEFINE CLASS form1 AS form
	DataSession =  1 
	Desktop = .T.
	ShowWindow =  2 
	DoCreate = .T.
	AutoCenter = .T.
	BorderStyle =  3 
	Caption = "Sample using ComboBox"
	WindowType =  1 
	WindowState =  0 
	Name = "FORM1"

	ADD OBJECT pageframe1 AS pageframe1
     
  PROCEDURE queryunload
        CLEAR EVENTS
  endproc
ENDDEFINE

DEFINE CLASS pageframe1 AS pageframe
		ErasePage = .T.
		PageCount =  2 
		Top =  0 
		Left =  0 
		Width =  373 
		Height =  257 
		Name = "Pageframe1"
		Page1.Caption = "Студенты"
		Page1.Name = "Page1"
		Page2.Caption = "Преподаватели"
		Page2.Name = "Page2"

PROCEDURE Init
      THIS.Page1.AddObject('mypage2','mypage2')
      THIS.Page1.mypage2.Visible = .T.
      THIS.Page2.AddObject('mypage1','mypage1')
      THIS.Page2.mypage1.Visible = .T.
      ENDPROC

ENDDEFINE



DEFINE CLASS mypage1 as Container 
    	Top =  0 
		Left =  0 
		Width =  373 
		Height =  257 
		Name = "Container1"

	ADD OBJECT combo1 as combobox WITH ;	
			ColumnCount =  2 , ;
	   		ColumnWidths = "150,150", ;
			Height =  25 , ;
			Left =  11 , ;
			Style =  2 , ;
			Top =  32 , ;
			Width =  350 , ;
			Name = "Combo1", ;
			visible=.T.
	
	ADD OBJECT text1 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  80 , ;
		Width =  301 , ;
		Name = "Text1", ;
		visible=.T.
    
    ADD OBJECT text2 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  128 , ;
		Width =  301 , ;
		Name = "Text2", ;
		visible=.T.
	
	PROCEDURE combo1.Init
	 WITH This
   		.AddListitem( 'Гуров' )
	   .AddListItem( 'Базы данных', .NewItemID,  2  )
	   .AddListItem( 'Алаева' )
 	   .AddListItem( 'Администрирование', .NewItemID,  2  )
	   .AddListItem( 'Лабутина' )
	   .AddListItem( 'Моделирование', .NewItemID,  2  )
	   .AddListItem( 'Шигалов' )
	   .AddListItem( 'Программирование', .NewItemID,  2  )
	 ENDWITH	
	ENDPROC

    PROCEDURE combo1.click
	 PUBLIC a as Byte
	  a=this.ListItemId
	  thisform.pageframe1.page2.mypage1.text1.value=this.ListItem(a, 1 )
	  thisform.pageframe1.page2.mypage1.text2.value=this.ListItem(a, 2 )
	ENDPROC	
ENDDEFINE

DEFINE CLASS mypage2 as Container
        Top =  0 
		Left =  0 
		Width =  373 
		Height =  257 
		Name = "Container2"

	
	ADD OBJECT combo1 AS combobox WITH ;
			ColumnCount =  2 , ;
	   		ColumnWidths = "150,150", ;
			Height =  25 , ;
			Left =  11 , ;
			Style =  2 , ;
			Top =  32 , ;
			Width =  350 , ;
			Name = "Combo1", ;
			visible=.T.
	
	ADD OBJECT text1 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  80 , ;
		Width =  301 , ;
		Name = "Text1", ;
		visible=.T.
    
    ADD OBJECT text2 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  128 , ;
		Width =  301 , ;
		Name = "Text2", ;
		visible=.T.
	
	PROCEDURE combo1.Init
	 WITH This
   		.AddListitem( 'Щепин' )
	   .AddListItem( '3-42', .NewItemID,  2  )
	   .AddListItem( 'Лаптев' )
 	   .AddListItem( '4-42', .NewItemID,  2  )
	   .AddListItem( 'Красова' )
	   .AddListItem( '1-42', .NewItemID,  2  )
	   .AddListItem( 'Воронин' )
	   .AddListItem( '5-42', .NewItemID,  2  )
	 ENDWITH	
	ENDPROC
    PROCEDURE combo1.click
	 PUBLIC a as Byte
	  a=this.ListItemId
	  thisform.pageframe1.page1.mypage2.text1.value=this.ListItem(a, 1 )
	  thisform.pageframe1.page1.mypage2.text2.value=this.ListItem(a, 2 )
	ENDPROC	
ENDDEFINE

Интересно, что если вообще исключить строчку Clear Events из главной программы - то exeшник работает точно также как из Clear Events. Почему так происходит? Вероятно, потому, что объектная переменная локальная и умирает после выхода по return, что автоматически приводит у умиранию runtime, поскольку у меня есть событие при выгрузке?
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33670575
Кузнецов Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто у тебя две команды выполняют схожие действия и поэтому путают тебя.
Код: plaintext
1.
ofrm.Show( 1 )
READ events
Первая показывает форму на экране как МОДАЛЬНУЮ. И остается висеть, пока ее
не удалишь. Для простоты можно считать, что у нее выполняется свой READ
EVENT. Поэтому надо заботиться чтобы эту форму ликвидировать через
THISFORM.RELEASE. И только после удаления твоей формы сработает следующая
строка в твоей программе: READ EVENT. На нем твоя программа остановиться,
выполняя события, методы и ожидая, когда ты дашь команду CLEAR EVENT, чтобы
продолжить выполнение дальше. В твоем случае команду MESSAGEBOX.
Мне думается что в твоем простом примере пара READ\CLEAR EVENT излишняя.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33671972
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузнецов Игорь
Просто у тебя две команды выполняют схожие действия и поэтому путают тебя.
Код: plaintext
1.
ofrm.Show( 1 )
READ events
Первая показывает форму на экране как МОДАЛЬНУЮ. И остается висеть, пока ее
не удалишь.
У него используется форма ShowWindow = 2 - As Top-Level. Такие формы не могут быть модальными по определению. Т.е. параметр 1 в методе Show() - игнорируется. Поэтому "держит" форму только и исключительно READ EVENTS
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33671994
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 cripton
Команду CLEAR EVENTS надо давать в событии UNLOAD-формы. В любых других событиях нет никакой гарантии, что до этой команды вообще дойдет дело.

В том же событии QueryUnload обычно никто никаких явных команд по закрытию не пишет. Там делается перенаправление на общий метод закрытия формы. Как пример, такое сойдет. Но для рабочей программы - не годится.

Почитай все-таки описание к настройке ShowWindow = 2. И что там написано по поводу WindowType.
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33672226
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да я согласен на счет методоа QueryUnload.

Дело в том что у меня есть некоторый опыт работы с формами в VBasic и Delphi.
В частности Vbasic есть событие Close и UnLoad. Я вполне понимаю разницу между этими событиями. Close идет после UnLoad и фактически к этому моменту все объекты формы становятся в nil.

В FoxPro еще не все догоняю. Понимаю, что среда тут особая, хотя и логически во многом схожая.

Я прочитал справку и хорошо понял, что означает As Top Level и почему такая форма не может быть модальной по определению. Это было бы прямое нарушение многозадачности винды, несомненно.

Не совсем я понимаю когда требуется вызыв события read events и команды clear events,

В случае создания формы в ручную и вызывая ее из главного программного модуля с помощью read events я организую точку останова. Поработав с формой и закрыв ее, даже используя команду clear events - я тем неменее не завершаю процесс, запущенный главным программным модулем.

В случае же программного создание формы как я понимаю все происходит непосредственно из главного программного модуля, поэтому завершение приложения при закрытии формы происходит автоматически

Не понимаю только почему так происходит. Какова кухня???
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33673231
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
criptonВ случае создания формы в ручную и вызывая ее из главного программного модуля с помощью read events я организую точку останова. Поработав с формой и закрыв ее, даже используя команду clear events - я тем неменее не завершаю процесс, запущенный главным программным модулем.
Приведите пример. Из этого описания следует, что до команды CLEAR EVENTS дело вообще не дошло. Либо команда READ EVENTS была дана повторно ПОСЛЕ команды CLEAR EVENTS

criptonВ случае же программного создание формы как я понимаю все происходит непосредственно из главного программного модуля, поэтому завершение приложения при закрытии формы происходит автоматически
В случае DO FORM все также происходит непосредственно из главного программного модуля. Дело вовсе не в этом, а в последовательности событий. Где-то, что-то напутали

criptonНе понимаю только почему так происходит. Какова кухня???
"ТщательнЕе надо" (с)

Все просто при любом способе запуска формы.

Ни команда DO FORM ни команда oForm.Show() в случае формы As Top-Level не могут сформировать процесс ожидания события пользователя. Это значит, что после выполнения этих команд выполнение главного стартового модуля будет продолжено. Если не организовать точки останова, то выполнение главного стартового модуля будет завершено и приложение FoxPro завершит свою работу.

Чтобы организовать точку останова для ожидания события пользователя дается команда READ EVENTS. Она и "держит" весь процесс.

Когда дается команда CLEAR EVENTS (не важно где), точка останова по READ EVENTS отменяется. Система больше не ожидает событий пользователя. Она выполняет все оставшиеся в стеке события, затем управление передается в главную стартовую программу на команду, непосредственно следующую за командой READ EVENTS.

"Подвесить" систему в такой идеологии может только не закрытая форма. Форма не может быть закрыта, если остался не завершенным какой-либо ее метод или есть не обнуленная ссылка на внешний объект.

Например, из метода формы вызвали модальную форму. В этом случае, метод формы не может быть завершен, пока не будет закрыта вызванная модальная форма. Как следствие, сама форма не может быть закрыта. Ее "держит" дочерняя модальная форма.
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33674161
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все спасибо. Кажется разобрался во всех моментах.

Действительно не важно каким образом создана форма. Главное, в особенности, если это форма типа AS TOP LEVEL, корректное завершение ее, т.е. отработка события clear events в нужном методе, в нашем случае UnLoad.
Если данное событие поместить в метод Release нас ожидает конфуз с не завершением процесса и тогда, кажется, что нужно выполнять Clear Events в программном файле.
Но это только видимость для данного конкретного случая.

Еще раз большое спасибо за полезную дискуссию
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создание формы программным способом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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