powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по form и classes
9 сообщений из 9, страница 1 из 1
Вопрос по form и classes
    #35498303
ОТЭ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день.

Я создаю в биллиотеке классов форму, на основе созданной формы делаю еще две формы в другой биллиотеке. Из стартовой 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.
/// моя базовая форма (ничего не делает особого, просто на попробовать)
DEFINE CLASS mform AS form
	DoCreate = .T.
	Caption = "Form"
	Name = "mform"
ENDDEFINE

/// две мои другии формы на основе первой
*** Первая форма которая запускает вторую
DEFINE CLASS fmain AS mform

	DoCreate = .T.
	Caption = "Первая форма"
	Name = "fmain"

	ADD OBJECT mbutton1 AS mbutton WITH ;
		Top =  192 , ;
		Left =  36 , ;
		Caption = "2 form", ;
		Name = "Mbutton1"

	ADD OBJECT mbutton2 AS mbutton WITH ;
		Top =  192 , ;
		Left =  204 , ;
		Caption = "quit", ;
		Name = "Mbutton2"

	PROCEDURE mbutton1.Click
		MESSAGEBOX('Test')
		f2 = CREATEOBJECT('tform')
		f2.show()
	ENDPROC

	PROCEDURE mbutton2.Destroy
		CLEAR EVENTS 
	ENDPROC

	PROCEDURE mbutton2.Click
		thisform.Release 
	ENDPROC
ENDDEFINE

*** Вторая форма которая вызывается из первой.
DEFINE CLASS tform AS mform

	DoCreate = .T.
	Caption = "Вторая форма"
	Name = "tform"

	ADD OBJECT mbutton1 AS mbutton WITH ;
		Top =  168 , ;
		Left =  30 , ;
		Caption = "Тест", ;
		Name = "Mbutton1"

	ADD OBJECT mbutton2 AS mbutton WITH ;
		Top =  167 , ;
		Left =  230 , ;
		Caption = "Закрыть", ;
		Name = "Mbutton2"

	PROCEDURE mbutton1.Click
		MESSAGEBOX(Вторая форма, ок)
	ENDPROC

	PROCEDURE mbutton2.Click
		thisform.Release 
	ENDPROC

ENDDEFINE

код который запускает первую форму:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET PATH TO JUSTPATH(SYS( 16 ))
SET CLASSLIB TO myclass
SET CLASSLIB TO myapp ADDITIVE 

f1 = CREATEOBJECT('fmain')
f1.show

READ EVENTS

CLEAR EVENTS 

В итоге первая форма есть, но при нажатии кнопки " 2 Form" вторая форма не показывается. С классами не работал в фоксе никогда. если подкинете информацию что почитать по созданию проекта на классах буду признателен.

------------------------------------------------------------------
Незнание- тоже сила. От него происходит знание.
...
Рейтинг: 0 / 0
Вопрос по form и classes
    #35498599
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если загнать этот код в модуль program1.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.
* моя базовая форма (ничего не делает особого, просто на попробовать)
DEFINE CLASS mform AS form
	DoCreate = .T.
	Caption = "Form"
	Name = "mform"
ENDDEFINE

* две мои другии формы на основе первой
*** Первая форма которая запускает вторую
DEFINE CLASS fmain AS mform

	DoCreate = .T.
	Caption = "Первая форма"
	Name = "fmain"

	ADD OBJECT mbutton1 AS commandbutton WITH ;
		Top =  192 , ;
		Left =  36 , ;
		Caption = "2 form", ;
		Name = "Mbutton1"

	ADD OBJECT mbutton2 AS commandbutton WITH ;
		Top =  192 , ;
		Left =  204 , ;
		Caption = "quit", ;
		Name = "Mbutton2"

	PROCEDURE mbutton1.Click
		MESSAGEBOX('Test')
		f2 = CREATEOBJECT('tform')
		f2.show()
	ENDPROC

	PROCEDURE mbutton2.Destroy
		CLEAR EVENTS 
	ENDPROC

	PROCEDURE mbutton2.Click
		thisform.Release 
	ENDPROC
ENDDEFINE

*** Вторая форма которая вызывается из первой.
DEFINE CLASS tform AS mform

	DoCreate = .T.
	Caption = "Вторая форма"
	Name = "tform"

	ADD OBJECT mbutton1 AS commandbutton WITH ;
		Top =  168 , ;
		Left =  30 , ;
		Caption = "Тест", ;
		Name = "Mbutton1"

	ADD OBJECT mbutton2 AS commandbutton WITH ;
		Top =  167 , ;
		Left =  230 , ;
		Caption = "Закрыть", ;
		Name = "Mbutton2"

	PROCEDURE mbutton1.Click
		MESSAGEBOX('Вторая форма', 'ок')
	ENDPROC

	PROCEDURE mbutton2.Click
		thisform.Release 
	ENDPROC

ENDDEFINE


Запускаем так. В IDE все работает
Код: plaintext
1.
2.
set procedure to program1.prg
f1 = CREATEOBJECT('fmain')
f1.Show
...
Рейтинг: 0 / 0
Вопрос по form и classes
    #35498678
ОТЭ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to: Dag

я попробовал сделать как посоветовали, но у меня осталась таже проблемма, вторая форма умирает, может что в настройках у меня, не знаю.
Файл конфиг не использую (берется по умолчанию который наверно.) VSP 9 sp2













------------------------------------------------------------
Незнание- тоже сила. От него происходит знание.
...
Рейтинг: 0 / 0
Вопрос по form и classes
    #35498863
f2 объяви пабликом
или объект цепляй в какую-нить коллекцию

Код: plaintext
 что почитать по созданию проекта на классах буду признателен

ничего не найдешь особо,
читай здесь опытки рассказать про ООП -
затем можем пообщаться
...
Рейтинг: 0 / 0
Вопрос по form и classes
    #35499063
ОТЭ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to: 12345вышелзайчикпогулять

спасибо за f2 public (хотя не хочется делать так).
Жаль что нету статей как сделать проект на классах (> одной формы), на форуме читаю про ООП, но очень много воды.
Просьба, если кто нить видел/имеет проект из 3-6 форм на классах с простыми данными, то поделитесь линком (ODBC.zip и Nativ_second.zip я смотрел).

Извините за глупые вопросы возможно, но я пытаюсь научиться. )










-------------------------------------------------------------
Незнание- тоже сила. От него происходит знание.
...
Рейтинг: 0 / 0
Вопрос по form и classes
    #35499192
авторИзвините за глупые вопросы возможно, но я пытаюсь научиться. )

могу "на пальцах" объяснить,
но нужно общение
...
Рейтинг: 0 / 0
Вопрос по form и classes
    #35499196
смотреть в примерах
сам принцип взаим-я классов

это не способ конкретной реализации
...
Рейтинг: 0 / 0
Вопрос по form и classes
    #35499299
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда форма создается через команду DO FORM, то кроме переменной памяти, содержащей ссылку на создаваемую форму, ссылка на ту же форму записывается еще в специализированный массив _SCREEN.Forms и коллекцию _VFP.Forms().

Как следствие, когда переменная памяти со ссылкой на форму, созданную через DO FORM удаляется, сама форма остается, поскольку существуют еще 2 ссылки на нее.

При создании любого объекта через CreateObject() или NewObject() ссылка на вновь созданный объект записывается только и исключительно в ту переменную, в которую возвращается результат работы данных функций. Ни в какие дополнительные массивы и коллекции эта ссылка не записывается.

Как следствие, когда удаляется эта переменная, содержащая единственную ссылку на созданный объект, удаляется и сам объект.

Для справки: Если область видимости переменной не указана явно, командами LOCAL, PUBLIC или PRIVATE, то по умолчанию, переменная получает область видимости PRIVATE. А это означает, что данная переменная будет удалена по окончании того метода или процедуры где она была создана.

Следовательно, переменная, содержащая ссылку на форму, создаваемую через CreateObject() должна иметь область видимости PUBLIC. Но бесконтрольно плодить PUBLIC-переменные - это плохо.

Чтобы "взять под контроль" формы следует создать свой собственный аналог системной коллекции _VFP.Forms() или массива _SCREEN.Forms(). Т.е. создать один глобальный объект или массив, который и будет содержать внутри себя ссылки на все созданные формы. Ну, а форма, соответственно, должна иметь внутри себя ссылку на элемент этого глобального объекта.

Получим примерно следующее

Код: plaintext
1.
2.
3.
4.
PUBLIC goForms
goForms = CreateObject("Collection")
goForms.Add(CreateObject('Form'))
goForms.Item(goForms.Count).visible = .T.

В отношении коллекций форм удобно то, что закрытие формы автоматически удаляет ссылку на форму из коллекции. С другой стороны, наличие такой коллекции - удобный инструмент администрирования всех созданных форм.

Разумеется, коллекция форм создается один раз при запуске приложения. Где-то в главном стартовом файле приложения.

Правда, это только общая схема. На практике все несколько сложнее...
...
Рейтинг: 0 / 0
Вопрос по form и classes
    #35499679
ОТЭ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to: 12345вышелзайчикпогулять

я попробую сначала на пальцах посмотреть, как наберусь опыта то постараюсь перейти к общению )
спасибо за пример.

to: ВладимирМ

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






------------------------------------------------------------
Незнание- тоже сила. От него происходит знание.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по form и classes
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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