Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запуск формы из модальной формы / 8 сообщений из 8, страница 1 из 1
29.03.2007, 10:04
    #34423582
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск формы из модальной формы
Доброго времени суток.
Есть у меня контрол с активиксовским MonthView,
сам MonthView при вызове отображается в вновь создаваемой формочке.
после выбора пользователем даты или по lost focus формочка закрывется
все работает нормально.
но когда контрол находится на модальной форме, после отображения
формочки с MonthView, событие lost focus не происходит.
как мне отловить то что пользователь пытается уйти с формы с MonthView?
...
Рейтинг: 0 / 0
29.03.2007, 10:13
    #34423611
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск формы из модальной формы
пример нарисуйте

биндивент поможет
BINDEVENT(hWnd | 0, nMessage, oEventHandler, cDelegate [, nFlags])
...
Рейтинг: 0 / 0
29.03.2007, 11:46
    #34424029
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск формы из модальной формы
пример:
Код: 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.
nlIsProblem =  0  && переключатель 
                                 &&   0 - как должно бы работать
				&&  1  - работает неверно

*** собственно пример ************************************************************************
m.frmMain = Createobject("frmMain")

IF nlIsProblem =  0 
	m.frmMain.SHOW() && так работает как надо
ELSE 
	m.frmMain.SHOW( 1 )&& модальная - так  работает неправильно
	*!*  т.е. при щелчке по другому обьекту форма не пропадает
ENDIF 

*!*	Read Event
*!*	Wait Clear

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 = "Пуск ! :-)",;
		Visible = .T.
	
	Add Object LblDate As Label With ;
		top =  40 ,;
		left =  40 ,;
		Width =  200 ,;
		Height =  16 ,;
		Caption = "",;
		Visible = .T.
	
	Procedure Command1.Click()
		thisform.oChild = CREATEOBJECT("frmChild")
		thisform.oChild.OMASTER = THISFORM
		thisform.oChild.VISIBLE = .t.
		
	PROCEDURE ChildLostFocus
		thisform.oChild = .null.

	PROCEDURE EndUserChoise
		LPARAMETERS dldate
		this.LblDate.caption = TRANSFORM(dldate)
		thisform.oChild = .null.
		
	Procedure Destroy
		Clear Events

Enddefine

Define Class frmChild As Form

	Caption = "Дочь"
	Top =  50 
	Left =  10 
	Width =  155 
	Height =  154 
	TitleBar =  0 
	OMASTER = .NULL.
	
	Add Object MonthView As csMonthView  With ;
		top =  0 ,;
		left =  0 ,;
		Width =  155 ,;
		Height =  154 ,;
		Visible = .T.
		
	PROCEDURE lostFocus
		this.omaster.ChildLostFocus()

ENDDEFINE

DEFINE CLASS  csMonthView as olecontrol 
   OleClass = "MSComCtl2.MonthView.2"  
   
   PROCEDURE dateclick
   LPARAMETERS dateclicked
		IF VARTYPE(thisform.omaster)="O"
			thisform.omaster.EndUserChoise(dateclicked)
		ENDIF 
ENDDEFINE 
...
Рейтинг: 0 / 0
29.03.2007, 12:27
    #34424257
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск формы из модальной формы
Проблема в том, что любая форма вызванная из модальной формы автоматически становится модальной. А модальная форма просто не может потерять фокус. Нажатие мышки вне формы игнорируется.

Думаю, проще обработать нажатие клавиши Escape и по ней закрывать форму. Поскольку вся форма занята одним объектом, то отлавливать нажатие клавиши надо именно в этом объекте

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DEFINE CLASS  csMonthView as olecontrol 
	OleClass = "MSComCtl2.MonthView.2"  
   
	PROCEDURE dateclick
	LPARAMETERS dateclicked
	IF VARTYPE(thisform.omaster)="O"
		thisform.omaster.EndUserChoise(dateclicked)
	ENDIF 

	Procedure KeyUp
	*** ActiveX Control Event ***
	LPARAMETERS keycode, shift
	If keycode= 27   && нажали клавишу Esc
		ThisForm.release()
	endif

ENDDEFINE
...
Рейтинг: 0 / 0
29.03.2007, 14:48
    #34424809
alex11100
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск формы из модальной формы
сейчас подергал

отследить то, что нажали мышь вне мод.формы
можно только с пом

on key label mouse ...

попробуйте от этого поплясать
...
Рейтинг: 0 / 0
30.03.2007, 09:35
    #34426457
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск формы из модальной формы
добавил на форму таймер и в нем ловлю mdown() вроде работает,
с "on key label mouse ..." ниче не получается.


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

nlIsProblem =  1  && переключатель  0 - с немодальной формой
				&&  1  - с модальной формой


*** собственно пример ************************************************************************
IF nlIsProblem =  0 
	m.frmMain.SHOW() && так работает как надо
ELSE 
	m.frmMain.SHOW( 1 )&& модальная - так  работает неправильно
	*!*  т.е. при щелчке по другому обьекту форма не пропадает
ENDIF 

Read Event
*!*	Wait Clear

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 = "Пуск ! :-)",;
		Visible = .T.
	
	Add Object LblDate As Label With ;
		top =  40 ,;
		left =  40 ,;
		Width =  200 ,;
		Height =  16 ,;
		Caption = "",;
		Visible = .T.
	
	Procedure Command1.Click()
		thisform.oChild = CREATEOBJECT("frmChild")
		thisform.oChild.OMASTER = THISFORM
		thisform.oChild.VISIBLE = .t.
		
	PROCEDURE ChildLostFocus
		thisform.oChild = .null.

	PROCEDURE EndUserChoise
		LPARAMETERS dldate
		this.LblDate.caption = TRANSFORM(dldate)
		thisform.oChild = .null.
		
	Procedure Destroy
		Clear Events

Enddefine

Define Class frmChild As Form

	Caption = "Дочь"
	Top =  50 
	Left =  10 
	Width =  155 
	Height =  154 
	*TitleBar =  0 
	OMASTER = .NULL.
	bIsClick = .T.
	
	Add Object MonthView As csMonthView  With ;
		top =  0 ,;
		left =  0 ,;
		Width =  155 ,;
		Height =  154 ,;
		Visible = .T.
		
	Add Object Timer1 As timer  With ;
		top =  20 ,;
		left =  20 ,;
		Enabled = .F.,;
		Interval =  10 
		
	PROCEDURE Activate 
		thisform.bIsClick = .T.
		thisform.Timer1.Enabled = .T. 
		
	PROCEDURE Timer1.timer
		IF MDOWN() 
			IF thisform.bIsClick
				nlX=MCOL(thisform.Name, 3  )
				nlY=MRow(thisform.Name, 3  )
				thisform.bIsClick = .F.
				*SET STEP ON 
				IF ! (BETWEEN(nlX, 0 ,thisform.Width) AND  BETWEEN(nlY, 0 ,thisform.Height) )
					thisform.LostFocus() 
				ENDIF 
			ENDIF 
		ELSE 
			thisform.bIsClick = .T.
		ENDIF 

		DOEVENTS 
		
		
	PROCEDURE lostFocus
		this.omaster.ChildLostFocus()

ENDDEFINE


DEFINE CLASS  csMonthView as olecontrol 
   OleClass = "MSComCtl2.MonthView.2"  
   
   PROCEDURE dateclick
   LPARAMETERS dateclicked
		IF VARTYPE(thisform.omaster)="O"
			thisform.omaster.EndUserChoise(dateclicked)
		ENDIF 
ENDDEFINE 
...
Рейтинг: 0 / 0
30.03.2007, 10:53
    #34426739
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск формы из модальной формы
Идея взята отсюда

http://forum.foxclub.ru/read.php?5,36272,36317,sv=2#msg-36317

Я только слегка адаптировал под твой код. Только класс дочерней формы

Код: 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.
Define Class frmChild As Form

	Caption = "Дочь"
	Top =  50 
	Left =  10 
	Width =  155 
	Height =  154 
	TitleBar =  0 
	OMASTER = .NULL.
	
	Add Object MonthView As csMonthView  With ;
		top =  0 ,;
		left =  0 ,;
		Width =  155 ,;
		Height =  154 ,;
		Visible = .T.

	Procedure Init
	on key labe mouse _SCREEN.ActiveForm.OnMouse() 

	Procedure onMouse
	Local loUnderMouse 
	loUnderMouse = sys( 1270 ) 
	if type('loUnderMouse')=='O' and lower(ThisForm.Name)$lower(sys( 1272 ,loUnderMouse)) 
	else 
		ThisForm.lostFocus() 
	endif
		
	PROCEDURE lostFocus
		this.omaster.ChildLostFocus()
	
	Procedure Destroy
	On Key Label mouse
	
ENDDEFINE
...
Рейтинг: 0 / 0
30.03.2007, 12:27
    #34427107
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск формы из модальной формы
ВладимирМИдея взята отсюда

http://forum.foxclub.ru/read.php?5,36272,36317,sv=2#msg-36317

Я только слегка адаптировал под твой код. Только класс дочерней формы


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

вариант с
ShowWindow = 2 - As Top-Level Form
ShowInTaskBar = .F. - False

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


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