:: Visual Foxpro, Foxpro for DOS
Модальность формы
ВладимирС
Автор

Сообщений: 1693
Дата регистрации: 03.11.2005
У меня такая ситуация:
запускается приложение, в нем запускается справочник, форма немодальная. Затем вызывается модальная форма (добавления/редактирования) в справочник записи. Все вроде логично. Но эта форма (добавления/редактирования) содержит элементы, которые использует класс формы. Этот элемент открывает новую форму и хотелось эту форму спрятать. Т.е. если мимо формы кликаем (потеря фокуса), то свойство Visible = .F.. Но формочка не прячется и все виснет из-за того что родительская форма (добавления/редактирования) является модальной. Если форму (добавления/редактирования) сделать немодальной, то все работает. Но ее надо делать модальной по логике.
Что-то идеология программирования у меня неправильная. Дайте советы.
Ratings: 0 negative/0 positive
Re: Модальность формы
rhs72

Сообщений: 1934
Откуда: Алматы - Чарджоу
Дата регистрации: 21.03.2007
Попробуйте :
Thisform.hide
do form Child_form
thisform.show


------------------
"Знание того, что считать ответом, равносильно знанию ответа".
Ratings: 0 negative/0 positive
Re: Модальность формы
ВладимирС
Автор

Сообщений: 1693
Дата регистрации: 03.11.2005
Пока решил так:
Форму (добавления/редактирования) делаю немодальной. Но в коде, где она вызывается прописал:
IF ISNULL(add_edit_kart)
DO FORM add_edit_kart NAME add_edit_kart
ENDIF
Ratings: 0 negative/0 positive
Re: Модальность формы
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Цитата:
надо делать модальной по логике
Если некуда деться, то можно использовать такой прием для немодальной формы - при потере фокуса форма автоматически закрывается. Также можно использовать NAME LINKED.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено 3 раз(а). Последнее : Влад Колосов, 02.08.07 13:20
Ratings: 0 negative/0 positive
Re: Модальность формы
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
ВладимирС
Пока решил так:
Форму (добавления/редактирования) делаю немодальной. Но в коде, где она вызывается прописал:
IF ISNULL(add_edit_kart)
DO FORM add_edit_kart NAME add_edit_kart
ENDIF

Владимир, создаётся впечатление, что ты пытаешься нарисовать приложение без goApp - главного класса-менеджера приложения, который в частности и объекты создаёт, и полученные ссылки хранит/удаляет и много ещё чего...

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


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: Модальность формы
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Модальностью можно вполне рулить в Init'e формы
lparameter m.app
with this
if vartype(m.app)='O'
.app=m.app
if .app.modal
.windowtype=1
endif
endif
endwith


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Модальность формы
sphinx

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
> а начинай рисовать своё приложение "как надо"
Михаил, поясните, пожалуйста, "как надо" рисовать свое приложение?
На сайте Алексея Климова описана технология построения клиент-серверного приложения? Как-то так или у Вас своя идеология?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Модальность формы
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Проблема в том, что любая форма вызванная из модальной автоматически становится модальной. А модальная форма "не отпускает" от себя никого. Как следствие, мимо модальной формы кликнуть просто невозможно!

Где-то здесь недавно было обсуждение, как закрыть модальную форму, когда кликнули мышкой вне ее.
Ratings: 0 negative/0 positive
Re: Модальность формы
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
sphinx
Михаил, поясните, пожалуйста, "как надо" рисовать свое приложение?
На сайте Алексея Климова описана технология построения клиент-серверного приложения? Как-то так или у Вас своя идеология?

Достоточно сложный вопрос... отвечая на который, пожалуй можно написать толстенную книгу... ;) Но, какова бы не была архитектура приложения (файл/серверная, клиент/серверная, трёх/(много/)слойная) приложение обычно имеет интерфейс пользователя к данных (UI) так вот, я пытался сказать об организации только последнего...

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

- приложения, создаваемые через Tools/Wizards/Application... (с использование библиотеки классов /FFC/*.*|Wizards/*.*, а также серия шаблонов в /Wizards/Template/*.* для этого типа приложений)
- общеивестное (но к сожалению переставшее входить в поставку VFP 8.0 и выше) приложение TasTrade (исходники для поставки с VFP 7.0 есть на http://vfpdev.narod.ru/util_r.html - tastrade.zip [17.01.2005] (910KB) - код примера tastrade из поставки VFP 7.0)

эти приложения с файл-серверной архитектурой (хотя есть некоторые зачатки клиент/сервера в виде использования ХП) написаны несколько по-разному, но и в том и в другом случае класс-приложения (экземпляр в глобальной переменной goApp) организует работу всего приложения, в т.ч. goApp.DoForm() где через параметры указывает
- что/как будет запущено
- ссылка на полученный экземпляр будет сохранена в массив/коллекцию для дальнейшего использования

Я не говорю, что "нужно использовать" именно "это", я утверждаю, что "для начала" вам нужно хотя бы знать "как это написано"... и в сообщении выше, я хотел оттенить именно "только этот смысл"...


------------------
С уважением,
Михаил Дроздов, Пермь, Россия




Исправлено 1 раз(а). Последнее : MichaelD, 02.08.07 15:49
Ratings: 0 negative/0 positive
Re: Модальность формы
shumik73

Сообщений: 515
Откуда: Алматы
Дата регистрации: 10.05.2006
Но эта форма (добавления/редактирования) содержит элементы, которые использует класс формы
Этот элемент открывает новую форму и хотелось эту форму спрятат

Как я понял тут трехслойный пирог
НЕМОДАЛ - МОДАЛ - НЕМОДАЛ
Конечно глюкать будет

Крутись как хочешь но, но все что нужно уложи в одну форму (добавления - редактирования)
или НЕМОДАЛ - МОДАЛ - МОДАЛ

Это всё ерунда. Я вот открываю журнал-немодальный развернутый на весь экран, а из него модальный диалог с списком отчетов. Выбираю нужный отчет и на просмотр в два столбца (как появилось в VFP9)
Наглядно крассиво - модно. Ан нет - как закрою окно просмотра - так журнал до минимальных размеров сворачивается
Такая фигня злит до безобразия - хоть опять к дедовскому просмотру возвращаяйся
А ничего поделать ни могу
Ratings: 0 negative/0 positive
Re: Модальность формы
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
А если это так:

shumik73
Как я понял тут трехслойный пирог
НЕМОДАЛ - МОДАЛ - НЕМОДАЛ
Конечно глюкать будет

то это называется: "найти себе приключения на ровном месте... на одно место"... ;)


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: Модальность формы
sphinx

Сообщений: 31184
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Михаил, спасибо за исчерпывающий ответ!


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Модальность формы
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
shumik73
как закрою окно просмотра - так журнал до минимальных размеров сворачивается

Э... а приложение как построено? Ну я имею ввиду
- на VFP-main window
- или As Top-Level Form?


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: Модальность формы
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
Как я уже писал когда-то: судя по некоторому поведению - модальной становится не форма, а весь интерфейс целиком. Отсюда и
Цитата:
любая форма вызванная из модальной автоматически становится модальной
Т.е. на самом деле она модальной не становится, иначе нельзя было бы потерять фокус формы. Модальность достигается "замораживаением" главного окна и неактивных окон. По идее, модальная форма не должна терять фокус ни при каких обстоятельствах.
Цитата:
закрою окно просмотра - так журнал до минимальных размеров сворачивается
Нельзя ли пример посмотреть?


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.
Ratings: 0 negative/0 positive
Re: Модальность формы
ВладимирС
Автор

Сообщений: 1693
Дата регистрации: 03.11.2005
MichaelD
Владимир, создаётся впечатление, что ты пытаешься нарисовать приложение без goApp - главного класса-менеджера приложения, который в частности и объекты создаёт, и полученные ссылки хранит/удаляет и много ещё чего...
Если я угадал, то перестань заниматься ерундой, а начинай рисовать своё приложение "как надо"... ну если ты не просто балуешься, конечно... ;)
Я взял решение IECombo «пример комбобокса по аналогии с Internet Explorer» (Готовского Дмитрия (aries)). Но он использует в нем Fox-овский стандартный компонент ListBox. Я заменил ListBox на TreeView ActiveX, плюс подкорректировал код (конечно его надо еще будет пооптимизировать, но это потом). И так получился компонент что-то типа ComboTreeView.
[attachment 4871 CombTreeView.PNG]
При активизации компонента создается окно с TreeView. Все вроде удовлетворило. Тестировал компонент кидая на немодальную форму, все хорошо. Но мне надо чтобы компонент работал на модальной форме. Т.к. в этой форме идет формирование информации для составления записи в журнал. Тыркался - мыркался и пришел к выводу, что буду использовать немодальную форму. Но тут я приобрел кучу других проблем. Поэтому и код при вызове формы в которой используется этот компонент:
IF ISNULL(add_edit_kart)
DO FORM add_edit_kart NAME add_edit_kart WITH 1 && 1 - добавить
ELSE
IF TYPE('add_edit_kart') = "O"
add_edit_kart.Show
ENDIF
ENDIF
Не знаю что и сказать. Хочется сделать некоторые выводы.
1. Отказаться от использования компонента TreeView. Использовать стандартные компоненты VFP. Но ведь хотелось как красивее.
2. Мучаться с этим.
3. ....
Может быть есть советы? М.б. у кого есть аналогичный компонент, но работает в модальной форме? Хотелось бы посмотреть.
Ratings: 0 negative/0 positive
Re: Модальность формы
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
ВладимирС
Но мне надо чтобы компонент работал на модальной форме

Любая ActiveX-компонента

- имееет/работает в своём окне
- таже ей нужно, чтобы "насос событий" работал исправно

оба этих момента противоречать модальности формы:

- не должна давать открывать новое окно
- все "события приложения", в т.ч. и в меню заморожены/остановлены

Обычно в таких случаях устраивают "псевдо-модальность", т.е. делают недоступными все окна, кроме активного, а по закрытию последнего снимают этот режим...

ВладимирС
... код при вызове формы в которой используется этот компонент...

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


------------------
С уважением,
Михаил Дроздов, Пермь, Россия




Исправлено 1 раз(а). Последнее : MichaelD, 03.08.07 10:38
Ratings: 0 negative/0 positive
Re: Модальность формы
shumik73

Сообщений: 515
Откуда: Алматы
Дата регистрации: 10.05.2006
В качестве главного окна использую "VFP-main window"
ни каких "As Top-Level Form" - глюкают, не помню даже по какой причине

Скриншот проги

[attachment 4873 111.jpg]

Первая форма - контрагентов (не модал)
Вторая форма - диалог печати со списком отчетов (модал)
При нажатии кнопки "печать" происходит выполнение кода:

local loPreview
DO ReportPreview.app with loPreview
loPreview.CurrentPage = 1 && start with page 1
loPreview.ToolbarIsVisible =.T. &&display the toolbar
loPreview.CanvasCount = 2 && display 2-up pages
loPreview.ZoomLevel = 4 && set zoom to 75%
loPreview.Caption = Name_Report
This.loListener = .NULL.
if vartype(This.loListener) = 'O'
This.loListener.OnPreviewClose()
endif vartype(This.loListener) = 'O'
This.loListener = CREATEOBJECT('_reportlistener')
This.loListener.OutputType = 3 &&1 or 3
This.loListener.ListenerType = 1
This.loListener.PreviewContainer = loPreview
REPORT FORM (Name_file) FOR &Tmp_range. OBJECT This.loListener NOCONSOLE PREVIEW IN SCREEN

Получаю свой отчет на просмотр

Всё бы ничего, но что дальше происходит меня не устраиват
1) Форма просмотра _reportlistener развернута на весь экран - MDIform=.T.
2) При её закрытии она как бы сворачивается и соответсвенно сворачивает все MDI-формы открытые на тот момент. Тоесть моя форма контрагентов тоже свернется
3)Форма просмотра исчезает, но мой родительский журнал оказывается уже свернут

Чтобы прекратить сворачивание родительского журнала иду на хитрость:
где Thisform-диалога печати, а Thisform.oparent. - журнал

Thisform.oparent.LockScreen=.T.
lnOldState=Thisform.oparent.WindowState
REPORT FORM (Name_file) FOR &Tmp_range. OBJECT This.loListener NOCONSOLE PREVIEW IN SCREEN
Thisform.oparent.WindowState=lnOldState
Thisform.oparent.LockScreen=.F.
Thisform.Show(1)

Моргает, но работает...но коряво
Ratings: 0 negative/0 positive
Re: Модальность формы
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
shumik73
Вторая форма - диалог печати со списком отчетов (модал)

Э... если я правильно понял, по вызову отчёта диалог закрывается...
если так, то
- не пробовал "вызов отчёта" повесить "на пункт меню/клавишу", в случае клавиши вызывать соотвествующий макрос...
- по кнопке [Ok] взводить флаг (в goApp), типа: отчёт запустить, и запускать отчёт средствами goApp сразу после закрытия формы при наличии признака... ес-но перед открытием модальной формы флаг сбрасывать...


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: Модальность формы
ВладимирС
Автор

Сообщений: 1693
Дата регистрации: 03.11.2005
MichaelD
Как писал выше, меня насторожило "безалаберное" использование тобой public-переменной-ссылкой, которую ты в коде проверяешь на существование... Это косвенно указывает на то, что архитектура создаваемого тобой приложения "просто безобразна".... это если мягко сказать... Впрочем, дело твоё конечно... ;)
Я раньше всегда писал:
DO FORM add_edit_kart
А тут чего то не пошло, и чтобы быстро выкрутится ввел переменную. Нет конструкция приложения нормальная. Только из-за введенного класса много неправильно сделано. Сегодня уже предварительный показ ПО состоялся. Теперь надо медленно его проанализировать. Т.к. теперь есть время. Исправлять.
Буду задавать вопросы.
Ratings: 0 negative/0 positive
Re: Модальность формы
ВладимирС
Автор

Сообщений: 1693
Дата регистрации: 03.11.2005
MichaelD
Обычно в таких случаях устраивают "псевдо-модальность", т.е. делают недоступными все окна, кроме активного, а по закрытию последнего снимают этот режим...
Немного кода бы "псевдо-модальности".
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 (Гостей: 23)

© 2000-2024 Fox Club 
Яндекс.Метрика