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

биндивент поможет
BINDEVENT(hWnd | 0, nMessage, oEventHandler, cDelegate [, nFlags])
...
Рейтинг: 0 / 0
Запуск формы из модальной формы
    #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
Запуск формы из модальной формы
    #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
Запуск формы из модальной формы
    #34424809
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сейчас подергал

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

on key label mouse ...

попробуйте от этого поплясать
...
Рейтинг: 0 / 0
Запуск формы из модальной формы
    #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
Запуск формы из модальной формы
    #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
Запуск формы из модальной формы
    #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
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запуск формы из модальной формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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