Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Свернуть/развернуть модальные формы в DLL / 8 сообщений из 8, страница 1 из 1
11.07.2017, 14:26:45
    #39486561
icemanea
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свернуть/развернуть модальные формы в DLL
Доброго времени суток, уважаемые специалисты!

Целую кучу времени бьюсь над следующей проблемой:
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
11.07.2017, 17:42:54
    #39486834
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свернуть/развернуть модальные формы в DLL
Лечить по телефону сложно, но попробуйте вот это:
https://www.codeproject.com/Tips/76427/How-to-bring-window-to-top-with-SetForegroundWindo
...
Рейтинг: 0 / 0
11.07.2017, 18:47:44
    #39486877
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свернуть/развернуть модальные формы в DLL
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
11.07.2017, 19:29:31
    #39486915
icemanea
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свернуть/развернуть модальные формы в DLL
В 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
11.07.2017, 20:18:52
    #39486940
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свернуть/развернуть модальные формы в DLL
icemanea
Код: pascal
1.
//MainPageForm := TMainPageForm.Create(Application);

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

Это выкинуть
...
Рейтинг: 0 / 0
11.07.2017, 21:56:24
    #39486991
icemanea
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свернуть/развернуть модальные формы в DLL
_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
12.07.2017, 13:56:31
    #39487498
SimplTsar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свернуть/развернуть модальные формы в DLL
icemaneaКак без вечного свойства StayOnTop для всех дополнительных модальных форм аккуратно развернуть приложение?
См. Screen.Forms
...
Рейтинг: 0 / 0
12.07.2017, 14:15:53
    #39487534
icemanea
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свернуть/развернуть модальные формы в DLL
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Свернуть/развернуть модальные формы в DLL / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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