Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Немодальное окно со свойствами модального. / 18 сообщений из 18, страница 1 из 1
16.12.2021, 18:08
    #40120740
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Hi All!!!

Не вброс в вентилятор, реальная проблема.

Как бы решить её поизящнее...

Суть в таком:
Есть MDI приложение (ВНИМАНИЕ, MDI)

Есть окно градусника (Пусть будет TProgressForm).
parent = nil.
Owner = фигня всякая разная. и NIL в т.ч.


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

...реализовано пока так:
окно не является дочкой MDI MainForm, и дизейблит эту MainForm.
Потом, вертают всё взад. Тут ОК.


Далее отключил fsStayOnTop... (а то они лезли поверх остальных приложений в системе)


Но прописал SetWindowPos(self.Handle, HWND_NOTOPMOST, 0, 0 ,0 ,0 , SWP_NOMOVE or SWP_NOSIZE, SWP_NOACTIVATE)

хм...
Что бы хотелось?
Чтобы они были-таки дочками MainWindow, но кроме самого верхнего из градусников - все были disabled

...Ну, в общем, аналог модальности, но без этого цикла внутри ShowModal, который блокирует выполнение ветки кода, его вызвавшей...
...
Рейтинг: 0 / 0
16.12.2021, 18:17
    #40120750
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Makar4ik, а что мешает при показе очередного градусника дизаблить предыдущий, если таковой имеется? Организуй из них стек и управляй enabled
...
Рейтинг: 0 / 0
16.12.2021, 18:21
    #40120753
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
white_nigger
Makar4ik, а что мешает при показе очередного градусника дизаблить предыдущий, если таковой имеется? Организуй из них стек и управляй enabled

Много мешает.
1. Если градусник - дочка MainWindow, то MainWindow нельзя. (а дочкой как раз хочется)
2. слово "поизящнее" в топике мешает.


почему хочется дочкой:
Вендор на D7 прислал библиотеки, а у клиентов - полный зоопарк, и окна устраивают чехарду по Z-order-у

Дочка MainWindow, хотя-бы в своей песочнице будет эту чехарду делать, а не глобально по всем окнам у клиента...



Вот и хочется, и градусник сделать дочкой, и MainWindow задизейблить, и дочку не задеть.
...
Рейтинг: 0 / 0
16.12.2021, 18:40
    #40120763
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Мысль понятна?

...не-дочка градусник - ведёт себя плохо.
...дочка-градусник - дизейблит и себя в том числе.
...
Рейтинг: 0 / 0
16.12.2021, 18:46
    #40120765
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Makar4ik
Мысль понятна?

...не-дочка градусник - ведёт себя плохо.
...дочка-градусник - дизейблит и себя в том числе.


..ну поэтому и хотел ИЗЯЩНЕЕ.

Пока так:
Все, кроме Я enabled - в список, и их disabled
При дестрое - взад.
...
Рейтинг: 0 / 0
16.12.2021, 18:49
    #40120768
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Makar4ik
Makar4ik
Мысль понятна?

...не-дочка градусник - ведёт себя плохо.
...дочка-градусник - дизейблит и себя в том числе.


..ну поэтому и хотел ИЗЯЩНЕЕ.

Пока так:
Все, кроме Я enabled - в список, и их disabled
При дестрое - взад.

...Получается лишний список...
...
Рейтинг: 0 / 0
16.12.2021, 18:58
    #40120774
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
...в общем, в MDI - нельзя MainForm делать disabled
А хочется.
...
Рейтинг: 0 / 0
16.12.2021, 19:23
    #40120779
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Makar4ik
...в общем, в MDI - нельзя MainForm делать disabled
А хочется.

Шлепни на всю майн форму форму панель под низ, и дизабли ее.

А вообще мое ощущение от твоей задачи:
...
Рейтинг: 0 / 0
16.12.2021, 19:54
    #40120794
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
rgreatШлепни на всю майн форму форму панель под низ, и дизабли ее.

На главную MDI форму вроде как невозможно что-либо шлёпнуть вообще. Дизаблятся
там только менюшка и тулбар.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.12.2021, 20:32
    #40120806
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Без MDI я писал стековую модальность. Т.е. есть набор родительских немодальных форм, от которых порождаются "модальные только для своего стека" дочерние. Можно было переключаться между пирамидками из окон
...
Рейтинг: 0 / 0
16.12.2021, 20:35
    #40120810
Michael Longneck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Тогда (D7) это работало. Сейчас - не знаю, и подводные камни наверняка есть

Код: pascal
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.
type
  TFormShowType = (fstAppModal, fstParentModal, fstNonModal);

  TParentModalHelper = class
  private
    ModalForm:TForm;
    FormCloseEvent:TCloseEvent;
    FModalState:Boolean;
    procedure FormClose(Sender:TObject;var Action:TCloseAction);
  public
    constructor CreateHelper(AForm:TForm);
    destructor Destroy; override;
    property  InModal:Boolean read FModalState;
 end;

//----------------------------------------------------------------------------------------------------------------------------------------------------
constructor TParentModalHelper.CreateHelper(AForm: TForm);
begin
  inherited Create;
  ModalForm := AForm;
  FormCloseEvent := ModalForm.OnClose;
  ModalForm.OnClose := FormClose;
  FModalState := True;
end;

//----------------------------------------------------------------------------------------------------------------------------------------------------
destructor TParentModalHelper.Destroy;
begin
  ModalForm.OnClose := FormCloseEvent;
  inherited;
end;

//----------------------------------------------------------------------------------------------------------------------------------------------------
procedure TParentModalHelper.FormClose(Sender:TObject; var Action:TCloseAction);
var
  Parent:TCustomForm;
begin
  if Assigned(FormCloseEvent) then FormCloseEvent(Sender,Action);
  FModalState := False;
  if Sender is TCustomForm then
  begin
    Parent := (Sender as TCustomForm).PopupParent;
    if Parent = nil then Exit;
    Parent.Enabled := True;
    Parent.SetFocus;
  end;
end;


//----------------------------------------------------------------------------------------------------------------------------------------------------
function ShowForm(AParent:TCustomForm;AForm:TCustomForm;ShowType:TFormShowType = fstParentModal):TModalResult;
var
  helper: TParentModalHelper;
begin
 Result := mrNone;

 case ShowType of
   fstAppModal:
   begin
     Result := AForm.ShowModal;
    end;

    fstParentModal:
    begin
      helper := nil;
      try
        AForm.PopupMode := pmExplicit;
        AForm.PopupParent := AParent;
        AParent.Enabled := False;
        AForm.Show;
        helper := TParentModalHelper.CreateHelper(TForm(AForm));
        Screen.FocusedForm := AForm;
        while helper.InModal do
        begin
          if Application.Terminated then
          begin
            AForm.Hide;
            Break;
          end;
          Application.HandleMessage;
        end;
      finally
        FreeAndNil(helper);
      end;
      Result := AForm.ModalResult;
    end;

    fstNonModal:
    begin
      AForm.PopupMode := pmNone;
      AForm.Show;
    end;

  end {case};

end;

...
Рейтинг: 0 / 0
16.12.2021, 20:55
    #40120816
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Makar4ik
Мало того, скрипты каскадно вызывают друг друга, и этих окон градусников на экране более 1-го

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

Makar4ik
Далее отключил fsStayOnTop... (а то они лезли поверх остальных приложений в системе)
Но прописал SetWindowPos(self.Handle, HWND_NOTOPMOST, 0, 0 ,0 ,0 , SWP_NOMOVE or SWP_NOSIZE, SWP_NOACTIVATE)
Чтобы они были-таки дочками MainWindow, но кроме самого верхнего из градусников - все были disabled

Вместо того и другого и третьего нужно выставить PopupParent/PopupMode. Тогда градусник будет всегда перед родителем, не будет мешать другим приложениям, будет псевдомодальным и как вишенка на торте - будет для пользователя более отличим от MDI-ных окон.
...
Рейтинг: 0 / 0
16.12.2021, 22:55
    #40120840
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Dimitry Sibiryakov
На главную MDI форму вроде как невозможно что-либо шлёпнуть вообще.

Насколько я помню - шлёпнуть-то можно, но при этом клиентская область MDI автоматически сокращается до незанятого шлёпнутым пространства.
...
Рейтинг: 0 / 0
16.12.2021, 23:34
    #40120845
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
softwarer
Makar4ik
Мало того, скрипты каскадно вызывают друг друга, и этих окон градусников на экране более 1-го

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

Makar4ik
Далее отключил fsStayOnTop... (а то они лезли поверх остальных приложений в системе)
Но прописал SetWindowPos(self.Handle, HWND_NOTOPMOST, 0, 0 ,0 ,0 , SWP_NOMOVE or SWP_NOSIZE, SWP_NOACTIVATE)
Чтобы они были-таки дочками MainWindow, но кроме самого верхнего из градусников - все были disabled

Вместо того и другого и третьего нужно выставить PopupParent/PopupMode. Тогда градусник будет всегда перед родителем, не будет мешать другим приложениям, будет псевдомодальным и как вишенка на торте - будет для пользователя более отличим от MDI-ных окон.

Не, это лишнее.
Первый градусник в текущей реализации помнит, что именно он виноват в дизабле MainForm.
Нормально отрабатывает.
Проблема в том, что градусники - не её дети, и в разных версиях винды между ними - чехарда.
И TopMost тоже не сделать, ибо будет вообще жесть.
см. выше, SetWindowPos выставлял. и по разному.
...
Рейтинг: 0 / 0
16.12.2021, 23:39
    #40120847
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Dimitry Sibiryakov

rgreatШлепни на всю майн форму форму панель под низ, и дизабли ее.

На главную MDI форму вроде как невозможно что-либо шлёпнуть вообще. Дизаблятся
там только менюшка и тулбар.

Вот да, скорее всего придётся именно так.
Все контролы MainForm, и все дочки, кроме себя.
И создавать список, что я задизаблил, чтобы потом вернуть.

И вот тогда уже можно флаг HWND_TOPMOST
...
Рейтинг: 0 / 0
16.12.2021, 23:40
    #40120849
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
Makar4ik
Не, это лишнее.

Имеешь полное право собирать грабли :)
...
Рейтинг: 0 / 0
16.12.2021, 23:44
    #40120850
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
softwarer
Makar4ik
Не, это лишнее.

Имеешь полное право собирать грабли :)
А я-то чо?
Бывают проекты, в которых ты не хозяин, но починить надо.
...
Рейтинг: 0 / 0
16.12.2021, 23:47
    #40120852
Makar4ik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немодальное окно со свойствами модального.
...Дело в том, что это LIB модуль.
Я там могу код у методов менять, но сам состав методов, или их параметры, или состав у класса - нет.
(иначе, ругнётся при сборке, что либа другой версии, а перекомпилить её не судьба, не хватает исходников)

...слава богу, tag лишних у нас полно, можно что угодно записать...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Немодальное окно со свойствами модального. / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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