Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Псевдо MDI-окна и модальные окна  [new]
aleksandr-pro
Member

Откуда: Самара
Сообщений: 188
Док,

Нет перебора в коде вообще нет, каждая открытая форма дисаблит только своего родителя.
1 май 19, 20:56    [21876546]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60159
Ты делаешь это ("родителя") соотв. полем или передаешь параметром/ссылкой?

Posted via ActualForum NNTP Server 1.5

1 май 19, 21:40    [21876562]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
aleksandr-pro
Member

Откуда: Самара
Сообщений: 188
Гаджимурадов Рустам,

все просто берется либо указанная форма (ModalCaler), либо родитель, либо просто активная форма если родителя нет.
ссылка на форму родителя (modalform) сохраняется отдельно что бы по закрытии форму вернуть в исходное состояние.

function TForm.MyShowModal(const ModalCaler:TCustomForm=nil):integer;
var
 ActiveWindow: HWnd;
 p_WINDOW:Forms.TForm;
begin
  if Owner=nil then p_WINDOW:=Screen.ActiveForm else p_WINDOW:=Tform(owner);
  if ModalCaler<>nil then modalform:=ModalCaler else modalform:=TForm(p_WINDOW);
.......
2 май 19, 07:32    [21876659]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
Под винду все решается просто
+
procedure TfrmMain.ActShowModalWindowExecute(Sender: TObject);
var
  TmpFrm: TfrmModal;
begin
  if Assigned(TfrmTemplate(Sender).Parent)
  then
    begin
      TmpFrm:= TfrmModal.Create(TfrmTemplate(Sender).Owner);//TTabSheet
      try
        TmpFrm.ShowModal;
      finally
        FreeAndNil(TmpFrm);
      end;
    end
  else
    begin
      TmpFrm:= TfrmModal.Create(TfrmTemplate(Sender));//undocked TfrmTemplate
      try
        EnableWindow(TfrmTemplate(Sender).Handle,False);//uses LCLIntf;
        TmpFrm.Show;
        while (TmpFrm.FormLiveState = flsOpen) and not Application.Terminated do
        begin
          Application.ProcessMessages;
          Application.Idle(False);
        end;
      finally
        EnableWindow(TfrmTemplate(Sender).Handle,True);
        FreeAndNil(TmpFrm);
      end;
    end;
end;

На Дебе, увы, ниже лежащее окно не дизэйблится :(. Буду думать дальше ...

aleksandr-pro,
спасибо за подсказки.
4 май 19, 00:01    [21877569]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
aleksandr-pro,

я конвертировал твой проект под Лазарь. Под винду все работает просто изумительно
+
Картинка с другого сайта.
, под никсы - фиг (ниже лежащее окно не блокируется, а выше лежащее - Form3 можно вызвать только с одной из дочерних Form2, на другой Form2 создание формы в RT чем-то блокируется) - проверил на Убунте и Дебиане. Попробую на тамошнем форуме поднять тему (правда, сомневаюсь, что активно будут отвечать - народ че-та то ли уставший в последнее время, то ли перекормлен изменениями в коде IDE и активно правит баги).

Код приложил, кому интересно

К сообщению приложен файл (project1_unix.zip - 128Kb) cкачать
9 май 19, 01:13    [21881587]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
Док,

У тебя корректно под Виндой отрабатывает ситуация если открыть 2 Form3 и попытаться закрыть первую открытую Form3? У меня первая Form3 закрывается если закрыть вторую открытую Form3.
9 май 19, 13:02    [21881690]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
Saller
Док,

У тебя корректно под Виндой отрабатывает ситуация если открыть 2 Form3 и попытаться закрыть первую открытую Form3?

Если я правильно тебя понял, то да. При этом у обеих Form3 должны разные owner'ы, т.е. обе должны быть модальными. Они даже закрываются без лишних вопросов, если закрыть их общего предка. Ты последний приложенный проект пробовал?
9 май 19, 18:56    [21881847]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
aleksandr-pro
Member

Откуда: Самара
Сообщений: 188
ДА все верно owner в этом случае имеет важное значение и если понаокрывать модальное - потом не модельное - и снова модальное то будет плохо, в общем если с умом то все работает
9 май 19, 19:49    [21881877]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
Док,

Последний твой проект не запускал, нет под рукой лазаря, запускал приложение, которое выкладывал Александр.
9 май 19, 23:04    [21881947]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
Док,

Выложи скомпилированный вариант, проверю твою рабочую версию.
9 май 19, 23:20    [21881950]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
Saller
Выложи скомпилированный вариант

project1.7z
10 май 19, 09:08    [21882021]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
Док,

Этот вариант тоже не работает как надо. Опишу порядок действий:
1. Открываем Form2
2. Открываем модальную Form3
3. Открываем Form2
4. Открываем модальную Form3
5. Пытаемся закрыть Form3 открытую в пункте 2
10 май 19, 09:38    [21882033]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
Saller
Этот вариант тоже не работает как надо.

значит, скорее всего. ты не понял, о чем идет речь в этом топике.
+ следи за руками
Картинка с другого сайта.

Основной посыл в том, что нельзя активировать owner'а, лежащего под модальным потомком, но можно активировать другие формы, не блокированные соответствующим модальным потомком. Исключение - системные диалоговые окна.
10 май 19, 11:50    [21882076]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
Док
Основной посыл в том, что нельзя активировать owner'а, лежащего под модальным потомком, но можно активировать другие формы, не блокированные соответствующим модальным потомком. Исключение - системные диалоговые окна.
К этому функционалу не было никаких нареканий, единственное что нельзя закрыть формы как я описывал.
10 май 19, 12:42    [21882095]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
Saller
единственное что нельзя закрыть формы как я описывал.

вообще, стояла задача
Док
нельзя активировать owner'а, лежащего под модальным потомком, но можно активировать другие формы, не блокированные соответствующим модальным потомком.

если тебе нужен какой-то другой функционал - придется потрудиться самому :)
10 май 19, 13:53    [21882119]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60159
Док> Основной посыл в том, что нельзя активировать owner'а,
Док> лежащего под модальным потомком, но можно активировать другие
Док> формы, не блокированные соответствующим модальным потомком.


Ты, конечно, опять скажешь, что я вредничаю, но я таки поправлю:

1. Не owner'a, а "открывателя" - форму, которая вызвала ShowPseudoModal.
Owner-a может вообще не быть, или быть другой формой или Application.

2. "лежащего под модальным потомком" - размытая формулировка, лучше
"участвовавшие в цепочке вызовов" из п.1. При чём это вполне могут быть
разные экземпляры одной и той же формы, в т.ч. по несколько раз. И они
могут быть снова открыты из активной модальной формы по новой.

P.S. Конкретную реализацию я не смотрел ещё, описываю лишь механику.

Posted via ActualForum NNTP Server 1.5

10 май 19, 19:30    [21882218]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
Гаджимурадов Рустам
но я таки поправлю

в контексте данного кода owner и является "открывателем", потому и блокируется, что лежит "модальным потомком" :)

зы. Несмотря на богатство современного "рускаго" языка, во многих языковых конструкциях омонимы весьма путают общий смысл сказанного. Это особенно заметно в программировании, потому и появляются "овнеры", "чекбоксы", "комбобоксы" и проч.проч.
11 май 19, 13:20    [21882446]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60159
Док> в контексте данного кода owner и является "открывателем"

А, в смысле Owner - это не Delphi-шный Owner, а
некое доп.свойство/параметр, которое содержит
ссылку на форму-открывателя... Тогда OK, но всё
же лучше было бы другой "термин" подобрать -
Prior, Caller или хотя бы Ancestor.

Posted via ActualForum NNTP Server 1.5

11 май 19, 15:29    [21882492]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Gator
Member

Откуда: Москва
Сообщений: 14919
Гаджимурадов Рустам,

Тут, наверное, подойдёт Создатель/Creator или вообще Демиург/Demiurge - типа с ним ничего сделать нельзя, а он может всё.
11 май 19, 15:43    [21882500]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60159
Gator> Тут, наверное, подойдёт Создатель/Creator

Ни в коем случае. Во-первых, Creator ближе к Owner,
чем к открывателю. Во-вторых, Creator может быть
один (в т.ч. 1 раз), а Caller-ов/Sender-ов - много.

Posted via ActualForum NNTP Server 1.5

11 май 19, 16:14    [21882506]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
Подытоживая топик:

Под винду почти что сделал с единственным "но" (если хотя бы одно модальное окно открыто, то при попытке закрыть главное окно приложения получаю типичное для Лазаря невнятное "Project project1 raised exception class 'External: SIGSEGV'. At address 40D7A9"). Как временный воркэраунд запретил в OnCloseQuery закрываться, если хоть одно модальное окно живо. Код позаимствовал у aleksandr-pro (за что ему спасибо)

Под Линь, увы, не работает, как хотелось. Пока отказался.

Если есть желание ковыряться, приаттачил проект. Ограничения: фпц должен иметь исходный код rtl-generics, в v.3.0.4 его нет, но можно поставить самому

К сообщению приложен файл (project1.zip - 138Kb) cкачать
2 июн 19, 17:24    [21899857]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60159
Док> фпц должен иметь исходный код rtl-generics, в v.3.0.4 его нет

Его уже нет или ещё нет ?

Posted via ActualForum NNTP Server 1.5

2 июн 19, 20:18    [21899914]     Ответить | Цитировать Сообщить модератору
 Re: Псевдо MDI-окна и модальные окна  [new]
Док
Member

Откуда: Казань
Сообщений: 6352
Гаджимурадов Рустам
Док> фпц должен иметь исходный код rtl-generics, в v.3.0.4 его нет

Его уже нет или ещё нет ?

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

Я у себя в блоге на всякий случай оставил памятку, что и куда положить, если понадобятся. По моему, там даже пересобирать компилятор не надо - они и так подхватываются (в крайнем случае можно чуть подправить fpc.cfg, добавив вручную путь к папке с дженериками). Также можно просто указать пути к ним в Project Options, тоже должны подхватиться
2 июн 19, 22:08    [21899953]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить