Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Top-Level и модальные формы / 7 сообщений из 7, страница 1 из 1
20.08.2003, 16:58
    #32242191
Aijik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top-Level и модальные формы
Попереключайтесь на форму - обратно в среду - на форму
Top-Level форма перестает отвечать на действия юзера - замораживается. К тому же при клике на таскбаре она не всегда активизируется виндой. Но даже будучи активизированной, далее, при активации среды она перекрывает среду поверх, как будто она AlwaysOnTop.
Известно, что, любая форма, вызванная из модальной однозначно становится модальной. С другой стороны, Top-Level форма никогда не может быть модальной. Но, в любом случае, что за бредовые визуальные эффекты?

Код: 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.
oStartForm = CREATEOBJECT( "StartForm" )
oStartForm.Show( 1 )
 

DEFINE CLASS StartForm AS Form

    ADD OBJECT TopLevelCMD AS CommandButton WITH;
        Height =  40 ,;
        Top =  40 ,;
        Left =  50 

    PROCEDURE TopLevelCMD.Click()
        PUBLIC oTopLevelForm
        oTopLevelForm = CREATEOBJECT( "TopLevelForm" )
        oTopLevelForm.Show() 

ENDDEFINE


DEFINE CLASS TopLevelForm AS Form
    AutoCenter = .T.
    ShowWindow =  2 
    Height =  500 
    Width =  500 

ENDDEFINE
...
Рейтинг: 0 / 0
20.08.2003, 17:58
    #32242297
Равиль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top-Level и модальные формы
Aijik, это провакация :))

> Известно, что, любая форма, вызванная из модальной однозначно становится модальной.
Модальной по отношению к какой форме ? Если к IDE - согласен , но к вызвавшей форме она может быть и Modeless? - отсюда и глюк с "недоступностью", потому что управление вернулось к StartForm, a TopLevelForm "болтается" ничем не припертая.

Если соблюсти небольшие "правила приличия", то все работает как надо :)
(извиняюсь за отсутствие оформления - не умею :)

oStartForm = CREATEOBJECT("StartForm")
oStartForm.Show(1)
CLEAR ALL
CANCEL

DEFINE CLASS StartForm AS Form

ADD OBJECT TopLevelCMD AS CommandButton WITH;
Height = 40,;
Top = 40,;
Left = 50

PROCEDURE TopLevelCMD.Click()
PUBLIC oTopLevelForm
oTopLevelForm = CREATEOBJECT("TopLevelForm")
oTopLevelForm.Show()
READ EVENTS

ENDDEFINE


DEFINE CLASS TopLevelForm AS Form
AutoCenter = .T.
ShowWindow = 2
Height = 500
Width = 500

ADD OBJECT CloseTopForm AS CommandButton WITH;
Height = 40,;
Top = 40,;
Left = 50
PROCEDURE CloseTopForm.Click()
CLEAR EVENTS
ThisForm.Release

ENDDEFINE
...
Рейтинг: 0 / 0
21.08.2003, 09:37
    #32242630
Aijik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top-Level и модальные формы
Модальной по отношению к какой форме ? Если к IDE - согласен , но к вызвавшей форме она может быть и Modeless?

Не может, Равиль. Она автоматом также становится модальной, какой бы она не была описана при разработке. Пример обратного, плиз, если можно... Без топ-левел форм (с ними не стоит рассуждать о модальности - им чуждо это понятие).
Мой пример. Удалим в описании класса TopLevelForm строку ShowWindow = 2. Укажем даже для наглядности WindowType=0 и Show(2), хоть это и так по-дефолту. А теперь попробуйте при активной ModelessForm обратиться к StartForm. Фокс не даст этого сделать, т.к. oModelessForm стала модальной , хотя в классе была описана как немодальная и вызывалась как немодальная (Show(2)):

Код: 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.
oStartForm = CREATEOBJECT( "StartForm" )
oStartForm.Show( 1 )
 

DEFINE CLASS StartForm AS Form

    ADD OBJECT ModelessFormCMD AS CommandButton WITH;
        Height =  40 ,;
        Top =  40 ,;
        Left =  50 

    PROCEDURE ModelessFormCMD.Click()
        PUBLIC oModelessForm
        oModelessForm = CREATEOBJECT( "ModelessForm" )
        oModelessForm.Show( 2 ) 

ENDDEFINE


DEFINE CLASS ModelessForm AS Form
    AutoCenter = .T.
    WindowType =  0 
    Height =  500 
    Width =  500 

ENDDEFINE


Далее, по Вашему примеру. Вы ставите точку останова READ EVENTS, т.е. по-сути эмулируете модальность топ-левел формы. Но является ли "нормальным" такое использование READ EVENTS именно в данном конкретном случае (то, что это общая стратегия вызова "а-ля модальных" топ-левел форм - это понятно, я говорю про рассматриваемый случай с вызовом топ-левел формы из модальной)? По-идее всё хорошо, и среда работает, обрабатывает события, и топ-левел форма, юзер переключается туда-сюда безо всяких осложнеий. Идиллия :). Айда веселиться дальше... Попробуйте вернуться в IDE и закрыть StrartForm крестом... Опца... Не закрывается... Оно и понятно, форма не может закрыться, пока выполняется хотя бы один из его методов (метод TopLevelCMD.Click() до сих пор висит на READ EVENTS) Странная ситуация для идиллии, не правда ли? Поедем дальше, вернемся в топ-левел форму и нажмем CloseTopForm - вылетают обе. К тому же, а как вы этот выкрутас с READ EVENTS будете делать в реальном приложении в EXE, в котором уже запущен READ EVENTS? Любой последующий READ EVENTS будет проигнорирован. Так что этот финт уж вовсе неприменим "в реальных боевых условиях". И это вы называете "соблюдением правил приличия"? ;))
Т.е. это я все к тому, что нельзя READ EVENTS использовать для такого случая. И вообще, я спорить не собирался особо ;) ... Смысл ветки был в том, чтобы показать, что MS не разрулило эту ситуацию и возникают глюки. Надо явно было запретить вызов Top-Level из модальных форм (либо другой вариант защиты предусмотреть). Эта ситуация, кстати, явлется "близняшкой" обсуждавшейся некогда на Фоксклубе ситуации, когда из немодальной (ModelessForm) формы вызывается модальная (ModalForm), и затем, в одном из методов ModalForm выдается ModelessForm.Show(). В результате ModelessForm становится модальной и перекрывает ModalForm. Ситуация, которая по-идее не должна иметь места ни при каких обсоятельствах . Ошибка, дыра в защите Фокса, если хотите...

ЗЫ Код оформляется так: Вставьте его, выделите и нажмите кнопку Code под текстбоксом "Тема"
...
Рейтинг: 0 / 0
21.08.2003, 10:25
    #32242723
Равиль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top-Level и модальные формы
Aijik, Видимо MS не проработали эту ситуацию по причине того, что вызывать Top-Level из формы - не очень красиво в принципе, и надо ли? Это все-равно, что вызывать IDE из формы.
Обычно Top-Level материнская форма - главная форма приложения и при ее вызове IDE лучше спрятать.
Применение Read Events в моем примере - согласен не корректно, но соответствует поставленной задаче ;))

А Modeless формы из Top-Level можно вызывать так
(не претендуя на оптимальность и безупречность кода - только принцип):

Код: 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.
_screen.Visible=.f.
oStartForm = CREATEOBJECT( "StartTopForm" )
oStartForm.Show( 1 )
READ EVENTS 
CLEAR ALL 
_screen.Visible=.t.
CANCEL 

DEFINE CLASS StartTopForm AS Form

    AutoCenter = .T.
    ShowWindow =  2 
    Height =  500 
    Width =  700 

    ADD OBJECT CloseForm AS CommandButton WITH;
        Height =  40 ,;
        Top =  40 ,;
        Left =  500 

    ADD OBJECT Form1 AS CommandButton WITH;
        Height =  40 ,;
        Top =  40 ,;
        Left =  50 

    ADD OBJECT Form2 AS CommandButton WITH;
        Height =  40 ,;
        Top =  40 ,;
        Left =  250 

    PROCEDURE Form1.Click()
        PUBLIC oForm1
        oForm1 = CREATEOBJECT( "ModellessForm" )
	    oForm1.Left =  100 
        oForm1.Show()

    PROCEDURE Form2.Click()
        PUBLIC oForm2
        oForm2 = CREATEOBJECT( "ModellessForm" )
	    oForm2.Left =  300 
        oForm2.Show()

	    PROCEDURE CloseForm.Click()
	    CLEAR EVENTS 

ENDDEFINE


DEFINE CLASS ModellessForm AS Form

    ShowWindow =  1 
    Height =  200 
    Width =  200 

*!*	    ADD OBJECT CloseForm AS CommandButton WITH;
*!*	        Height =  40 ,;
*!*	        Top =  40 ,;
*!*	        Left =  50 
*!*	    PROCEDURE CloseForm.Click()
*!*		ThisForm.Release      

ENDDEFINE
...
Рейтинг: 0 / 0
21.08.2003, 10:35
    #32242738
Равиль
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top-Level и модальные формы
! Только не закрывай главную по [x] - эта ситуация не описана :)
нужен Clear events в Destroy формы - извини если все подвесил :))
...
Рейтинг: 0 / 0
21.08.2003, 10:45
    #32242758
Aijik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top-Level и модальные формы
MS не проработали эту ситуацию по причине того, что вызывать Top-Level из формы - не очень красиво в принципе, и надо ли?

Согласен, но мало ли какие могут быть причины для такого вызова... Факт ведь имеет место быть и глюки тоже. MS по-крайней мере должно было предупредить о нежелательности такого вызова в документации
По поводу примера... Ну да, все правильно. Никто не спорит. Причем и модально тоже можно их вызывать
...
Рейтинг: 0 / 0
21.08.2003, 10:47
    #32242760
Aijik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Top-Level и модальные формы
! Только не закрывай главную по [x] - эта ситуация не описана :)
нужен Clear events в Destroy формы - извини если все подвесил :))


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


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