Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Доступность формы (WS_CHILD) внутри модальной формы, возможно? / 11 сообщений из 11, страница 1 из 1
30.01.2006, 14:06
    #33510880
Oxygene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Создаю модальную форму frmMain , далее немодальную frmChild встраиваю в первую командой:

Код: plaintext
1.
2.
3.
4.
5.
SHOW WINDOW (frmChild.Name) IN WINDOW (frmMain.Name)

либо 

DECLARE INTEGER SetParent IN User32.dll AS SetParent Integer, Integer
SetParent(frmChild.Hwnd, frmMain.HWnd)

frmChild и все контролы на ней становятся недоступными..
Можно ли сделать frmChild доступной, не меняя frmMain.WindowType на 0-modeless ??
...
Рейтинг: 0 / 0
30.01.2006, 19:33
    #33511881
Равиль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Привет, Oxygene - мне не удалось получить описанный Вами эффект "недоступности".
Возможно он у Вас проявляется после запуска модальной формы командой Do Form ...

Код: 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.
*  1 ) Вариант с Show In
m.frmChild = Createobject("frmChild")
m.frmMain = Createobject("frmMain", "Show In", m.frmChild)

Show Window (m.frmMain.Name) Top
Show Window (m.frmChild.Name) In Window (m.frmMain.Name)
Read Event
Wait Clear

*  2 ) Вариант с SetParent
Declare Integer SetParent In User32.Dll As SetParent Integer, Integer
m.frmChild = Createobject("frmChild")
m.frmMain = Createobject("frmMain","Show In", m.frmChild)

Show Window (m.frmChild.Name)
Show Window (m.frmMain.Name) Top
SetParent(m.frmChild.HWnd, m.frmMain.HWnd)
Read Event
Wait Clear


Define Class frmMain As Form

	Width =  400 
	Height =  200 
	WindowType =  1  && модальная
	oChild = .Null. && ссылка на дочь

	Add Object Command1 As CommandButton With ;
		top =  10 ,;
		left =  10 ,;
		Width =  150 ,;
		Height =  30 ,;
		Caption = "Ну нажмите меня ..",;
		Visible = .T.

	Procedure Command1.Click()
		Wait Window ;
			"ThisForm.WindowType = "+Transform(Thisform.WindowType)+Chr( 13 )+ ;
			"ThisForm.oChild.Text1.Value = "+Transform(Thisform.oChild.Text1.Value)+Chr( 13 )+ ;
			"ThisForm.oChild.Text2.Value = "+Transform(Thisform.oChild.Text2.Value) ;
			Nowait Noclear

	Procedure Init
		Lparameters m.tcCaption, m.toChild
		This.Caption = "Мама - "+m.tcCaption
		This.oChild = m.toChild

	Procedure Destroy
		Clear Events

Enddefine


Define Class frmChild As Form

	Caption = "Дочь"
	Top =  50 
	Left =  10 
	Width =  300 
	Height =  100 
	WindowType =  0  && немодальная

	Add Object Text1 As TextBox With ;
		top =  10 ,;
		left =  10 ,;
		value = "111",;
		Visible = .T.

	Add Object Text2 As TextBox With ;
		top =  10 ,;
		Left = Thisform.Text1.Width +  20 ,;
		value = "222",;
		Visible = .T.

Enddefine
...
Рейтинг: 0 / 0
30.01.2006, 20:18
    #33511950
Равиль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
:)) Ну ладно, если первый трюк был основан на том, что Show Window Модальной формы, отображает ее как Немодальную, то вот второй эффект:
В этом случае получаем Модальную дочернюю из немодальной по определению :))

Код: 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.
m.frmMain = Createobject("frmMain")
m.frmMain.Show( 1 )

Define Class frmMain As Form

	Width =  400 
	Height =  200 
	WindowType =  1  && модальная по определению
	oChild = .Null. && ссылка на дочь

	Add Object Command1 As CommandButton With ;
		top =  10 ,;
		left =  10 ,;
		Width =  150 ,;
		Height =  30 ,;
		Caption = "Show In ..",;
		Visible = .T.

	Add Object Command2 As CommandButton With ;
		top =  10 ,;
		left = Thisform.Command1.Width +  20 ,;
		Width =  150 ,;
		Height =  30 ,;
		Caption = "Set Parent ..",;
		Visible = .T.

	Procedure Command1.Click()
		Thisform.oChild = Createobject("frmChild")
		Show Window (Thisform.oChild.Name) In Window (Thisform.Name)

	Procedure Command2.Click()
		Thisform.oChild = Createobject("frmChild")
		Declare Integer SetParent In User32.Dll As SetParent Integer, Integer
		Show Window (Thisform.oChild.Name)
		SetParent(Thisform.oChild.HWnd, Thisform.HWnd)

Enddefine


Define Class frmChild As Form

	Caption = "Дочь"
	Top =  50 
	Left =  10 
	Width =  300 
	Height =  100 
	WindowType =  0  && немодальная по определению

	Add Object Text1 As TextBox With ;
		top =  10 ,;
		left =  10 ,;
		value = "111",;
		Visible = .T.

	Add Object Text2 As TextBox With ;
		top =  10 ,;
		Left = Thisform.Text1.Width +  20 ,;
		value = "222",;
		Visible = .T.

Enddefine
...
Рейтинг: 0 / 0
31.01.2006, 11:12
    #33512720
Oxygene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Привет Равиль, спасибо за ответ!

Прошу прощения, что забыл сразу указать что frmChild создается со свойствами:

Код: plaintext
1.
TitleBar =  0 
BorderStyle =  0 

Тогда она "встраивается" в frmMain (т.е. её контролы становятся частью frmMain), и естественно при движении frmMain двигается и frmChild .. Но, если frmMain запущена как модальная, то к контролы являющиеся частью frmChild недоступны!!! (Что не наблюдаеся например в Делфях, но там особая реализация метода Form.ShowModal() )
...
Рейтинг: 0 / 0
31.01.2006, 14:44
    #33513475
Равиль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
:) Привет, Oxygene. Свойства TitleBar = 0, BorderStyle = 0 не меняют ситуацию (в коллекции окон) - просто становятся недоступными кнопки заголовка дочернего окна. Ставим в него кнопку закрытия и все.
Немного о другом - если форма встраивается в модальную форму, то и она (в фоксе во всяком случае) "наследует модальность", чтобы не разрушать цепочку вызовов.
Можно конечно программно активировать одну модальную форму из другой, но последствия этого не предсказуемы.
Может имеет смысл пересмотреть интерфейс :)
Кстати в этом случае поведение вызовов Show .. In .. и Set Parent .. отличаются:
Код: 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.
With Createobject("frmMain")
	.Show( 1 )
Endwith

Define Class frmMain As Form
	Caption = "Мама"
	Width =  400 
	Height =  200 
	oChild = .Null. && ссылка на дочь

	Add Object Command1 As CommandButton With ;
		top =  10 ,;
		left =  10 ,;
		Width =  150 ,;
		Height =  30 ,;
		Caption = "Show In ..",;
		Visible = .T.

	Add Object Command2 As CommandButton With ;
		top =  10 ,;
		left = Thisform.Command1.Width +  20 ,;
		Width =  150 ,;
		Height =  30 ,;
		Caption = "Set Parent ..",;
		Visible = .T.

	Procedure Command1.Click()
		If Type("Thisform.oChild")="O" And !Isnull(Thisform.oChild)
			Activate Window (Thisform.oChild.Name)
		Else
			Thisform.oChild = Createobject("frmChild", Thisform)
			Show Window (Thisform.oChild.Name) In Window (Thisform.Name)
		Endif

	Procedure Command2.Click()
		If Type("Thisform.oChild")="O" And !Isnull(Thisform.oChild)
			Activate Window (Thisform.oChild.Name)
		Else
		Thisform.oChild = Createobject("frmChild", Thisform)
		Show Window (Thisform.oChild.Name)
		Declare Integer SetParent In User32.Dll As SetParent Integer, Integer
		SetParent(Thisform.oChild.HWnd, Thisform.HWnd)
		ENDIF 

Enddefine


Define Class frmChild As Form
	*****************************

	oParent = .Null. && ссылка на маму
	Caption = "Дочь"
	Top =  60 
	Left =  10 
	Width =  350 
	Height =  100 

	TitleBar =  0 
	BorderStyle =  0 

	Add Object Text1 As TextBox With ;
		top =  10 ,;
		left =  10 ,;
		value = "111",;
		Visible = .T.

	Add Object Text2 As TextBox With ;
		top =  10 ,;
		Left = Thisform.Text1.Width +  20 ,;
		value = "222",;
		Visible = .T.

	** Для закрытия дочерней формы
	Add Object Command1 As CommandButton With ;
		top =  50 ,;
		left =  10 ,;
		Width =  150 ,;
		Height =  30 ,;
		Caption = "Закрой меня ..",;
		Visible = .T.

	** Для активации материнской формы
	Add Object Command2 As CommandButton With ;
		top =  50 ,;
		left =  180 ,;
		Width =  150 ,;
		Height =  30 ,;
		Caption = "Ой, мамочки ..",;
		Visible = .T.

	Procedure Command1.Click()
		Thisform.Release

	Procedure Command2.Click()
		Activate Window (Thisform.oParent.Name)

	Procedure Init
		Lparameters m.toParent
		Thisform.oParent = m.toParent

Enddefine
...
Рейтинг: 0 / 0
01.02.2006, 02:55
    #33514820
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Hi Oxygene!

В фоксе модальность реализуется не как в других средах - не как взаимное
отношение "вызвавшей" формы и "вызванной", а как общее состояние всей среды
исполнения - если была запущена хоть одна модальная форма, то вся среда
будет находится в "модальном" состоянии - до тех пор пока эта модальная
форма не будет закрыта или скрыта. Единственное заметное исключение из
правила модальности - это формсет - в нём можно переключаться между формами,
тем не менее оставаясь в общем модальном состоянии. Это одна из причин,
почему в фоксе стоит как можно сильнее избегать "встроенной" модальности -
при необходимости организуя свою, "ограниченную" модальность (например
блокируя форму-родитель до тех пор пока не закрыта вызванная из неё дочерняя
форма).

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
01.02.2006, 13:59
    #33516003
Oxygene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Привет, Игорь!

Igor Korolyov Единственное заметное исключение из
правила модальности - это формсет - в нём можно переключаться между формами,
тем не менее оставаясь в общем модальном состоянии.

У меня не получается переключаться между формами модального формсета,
если он запущен из под top-level форм.. Отчего так?

Мне просто нужен контейнер со скролбаром..
...
Рейтинг: 0 / 0
02.02.2006, 01:45
    #33517725
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Hi Oxygene!

> У меня не получается переключаться между формами модального формсета,
> если он запущен из под top-level форм.. Отчего так?

Бог его знает - формсет вообще жуткая вещь, я его никогда не использовал и
не собираюсь :)

> Мне просто нужен контейнер со скролбаром..

Есть не очень быстрый (в плане прокрутки почему-то он заметно медленнее чем
прокручиваемая форма), но вполне надёжный вариант без "внедрения" форм друг
в друга.

cntScrollableContainer
--cntViewPort
----cntInner
--scrHorizontal
--scrVertical

Т.е. это система контейнеров. Скроллеры (в принципе пойдёт и MS Flat
Scrollbar Control) "передвигают" cntInner внутри cntViewPort - так чтобы
была видима соответствующая его часть (он сам "большой" - на полный размер
прокручиваемой области).
Если лень самому рисовать (хотя это работы на час-два, даже если весьма
основательно подойти к набору свойств и методов такого класса), то поищи на
UT или на foxclub.ru - где-то были уже готовые классы, работающие по этому
принципу.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
02.02.2006, 13:23
    #33518795
Oxygene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Cпасибо мужики за помощь!!

Нашел я ScrollableContainer:

http://www.arg.kirov.ru/downloads/files/ScrollableContainer.zip

Скорей всего его и буду использовать.
Он действительно не так сложно устроен! Как сказал Игорь, - почти все на основе контейнеров, один из которых двигается внутри Parent процедурой Move..
...
Рейтинг: 0 / 0
03.02.2006, 02:58
    #33520650
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Hi Oxygene!

Ну да, правда иногда особые "борцы за чистоту подхода" отказываются от
ActiveX-ного скроллбара, рисуя свой собственный - тогда всё становится
заметно сложнее (ползунок не так прост как кажется на первый взгляд!).
Ну и из серьёзных недостатков - работа с ActiveX контролами "внутри" этого
прокручиваемого контейнера - увы, до сих пор коряво работает фокс с ними - в
частности ActiveX-ы "вылазят" за пределы заданного нами ViewPort
контейнера - т.е. тот их кусок что находится в "невидимой" части Inner
контейнера тем не менее на форме видим - оно конечно понятно почему
(контейнеры то в фоксе не окна, а ActiveX в реальном Win окне живёт), и даже
примерно понятно как бороться (через АПИ конечно), но всё-же неприятно :(

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
03.02.2006, 10:46
    #33521142
Oxygene
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступность формы (WS_CHILD) внутри модальной формы, возможно?
Привет, Игорь!

Ты прав, у меня некоторые ActiveX'ы вообще становятся невидимыми (при запуске формы) если лежат в фоксовом контейнере.. Причем даже в виде OleControl! А FlatScrollBar - наоборот, виден там где его не просят! ((
Да, в этом смысле форма как контейнер ведет себя более адекватно!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Доступность формы (WS_CHILD) внутри модальной формы, возможно? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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