powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Свернуть/развернуть модальные формы в DLL
8 сообщений из 8, страница 1 из 1
Свернуть/развернуть модальные формы в DLL
    #39486561
icemanea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, уважаемые специалисты!

Целую кучу времени бьюсь над следующей проблемой:
1. Есть многолетний проект. Delphi XE. Есть экзешник, который в статике вызывает dll и из неё главную форму ShowModal
2. В этой форме работают люди (с самим приложением и не прикасаются - его не видно, оно для администраторов)
Если ничего не менять, то форма сворачивается не в трей а в миниокно в левый нижний угол (на Windows 10 при увеличенном значении точек дюйм его не видно...!!)
Делаю
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TMainPageForm.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_MINIMIZE
    then
      ShowWindow (Application.Handle, SW_MINIMIZE)
    else
      inherited;
end;


3. Это окно работает исправно (основное окно DLL)
4. Но в библиотеке куча других форм! Они по умолчанию тоже спускаются не в трей, а в угол. И вот когда уже допиливаю их... Начинаются проблемы:
- Сворачивается все ок!
- Разворачивается с главной формой впереди. Соответственно модальная форма другая сзади. Соответсвенно пользователь тыкает и слышит звон... Умный пользователей начинает щелкать Alt-Tab и все находит6 но таких единицы...

ВОПРОС:
Как без вечного свойства StayOnTop для всех дополнительных модальных форм аккуратно развернуть приложение?

Заранее благодарен!
...
Рейтинг: 0 / 0
Свернуть/развернуть модальные формы в DLL
    #39486834
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лечить по телефону сложно, но попробуйте вот это:
https://www.codeproject.com/Tips/76427/How-to-bring-window-to-top-with-SetForegroundWindo
...
Рейтинг: 0 / 0
Свернуть/развернуть модальные формы в DLL
    #39486877
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dll
Код: pascal
1.
2.
3.
4.
procedure SetHandle(AHandle: THandle); export;
begin
  Application.Handle := AHandle;
end;


exe
Код: pascal
1.
2.
3.
procedure SetHandle(AHandle: THandle); external 'MyDll.dll';
......
SetHandle(Application.Handle);
...
Рейтинг: 0 / 0
Свернуть/развернуть модальные формы в DLL
    #39486915
icemanea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В DLL:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      // Присоединяем к приложению
      Application.ShowMainForm := False;
      Application.Handle := AppHandle;
     // Application.MainFormOnTaskbar := True;

      if not Assigned(MainPageForm) then
        //MainPageForm := TMainPageForm.Create(Application);
        Application.CreateForm(TMainPageForm, MainPageForm);

      // Отображение формы
      Result := MainPageForm.ShowModal;



Так показываю форму в DLL.

Так пробую на формы:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TForm.WMSysCommand(var Msg: TWMSysCommand);
var i:TFormStyle;
begin
  if Msg.CmdType = SC_RESTORE
    then
      SetForegroundWindow(Application.Handle);

  if Msg.CmdType = SC_MINIMIZE
    then
      ShowWindow (Application.Handle, SW_MINIMIZE)
    else
      inherited;
end;



Результата нет.. Форма основная активируется, а модальная не видна (как бы за ней).
...
Рейтинг: 0 / 0
Свернуть/развернуть модальные формы в DLL
    #39486940
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
icemanea
Код: pascal
1.
//MainPageForm := TMainPageForm.Create(Application);

Создавать так
icemanea
Код: pascal
1.
SetForegroundWindow(Application.Handle);

Это выкинуть
...
Рейтинг: 0 / 0
Свернуть/развернуть модальные формы в DLL
    #39486991
icemanea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Так я делал 2 дня назад... Перепробовал тысячу разных советов и вот снова вернулся в точку 0. Не работает.
после restore приложения выскакивает главная форма, а активная модальная за ней.

Ещё ходит подсказка, чтобы на один момент форму сделать fsStayOnTop. Но я не понимаю как отследить этот момент. Событие
Код: pascal
1.
2.
3.
4.
procedure TForm.WMSysCommand(var Msg: TWMSysCommand);
begin
  if Msg.CmdType = SC_RESTORE
    then


для формы не происходит.
...
Рейтинг: 0 / 0
Свернуть/развернуть модальные формы в DLL
    #39487498
SimplTsar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
icemaneaКак без вечного свойства StayOnTop для всех дополнительных модальных форм аккуратно развернуть приложение?
См. Screen.Forms
...
Рейтинг: 0 / 0
Свернуть/развернуть модальные формы в DLL
    #39487534
icemanea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SimplTsar,

СПАСИБО огромное! Дельный совет. Теперь все работает в лучшем виде! :)
Форма с индексом 0 всегда самая "верхняя".

Допилил кастомную форму, теперь проект летает.

Код: 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.
unit MyFormUnit;

interface

uses
  Forms, Messages, Windows;

type
  TForm = class(Forms.TForm)
  protected
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  end;

implementation

procedure TForm.WMSysCommand(var Msg: TWMSysCommand);
var i:TFormStyle;
begin
  if Msg.CmdType = SC_RESTORE then
  begin
    i := Screen.Forms[0].FormStyle;
    Screen.Forms[0].FormStyle := fsStayOnTop;
    Screen.Forms[0].FormStyle := i;
  end else
    if Msg.CmdType = SC_MINIMIZE
      then
        ShowWindow (Application.Handle, SW_MINIMIZE)
      else
        inherited;
end;

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


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