powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Постоянно доступная форма (может пригодится кому...)
6 сообщений из 6, страница 1 из 1
Постоянно доступная форма (может пригодится кому...)
    #32359225
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
В Kuliba советуют следующее:

procedure ShowAlmostModal(FormModal:TForm);
begin
NavigatorForm.Enabled:=false;
FormModal.ShowModal
end;
И вот это пpивесь на OnShow почти модальной фоpмы
procedure FormShow(Sender:Tobject);
begin
NavigatorForm.Enabled:=true;
end;



На практике (моей) это оказалось бесполезным :-(
в проекте уже много чего написано, и искать ВСЕ модальные вызовы лень;

часть (бОльшая) форм находится в DLL, отслеживать модальные вызовы - кошмар, к тому же некоторые библиотеки написаны не на Делфи;

очень "неудобное" такое решение.


Вот так проще:

Вешаем обработчик на Screen.OnActiveFormChange :
if AlwaysEnabledForm.Showing then begin
AlwaysEnabledForm.Enabled := False;
AlwaysEnabledForm.Enabled := True;
end;


Ну и показ формы (если нужно очень):
if not AlwaysEnabledForm.Showing then AlwaysEnabledForm.Show;
AlwaysEnabledForm.BringToFront;



Замеченый глюк:
если MainForm еще не показана (например, в TMainForm.OnShow вызывается какое-нибудь модальное окно, а из него - "AlwaysEnabledForm"), то AlwaysEnabledForm оказывается под модальным.
У меня времени не было разбираться с этим (в моем текущем проекте нет в этом надобности). Скорее всего надо CreateParams перекрыть.

И еще: как оптимизатор обработает вот такую конструкцию
AlwaysEnabledForm.Enabled := False;
AlwaysEnabledForm.Enabled := True;

я не проверял :-)





eNose
...
Рейтинг: 0 / 0
Постоянно доступная форма (может пригодится кому...)
    #32360034
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, интересно...
К стати, у меня другая проблема - может вы знаете как решить: приложение МДИ. Соотв. все окна наследуются от предка, который МДИЧилд. Но иногда мне удобно показать одну форму и в неё мануал доком перенести на табконтрол другие зависимые МДИ формы. Делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function TBaseChildForm.ShowTabWindow(FormClass: TBaseChildClass;
  Control: TwinControl; CanDrag:boolean=true):TBaseChildForm;
begin
  SetLength(DestroyList,Length(DestroyList)+ 1 );
  Result:=FormClass.Create(Application);
  DestroyList[High(DestroyList)]:=Result;
  with DestroyList[High(DestroyList)] do
  begin
    FormStyle:=fsStayOnTop;
    DragKind:=dkDock;
    DragMode:=dmAutomatic;
    if not CanDrag then
      Result.OnStartDock:=StartDockEvent;
    DockControl:=Control;
    ManualDock(Control,nil,alClient);
    TTutWinControl(Control).OnGetSiteInfo:=GetSiteInfo;
    Show
  end
end;

Тут, собственно, интересен кусок:
Код: plaintext
1.
2.
3.
4.
5.
6.
    FormStyle:=fsStayOnTop;
    DragKind:=dkDock;
    DragMode:=dmAutomatic;
    if not CanDrag then
      Result.OnStartDock:=StartDockEvent;
    DockControl:=Control;
    ManualDock(Control,nil,alClient);


Так вот это дело очень сильно тормозит когда таких форм много, т.к. они создаются изначально видимыми и потом перетаскиваются драгэнддропом. Можно ли как-то это оптимизиовать?
...
Рейтинг: 0 / 0
Постоянно доступная форма (может пригодится кому...)
    #32360324
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Сразу вопрос:

зачем делать
DragKind:=dkDock;
DragMode:=dmAutomatic;
if not CanDrag then Result.OnStartDock:=StartDockEvent;
DockControl:=Control;

если используется ManualDock?

Не смотрел пока исходники, но, кажется, все automatic dock контролы должны регистрироваться в системе соответствующим образом...

И еще: а если создавать формы как fsNormal (когда их надо поместить на другую форму)?




eNose
...
Рейтинг: 0 / 0
Постоянно доступная форма (может пригодится кому...)
    #32361019
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСразу вопрос:
зачем делать
DragKind:=dkDock;
DragMode:=dmAutomatic;
if not CanDrag then Result.OnStartDock:=StartDockEvent;
DockControl:=Control;
если используется ManualDock?
Ох, не помню всего - больше года назад возился с этим и намучался тогда.
Код: plaintext
1.
DragKind:=dkDock; 
DragMode:=dmAutomatic; 
- это чтоб потом можно было эти формы вытаскивать с табконтрола и класть их обратно мышью.
Код: plaintext
if not CanDrag then Result.OnStartDock:=StartDockEvent; 
Это я не помню зачем уже, но нужно
Код: plaintext
DockControl:=Control; 
а это запоминается контейнер, чтоб потом если форму вытянуть, то она не могла приземлиться в другом контейнере. Короче чтоб отличать куда можно ей делать док, а куда нет.

авторИ еще: а если создавать формы как fsNormal (когда их надо поместить на другую форму)?
Так а как? Я не шарю. Когда-то у меня была мысль поменять RTTI (FormClass.ClassInfo) до вызова конструктора Result:=FormClass.Create(Application), но тогда у меня что-то не получилось и я больше не копался в этом. Собственно говоря вопрос можно как раз и свести к тому, как перед вызовом конструктора поменять стиль формы с fsMDIChild на fsStayOnTop ?


eNose
...
Рейтинг: 0 / 0
Постоянно доступная форма (может пригодится кому...)
    #32361160
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
как перед вызовом конструктора поменять стиль формы с fsMDIChild на fsStayOnTop ?

CreateParams перекрыть.



Остальное завтра: иду домой :-)


eNose
...
Рейтинг: 0 / 0
Постоянно доступная форма (может пригодится кому...)
    #32364864
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторCreateParams перекрыть.

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


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