powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Немодальное окно со свойствами модального.
18 сообщений из 18, страница 1 из 1
Немодальное окно со свойствами модального.
    #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
Немодальное окно со свойствами модального.
    #40120750
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makar4ik, а что мешает при показе очередного градусника дизаблить предыдущий, если таковой имеется? Организуй из них стек и управляй enabled
...
Рейтинг: 0 / 0
Немодальное окно со свойствами модального.
    #40120753
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
Makar4ik, а что мешает при показе очередного градусника дизаблить предыдущий, если таковой имеется? Организуй из них стек и управляй enabled

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


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

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



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

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

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


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

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

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


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

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

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

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

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

На главную MDI форму вроде как невозможно что-либо шлёпнуть вообще. Дизаблятся
там только менюшка и тулбар.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Немодальное окно со свойствами модального.
    #40120806
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без MDI я писал стековую модальность. Т.е. есть набор родительских немодальных форм, от которых порождаются "модальные только для своего стека" дочерние. Можно было переключаться между пирамидками из окон
...
Рейтинг: 0 / 0
Немодальное окно со свойствами модального.
    #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
Немодальное окно со свойствами модального.
    #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
Немодальное окно со свойствами модального.
    #40120840
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
На главную MDI форму вроде как невозможно что-либо шлёпнуть вообще.

Насколько я помню - шлёпнуть-то можно, но при этом клиентская область MDI автоматически сокращается до незанятого шлёпнутым пространства.
...
Рейтинг: 0 / 0
Немодальное окно со свойствами модального.
    #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
Немодальное окно со свойствами модального.
    #40120847
Фотография Makar4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

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

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

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

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

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


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