powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создание формы программным способом
34 сообщений из 34, показаны все 2 страниц
Создание формы программным способом
    #33660484
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача:
Необходимо сделать форму с двумя страницами на каждой, из которых присутсвует один combo box и два text-поля.

Проблема:
не могу программно описать (из справочной системы неясно как это сделать) или добавить объекты combobox и text, принадлежащие соотвествующим страницам.

Как делал:

Код: 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.
local loform
loform = createobject('Example')
loform.Show( 1 )
return

DEFINE CLASS Example AS form
 Caption = "Example"
 Name = "Form1"

 ADD OBJECT pageframe1 AS pageframe WITH ;
  PageCount =  2 , ;
  BorderWidth =  0 , ;
  Top =  12 , ;
  Left =  12 , ;
  Width =  336 , ;
  Height =  169 , ;
  Tabs = .t., ;
  Name = "Pageframe1", ;
  Page1.Caption = "Page1", ;
  Page1.Name = "Page1", ;
  Page2.Caption = "Page2", ;
  Page2.Name = "Page2", 
    
  ADD OBJECT cbolistitem AS combobox WITH ;
  ColumnCount =  2 , ;
  ColumnWidths = "100,100", ;
  Left =  34 , ;
  Sorted = .T., ;
  Style =  2 , ;
  TabIndex =  3 , ;
  Top =  80 , ;
  Name = "cboListItem"
  
 ENDDEFINE

Очевидно, что при выполнении ADD OBJECT cbolistitem AS combobox WITH ; он создается на форме и не принадлежит первой странице, но как описать прикрепить его к первой странице не понял. Помогите, кто может. Заранее спасибо
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33660985
m.a.v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
pageframe.page.addObject(cName, cClass[, cOLEClass][, aInit1, aInit2...])
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33661111
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, но этого недостаточно для полного понимания.

я пробывал сделать так
Код: 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.
local loform
loform = createobject('WizardExample')
loform.Show( 1 )
return

DEFINE CLASS WizardExample AS form
 Caption = "Wizard Example"
 Name = "Form1"

 ADD OBJECT pageframe1 AS pageframe WITH ;
  PageCount =  2 , ;
  BorderWidth =  0 , ;
  Top =  12 , ;
  Left =  12 , ;
  Width =  336 , ;
  Height =  169 , ;
  Tabs = .t., ;
  Name = "Pageframe1", ;
  Page1.Caption = "Студенты", ;
  Page1.Name = "Page1", ;
  Page2.Caption = "Преподаватели", ;
  Page2.Name = "Page2"
  
  PROCEDURE Init
   With THISFORM.pageframe1
   .Page1.AddObject('cboStud','combobox')
   With .Page1.cboStud
    ColumnCount =  2  ;
    ColumnWidths = "100,100" ;
    Left =  34 ;
    Sorted = .T.;
    Style =  2 ;
    TabIndex =  1 ;
    Top =  80 
	    
  Endwith

   Endwith
ENDPROC

ENDDEFINE


но мне нужна еще процедура инициализации combo box вида

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
PROCEDURE Init
 WITH This
   .AddListitem( 'Гуров' )
   .AddListItem( 'Базы данных', .NewItemID,  2  )
   .AddListItem( 'Алаева' )
   .AddListItem( 'Администрирование', .NewItemID,  2  )
   .AddListItem( 'Лабутина' )
   .AddListItem( 'Моделирование', .NewItemID,  2  )
   .AddListItem( 'Шигалов' )
   .AddListItem( 'Программирование', .NewItemID,  2  )
    
  ENDWITH

ENDPROC

пытался ее приспособить так
Код: 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.
PROCEDURE Init
   With THISFORM.pageframe1
   .Page1.AddObject('cboStud','combobox')
   With .Page1.cboStud
    ColumnCount =  2  ;
    ColumnWidths = "100,100" ;
    Left =  34 ;
    Sorted = .T.;
    Style =  2 ;
    TabIndex =  1 ;
    Top =  80 
  PROCEDURE Init
   WITH This
   .AddListitem( 'Гуров' )
   .AddListItem( 'Базы данных', .NewItemID,  2  )
   .AddListItem( 'Алаева' )
   .AddListItem( 'Администрирование', .NewItemID,  2  )
   .AddListItem( 'Лабутина' )
   .AddListItem( 'Моделирование', .NewItemID,  2  )
   .AddListItem( 'Шигалов' )
   .AddListItem( 'Программирование', .NewItemID,  2  )
   
  ENDWITH

ENDPROC
	    
  Endwith

   Endwith
ENDPROC

выдает ошибку.

Если можно, опубликуйте код
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33661220
m.a.v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделай DEFINE CLASS MyCombo AS Combo
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DEFINE CLASS MyCombo AS Combo
..
...
PROCEDURE Init
 WITH This
   .AddListitem( 'Гуров' )
   .AddListItem( 'Базы данных', .NewItemID,  2  )
   .AddListItem( 'Алаева' )
   .AddListItem( 'Администрирование', .NewItemID,  2  )
   .AddListItem( 'Лабутина' )
   .AddListItem( 'Моделирование', .NewItemID,  2  )
   .AddListItem( 'Шигалов' )
   .AddListItem( 'Программирование', .NewItemID,  2  )
    
  ENDWITH

ENDPROC
..
...
....
 .Page1.AddObject('cboStud','MyCombo')
В нем попиши процедуру init а на вкладку добавляй класс не combo а MyCombo
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33661331
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно.
Спасибо за помощь.

К сожалению хорошей справки по фокс про у меня нет. А некоторые общие технологии ООП тут работают немного отлично, чем скажем в Дельфи.

Но подход ясен. Только один момент. Определение класса mycombo слуедует делать внутри определения класса wizardexample или вне его?
Кажестя, нужно делать вне его...
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33661673
Если появляются такого рода вопросы, то Fox сам может подсказать что,как и куда нужно запихать.
Для этого создаёшь свой класс (например на основе Form) закидываешь на него Page, заполняешь Page combobox(ами) , text(ами), прописываешь Init(ы) и т.д.
Нажимаешь на кнопку Class Browser в нём кнопку View Class Browser и видишь свой текст программы.
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33662049
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага!!!

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

Сделал как доктор прописал:-) Но сразу возникли проблемы.
Создал сначала форму, посмотрел ее код, добавил необходимые строки
вот код
Код: 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.
**************************************************
*-- Form:         form1 (c:\users\foxprimer\proj1\form1.scx)
*-- ParentClass:  form
*-- BaseClass:    form
*-- Time Stamp:   04/12/06 11:06:00 AM
*

PUBLIC ofrm
ofrm=NEWOBJECT("form1")
ofrm.Show
RETURN


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 pageframe WITH ;
		ErasePage = .T., ;
		PageCount =  2 , ;
		Top =  0 , ;
		Left =  0 , ;
		Width =  373 , ;
		Height =  257 , ;
		Name = "Pageframe1", ;
		Page1.Caption = "Студенты", ;
		Page1.Name = "Page1", ;
		Page2.Caption = "Преподаватели", ;
		Page2.Name = "Page2"


	ADD OBJECT form1.pageframe1.page1.combostud AS combobox WITH ;
		ColumnCount =  2 , ;
		ColumnWidths = "120,100", ;
		Height =  25 , ;
		Left =  23 , ;
		Sorted = .T., ;
		Style =  2 , ;
		Top =  20 , ;
		Width =  300 , ;
		Name = "ComboStud"


	ADD OBJECT form1.pageframe1.page1.text1 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  80 , ;
		Width =  301 , ;
		Name = "Text1"


	ADD OBJECT form1.pageframe1.page1.text2 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  128 , ;
		Width =  301 , ;
		Name = "Text2"


	ADD OBJECT form1.pageframe1.page2.combo1 AS combobox WITH ;
		ColumnCount =  2 , ;
		ColumnWidths = "150,150", ;
		Height =  25 , ;
		Left =  11 , ;
		Style =  2 , ;
		Top =  32 , ;
		Width =  350 , ;
		Name = "Combo1"


	ADD OBJECT form1.pageframe1.page2.text1 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  92 , ;
		Width =  325 , ;
		Name = "Text1"


	ADD OBJECT form1.pageframe1.page2.text2 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  140 , ;
		Width =  325 , ;
		Name = "Text2"


	PROCEDURE Unload
		CLOSE ALL
		CLEAR EVENTS
	ENDPROC


	PROCEDURE combostud.Click
		PUBLIC a as Byte
		a=this.ListItemId
		thisform.pageframe1.page1.text1.value=this.ListItem(a, 1 )
		thisform.pageframe1.page1.text2.value=this.ListItem(a, 2 )
	ENDPROC


	PROCEDURE combostud.Init
		 WITH This
		   .AddItem( 'Щепин' )
		   .List[.NewIndex,  2 ] = '3-42'
		   .AddItem( 'Тутнаев' )
		   .List[.NewIndex,  2 ] = '3-42'
		   .AddItem( 'Лаптев' )
		   .List[.NewIndex,  2 ] = '4-42'
		   .AddItem( 'Липов' )
		   .List[.NewIndex,  2 ] = '5-42'
		   .AddItem( 'Смолёнов' )
		   .List[.NewIndex,  2 ] = '5-43'
		  ENDWITH
	ENDPROC


	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.text1.value=this.ListItem(a, 1 )
		thisform.pageframe1.page2.text2.value=this.ListItem(a, 2 )
	ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************

однако при компиляции или запуске программы сразу возникла проблема в строке
Код: plaintext
ADD OBJECT form1.pageframe1.page1.combostud AS combobox WITH ;

т.е. неизвестный объект. Как быть?
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33662164
valeryka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, залезь, посмотри.
Создай форму, прилепи страничный блок, запихни на него какой-нибудь лабель, сохрани, посмотри код в классброузере, посмотри хелп на DEFINE CLASS.
Попробуй код скопировать и выполнить

Думаю, вопросов у тебя поприбавится
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33662192
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m.a.vСделай DEFINE CLASS MyCombo AS Combo
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DEFINE CLASS MyCombo AS Combo
..
...
PROCEDURE Init
 WITH This
   .AddListitem( 'Гуров' )
   .AddListItem( 'Базы данных', .NewItemID,  2  )
   .AddListItem( 'Алаева' )
   .AddListItem( 'Администрирование', .NewItemID,  2  )
   .AddListItem( 'Лабутина' )
   .AddListItem( 'Моделирование', .NewItemID,  2  )
   .AddListItem( 'Шигалов' )
   .AddListItem( 'Программирование', .NewItemID,  2  )
    
  ENDWITH

ENDPROC
..
...
....
 .Page1.AddObject('cboStud','MyCombo')
В нем попиши процедуру init а на вкладку добавляй класс не combo а MyCombo

Попытался сделать, как ты мне указал. Вероятно, что-то не совсем верно

вот код
Код: 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.
local loform
loform = createobject('WizardExample')
loform.Show( 1 )
return

DEFINE CLASS MyCombo AS Combo
PROCEDURE Init
 WITH This
   .AddListitem( 'Ãóðîâ' )
   .AddListItem( 'Áàçû äàííûõ', .NewItemID,  2  )
   .AddListItem( 'Àëàåâà' )
   .AddListItem( 'Àäìèíèñòðèðîâàíèå', .NewItemID,  2  )
   .AddListItem( 'Ëàáóòèíà' )
   .AddListItem( 'Ìîäåëèðîâàíèå', .NewItemID,  2  )
   .AddListItem( 'Øèãàëîâ' )
   .AddListItem( 'Ïðîãðàììèðîâàíèå', .NewItemID,  2  )
 ENDWITH

PROCEDURE Init
 PUBLIC a as Byte
  a=this.ListItemId
  thisform.pageframe1.page1.text1.value=this.ListItem(a, 1 )
  thisform.pageframe1.page1.text2.value=this.ListItem(a, 2 )
ENDPROC
ENDDEFINE
DEFINE CLASS WizardExample AS form
    DataSession =  1 
	Desktop = .T.
	ShowWindow =  2 
	DoCreate = .T.
	AutoCenter = .T.
	BorderStyle =  3 
	Caption = "Sample using ComboBox"
	WindowType =  1 
	WindowState =  0 
	Name = "WizardExample"

 ADD OBJECT pageframe1 AS pageframe WITH ;
       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
   With THISFORM.pageframe1
      .Page1.AddObject('cboStud','MyCombo')
      .Page1.AddObject('text1','textbox')
      .Page1.AddObject('text2','textbox')
   With .Page1.cboStud
        ColumnCount =  2 , ;
		ColumnWidths = "120,100", ;
		Height =  25 , ;
		Left =  23 , ;
		Sorted = .T., ;
		Style =  2 , ;
		Top =  20 , ;
		Width =  300 , ;
		Name = "cboStud"
	Endwith
	With .Page1.text1
 		Height =  25 , ;
		Left =  23 , ;
		Top =  80 , ;
		Width =  301 , ;
		Name = "Text1"
	Endwith
	With .Page1.text2
 		Height =  25 , ;
		Left =  23 , ;
		Top =  128 , ;
		Width =  301 , ;
		Name = "Text2"
	Endwith
	
   Endwith
ENDPROC

ENDDEFINE


Каковы ошибки?
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33663154
m.a.v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот этот код работает только форма не остается на экране после завершения
prg
Я поставил точку останова форма висит после пропадает честно говоря почему не знаю.
Кто знает прошу поделиться.

Код: 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.
local loform
loform = createobject('WizardExample') 
loform.Show( 1 )
loForm.visible = .t.
SET STEP ON

DEFINE CLASS MyCombo AS ComboBox
Top =  0 
Left =  0 
Width =  40 
Height =  20 
visible = .t.
PROCEDURE Init
 WITH This
   .AddListitem( 'Ao?ia' )
   .AddListItem( 'Aacu aaiiuo', .NewItemID,  2  )
   .AddListItem( 'Aeaaaa' )
   .AddListItem( 'Aaieieno?e?iaaiea', .NewItemID,  2  )
   .AddListItem( 'Eaaooeia' )
   .AddListItem( 'Iiaaee?iaaiea', .NewItemID,  2  )
   .AddListItem( 'Oeaaeia' )
   .AddListItem( 'I?ia?aiie?iaaiea', .NewItemID,  2  )
 ENDWITH


 PUBLIC a as Byte
  a=this.ListItemId
  *thisform.pageframe1.page1.text1.value=this.ListItem(a, 1 )
  *thisform.pageframe1.page1.text2.value=this.ListItem(a, 2 )
ENDPROC
ENDDEFINE

DEFINE CLASS WizardExample AS form
DataSession =  1 
ShowWindow =  2 
AutoCenter = .T.
BorderStyle =  3 
Caption = "Sample using ComboBox"
Height =  300 
width =  300 
Name = "WizardExample"

 ADD OBJECT pageframe1 AS pageframe WITH ;
       ErasePage = .T., ;
PageCount =  2 , ;
Top =  0 , ;
Left =  0 , ;
Width =  373 , ;
Height =  257 , ;
Name = "Pageframe1", ;
Page1.Caption = "Nooaaiou", ;
Page1.Name = "Page1", ;
Page2.Caption = "I?aiiaaaaoaee", ;
Page2.Name = "Page2"
  
PROCEDURE Init
WITH THISFORM.pageframe1
      .Page1.AddObject('cboStud','MyCombo')
      .Page1.AddObject('text1','textbox')
      .Page1.AddObject('text2','textbox')
ENDWITH 

WITH THISFORM.pageframe1.Page1.cboStud
.ColumnCount =  2  
.ColumnWidths = "120,100"
.Height =  25 
.Left =  23 
.Sorted = .T.
.Style =  2 
.Top =  20 
.Width =  300 
.Name = "cboStud"
ENDWITH

WITH THISFORM.pageframe1.Page1.text1
.Height =  25 
.Left =  23 
.Top =  80 
.Width =  301 
.Name = "Text1"
ENDWITH 
  
WITH THISFORM.pageframe1.Page1.text2
.Height =  25 
.Left =  23 
.Top =  128 
.Width =  301 
.Name = "Text2"
ENDWITH 


ENDPROC

ENDDEFINE
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33663185
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33663208
m.a.v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
prg вызывается из формы т.е. команда read events уже была.
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33663489
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вас всех так тянет работать с форами As Top-Level, то ознакомтесь с особенностями их применения в FoxPro. Хотя бы HELP читайте по тем командам, которые используете!

По умолчанию, FoxPro рассчитан на работу In SCREEN. Т.е. внутри основного окна FoxPro. Для As Top-Level форм будете всегда налетать на грабли. Не то, чтобы их нельзя было обойти, но для FoxPro - это "не стандартный" путь.

В данном случае: форма As Top-Level - не может быть модальной. Просто не может.

Следовательно, команда loform.Show(1) отобразит форму, но останова не произойдет, поскольку форма НЕ модальная. Код благополучно выполниться до конца, а поскольку переменная loform объявлена как LOCAL, то эта переменная и связанный с ней объект будут уничтожены по завершению процедуры.

Я бы рекомендовал сначала поработать с обычными формами. ShowWindow = 0. А вот когда научитесь, тогда и переходите к As To-Level. Тут разные организационнные решения. Разная идеология построения приложений.
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33663809
m.a.v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ благодарю за ответ действительно поменял local на public все отлично работает. Видно не уследил в чужем коде.
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33665220
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m.a.vВладимирМ благодарю за ответ действительно поменял local на public все отлично работает. Видно не уследил в чужем коде.

Я присоединяюсь к благодарности. Действительно проблема в типе переменной. m. a. v. - это моя вина, я просто использовал примеры фокса из справки. В одном случае заметь в примере используется public, в другом local. Но поскольку у меня ни один код не прошел, то данная промашка и не была замечана.

Однако пример, который ты-таки добил:-) страдает массой недочетов. Взять хотябы туже процедуру INIT для класса MyCombo. Я полагаю иметь два разных комбо на каждой из страниц и с разными значениями. Класс же следует описывать как-то более обще, без доп данных, а процедуру описывать там где в ней есть особая потребность.

Я поступил так как мне рекомендовал Владимир и скопировал код формы , сделанной вручную, как текст программы. Однако - результат плачевный - смотри письмо днем раньше.

Насчет модальных режимов формы и использования ее как Top level, а что тут сложного?
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33665485
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот код, который работает на ура.

Код: 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.
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN


	**************************************************
*-- Form:         form1 (c:\users\foxprimer\proj1\form1.scx)
*-- ParentClass:  form
*-- BaseClass:    form
*-- Time Stamp:   04/12/06 05:42:01 PM
*
DEFINE CLASS form1 AS form
	DataSession =  1 
	Desktop = .T.
	ShowWindow =  0 
	DoCreate = .T.
	AutoCenter = .T.
	BorderStyle =  3 
	Caption = "Sample using ComboBox"
	WindowType =  0 
	WindowState =  0 
	Name = "FORM1"

	ADD OBJECT combostud AS combobox WITH ;
		ColumnCount =  2 , ;
		ColumnWidths = "120,100", ;
		Height =  25 , ;
		Left =  23 , ;
		Sorted = .T., ;
		Style =  2 , ;
		Top =  20 , ;
		Width =  300 , ;
		Name = "ComboStud"

	ADD OBJECT text1 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  80 , ;
		Width =  301 , ;
		Name = "Text1"

	ADD OBJECT text2 AS textbox WITH ;
		Height =  25 , ;
		Left =  23 , ;
		Top =  128 , ;
		Width =  301 , ;
		Name = "Text2"

	PROCEDURE combostud.Init
		 WITH This
		   .AddItem( 'Щепин' )
		   .List[.NewIndex,  2 ] = '3-42'
		   .AddItem( 'Тутнаев' )
		   .List[.NewIndex,  2 ] = '3-42'
		   .AddItem( 'Лаптев' )
		   .List[.NewIndex,  2 ] = '4-42'
		   .AddItem( 'Липов' )
		   .List[.NewIndex,  2 ] = '5-42'
		   .AddItem( 'Смолёнов' )
		   .List[.NewIndex,  2 ] = '5-43'
		  ENDWITH
	ENDPROC

	PROCEDURE combostud.Click
		PUBLIC a as Byte
		a=this.ListItemId
		thisform.text1.value=this.ListItem(a, 1 )
		thisform.text2.value=this.ListItem(a, 2 )
	ENDPROC
ENDDEFINE
*
*-- EndDefine: form1
**************************************************

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

Несмотря на то, что дисскусия была довольно острой, особого конструктивизма практически нет, разве только m.a.v. добрая душа.

Понятно, что сделанные вручную формы - нормальные формы, но хотелось бы грамотно формировать формы программным способом -любой сложности и по возможности простым способом.
Пока все примеры фокса, которые я изучил внимательно, описыват процесс создание формы и ее контролов, только на этой самой форме.

В нашем исходном случае, вероятно, надо идти таким образом. Создавать собственный класс mypageframe и уже от него плясать по видимому...
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33665860
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
criptonПонятно, что сделанные вручную формы - нормальные формы, но хотелось бы грамотно формировать формы программным способом -любой сложности и по возможности простым способом.
Вы уж выберите что-то одно: либо "любой сложности", либо "простым способом". Сложную форму простым способом сделать в принципе невозможно. Не важно каким инструментом и в каком языке программирования.

При программном создании классов - контейнеров (не только форм, а вообще любых контейнеров) в FoxPro есть ограничение на количество уровней вложенности.

В пределах одной конструкции DEFINE CLASS не может быть больше одного уровня вложенности объектов по ADD OBJECT.

То, что показывает Class Browser (он может показать больше одного уровня вложенности у класса созданного в дизайнере) не всегда можно реально запустить из программы. Будут именно описанные ошибки на этапе компиляции.

На практике, это означает, что необходимо делать иерархию классов. Т.е. описывать отдельными конструкциями DEFINE CLASS собственно PageFrame, а потом другим DEFINE CLASS добавлять уже готовый класс в класс формы.

Для таких объектов как PageFrame и Grid все осложняется тем, что у них добавление объектов Page и Column осуществляется не командами ADD OBJECT, а простым указанием количества этих объектов.

До некоторой степени проблему можно решить используя свойства MemberClass и MemberClassLibrary. Но здесь проблема в том, что через эти свойства можно указать только один класс общий для всех добавляемых членов.

Вот работающий код. Дальше можешь украсить по вкусу

Код: 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.
PUBLIC ofrm
ofrm=NEWOBJECT("form1")
ofrm.Show
RETURN


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

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('cboStud','combo1')
      THIS.Page1.cboStud.Visible = .T.
ENDPROC

ENDDEFINE

DEFINE CLASS combo1 AS combobox
		ColumnCount =  2 
		ColumnWidths = "150,150"
		Height =  25 
		Left =  11 
		Style =  2 
		Top =  32 
		Width =  350 
		Name = "Combo1"
ENDDEFINE

Чтобы не писать кучу команд AddObject для каждой Page можно сделать для каждой страницы описание объекта-контейнера. И через AddObject() добавлять нужный контейнер со всеми объектами.
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33667127
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ criptonПонятно, что сделанные вручную формы - нормальные формы, но хотелось бы грамотно формировать формы программным способом -любой сложности и по возможности простым способом.
Вы уж выберите что-то одно: либо "любой сложности", либо "простым способом". Сложную форму простым способом сделать в принципе невозможно. Не важно каким инструментом и в каком языке программирования.
.

Согласен формулировка подкачала :-) Сам других ругаю за такие формулировки, а вот сделал перл... Имелось ввиду, конечно, не любой сложности, а проектирование форм содержащие другие контейнеры такие как grid и frame.

Спасибо за код программы, становится более понятно как действовать. Каюсь фокс знаю очень плохо (в смысле концепции). Ничто не мешает, конечно, изучить сначала, но как всегда надеешься на аналогию с другими система и попадаешь впросак.

ВладимирМ
Чтобы не писать кучу команд AddObject для каждой Page можно сделать для каждой страницы описание объекта-контейнера. И через AddObject() добавлять нужный контейнер со всеми объектами.
А нельзя примерчик опубликовать, неочень доходит как это делать. заранее спасибо
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33667373
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cripton
ВладимирМ
Чтобы не писать кучу команд AddObject для каждой Page можно сделать для каждой страницы описание объекта-контейнера. И через AddObject() добавлять нужный контейнер со всеми объектами.
А нельзя примерчик опубликовать, неочень доходит как это делать. заранее спасибо
Я имел в виду сделать DEFINE CLASS на основе базового класса CONTAINER. Накидать в этот контейнер нужные объекты через ADD OBJECT, а в событии INIT для PageFrame делать AddObject() нужного класса CONATINER.

Т.е. получается внутри страницы вставлен только один объект-контейнер (CONTAINER), а уже в нем все остальные объекты.
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33667701
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ cripton
ВладимирМ
Чтобы не писать кучу команд AddObject для каждой Page можно сделать для каждой страницы описание объекта-контейнера. И через AddObject() добавлять нужный контейнер со всеми объектами.
А нельзя примерчик опубликовать, неочень доходит как это делать. заранее спасибо
Я имел в виду сделать DEFINE CLASS на основе базового класса CONTAINER. Накидать в этот контейнер нужные объекты через ADD OBJECT, а в событии INIT для PageFrame делать AddObject() нужного класса CONATINER.

Т.е. получается внутри страницы вставлен только один объект-контейнер (CONTAINER), а уже в нем все остальные объекты.

Да понял.
Делаем скажем два класса на базе CONTAINER включаем в него объект COMBOBOX и 2 TEXTBOX. Определяем процедуру INIT и CLICK для COMBOBOX в рамках данного контейнера.

Далее уже формируем основную форму с объектом на базе PAGEFRAME, для которого в процедуре INIT создаем объект, ранее определенный как контейнер.

Кажется все ясно и разумно. Спасибо
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33667818
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробывал сделать задачу с контейнером.
Однако не пошло. При компиляции кода выдает ошибку при определении класса mypage на первой строке добавления объекта - типа неизвестная команда

код здесь:
Код: 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.
PUBLIC ofrm
ofrm=NEWOBJECT("form1")
ofrm.Show
RETURN


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

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('mypage1','mypage1')
      THIS.Page2.AddObject('mypage2','mypage2')
      ENDPROC
ENDDEFINE

DEFINE CLASS mypage1 as Container 
	
	[color=red]ADD OBJECT combo1 as combobox WITH [/color]
* типа ошибка синтаксиса	
			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.page1.text1.value=this.ListItem(a, 1 )
	  thisform.pageframe1.page1.text2.value=this.ListItem(a, 2 )
	ENDPROC	
ENDDEFINE

DEFINE CLASS mypage2 as Container
	
	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.page2.text1.value=this.ListItem(a, 1 )
	  thisform.pageframe1.page2.text2.value=this.ListItem(a, 2 )
	ENDPROC	
ENDDEFINE
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33668323
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом коде сразу несколько ошибок.

1) Перечитайте свой собственный пост в начале всей это ветки. Посмотрите синтаксис команды ADD OBJECT. Там он совершенно корректный. А в приведенном примере вы забыли точки с запятой и просто запятые.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DEFINE CLASS mypage2 as Container
	
	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.
...
ENDDEFINE

2) Когда объект создается через метод object.AddObject(), то, по умолчанию, он создается с настройкой Visible = .F. вне зависимости от того, что было прописано в классе. Т.е. делать новый объект видимым надо в любом случае

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DEFINE CLASS pageframe1 AS pageframe
...
PROCEDURE Init
      THIS.Page1.AddObject('mypage1','mypage1')
      THIS.Page1.mypage1.Visible = .T.
      THIS.Page2.AddObject('mypage2','mypage2')
      THIS.Page2.mypage2.Visible = .T.
ENDPROC

ENDDEFINE

3) Это уже не столь принципиально. Надо задать размеры объекта контейнера иначе по умолчанию он примет некоторые стандартные размеры. Если не ошибаюсь, что-то около 100х100

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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.
...
ENDDEFINE
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33668873
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь.
Не догадывался, что точка с запятой в данном случае строга обязательна...
...
Рейтинг: 0 / 0
Создание формы программным способом
    #33668907
cripton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла проблема создания исполняемого файла и отчуждения готового приложения.

Раньше я всегда в своих примерах делал примерно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
With _SCREEN 
  .Visible = .T.   
  .Width =  0           &&  640 
  .Height=  0            &&  480               
  .Top =  450 
  .Left =  360  
 EndWith 

READ events
DO FORM FORM1

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


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

В чем может быть проблема объяните не путевому. Пока сделано так....


Код: 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.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
ON SHUTDOWN do myexitproc

PUBLIC ofrm
ofrm=NEWOBJECT("form1")
ofrm.Show

With _SCREEN 
  .Visible = .F.   
  .Width =  0           &&  640 
  .Height=  0            &&  480               
  .Top =  450 
  .Left =  360  
 EndWith 

READ events

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

return

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

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('mypage1','mypage1')
      THIS.Page1.mypage1.Visible = .T.
      THIS.Page2.AddObject('mypage2','mypage2')
      THIS.Page2.mypage2.Visible = .T.
      ENDPROC
PROCEDURE queryunload
       DO myexitproc
       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.page1.mypage1.text1.value=this.ListItem(a, 1 )
	  thisform.pageframe1.page1.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.page2.mypage2.text1.value=this.ListItem(a, 1 )
	  thisform.pageframe1.page2.mypage2.text2.value=this.ListItem(a, 2 )
	ENDPROC	
ENDDEFINE
...
Рейтинг: 0 / 0
Создание формы программным способом
    #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
34 сообщений из 34, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создание формы программным способом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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