Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MDIChild аналог модальной формы


Рамиль ©   (2004-09-22 16:25:00) 

Можно как нибудь сделать такое? Хотя бы имитировать модальность.
Если написать обработчик

procedure TForm1.FormDeactivate(Sender: TObject);
begin
 Show;
 SetFocus;
end;

вроде все нормально, за одним исключением - можно закрыть другие формы, что крайне нежелательно.
(Хочу сделать интерфейс как в Галактике, если кто видел)


Рамиль   (2004-09-23 08:34:00) [1]

Ок. Всем спасибо. Похоже, что не трогая остальных форм сделать нельзя. Буду делать через Enable/Disable.


jack128   (2004-09-22 21:49:00) [2]

Идея слямзина из Enable/DisableTaskWindow
type
 PTaskWindow = ^TTaskWindow;
 TTaskWindow = record
   Next: PTaskWindow;
   Window: HWnd;
 end;

function TMainForm.DisableMDIChildren(ActiveForm: TCustomForm): PTaskWindow;
var
 i: Integer;
 Run: PTaskWindow;
begin
 if not ((TForm(ActiveForm).FormStyle = fsMDIChild) and ActiveForm.Enabled) then
   raise Exception.Create('Активной должна быть Enabled MDIChild форма');
 Result := nil;
 Run := nil;
 for i := 0 to MDIChildCount - 1 do
 begin
   if (MDIChildren[i] <> ActiveForm) and (MDIChildren[i].Enabled) then
   begin
     EnableWindow(MDIChildren[i].Handle, False);
     New(Result);
     Result.Window := MDIChildren[i].Handle;
     Result.Next := Run;
     Run := Result;
   end;
 end;
 if ActiveForm.CanFocus then ActiveForm.SetFocus;
end;

procedure TMainForm.EnableMDIChildren(WndList: Pointer);
var
 P: PTaskWindow;
begin
 while WndList <> nil do
 begin
   P := WndList;
   if IsWindow(P^.Window) then EnableWindow(P^.Window, True);
   WndList := P^.Next;
   Dispose(P);
 end;
end


GuAV   (2004-09-22 21:23:00) [3]

А что Eanbled в False остальным не помогает ?

> А я например хочу в переменную типа integer записать строку.
> Можно ли так?

В том же смысле в котором строка записывается в переменную типа string - да.


Anatoly Podgoretsky   (2004-09-22 17:42:00) [4]

Рамиль ©   (22.09.04 17:32) [11]
Это управляемое


Рамиль   (2004-09-22 17:32:00) [5]

Iconka ©   (22.09.04 17:30) [8]
Anatoly Podgoretsky ©   (22.09.04 17:30) [9]
Не хочу что бы за пределы MDIForm утащить можно было.


Sandman25   (2004-09-22 17:31:00) [6]

[7] Рамиль ©   (22.09.04 17:27)

Мне тоже не нравится, но с помощью ООП можно спрятать весь механизм в общем предке.


Iconka   (2004-09-22 17:30:00) [7]


> А какое для MDIChild прямое средство? Или у меня крыша
> едет к вечеру...

Помоему сделать его не MDIChild и запускать ShowModal


Anatoly Podgoretsky   (2004-09-22 17:30:00) [8]

Прямое - это модальные формы


Рамиль   (2004-09-22 17:27:00) [9]

Anatoly Podgoretsky ©   (22.09.04 17:19) [5]
А какое для MDIChild прямое средство? Или у меня крыша едет к вечеру...
Sandman25 ©   (22.09.04 17:20) [6]
Рассматривал такой вариант, но он мне не нравится. Может как то по другому можно.


Sandman25   (2004-09-22 17:20:00) [10]

Тогда можно расширить прием с OnCloseQuery до обработчика WM_SYSCOMMAND.
Если все формы в обычном режиме - флаг имеет значение Val1, все команды доступны. Если одна из форм должна стать модальной - пробегаем по всем формам, ставим их флагам значение Val2, которое блокирует обработку команд, а модальной форме ставим значение Val3, чтобы при ее закрытии опять пробежаться по всем формам и установить флаги в Val1.


Anatoly Podgoretsky   (2004-09-22 17:19:00) [11]

Почему нет желания использовать прямое средство?


Рамиль   (2004-09-22 17:16:00) [12]

Sandman25 ©   (22.09.04 17:05) [3]
Проблема в том, что другие формы могут обрабатывать WM_SYSCOMMAND, даже если я возвращаю фокус на форму.


Sandman25   (2004-09-22 17:05:00) [13]

Может, флаг устанавливают для формы, которая должна быть модальной, и в OnCloseQuery его анализируют?


Рамиль   (2004-09-22 16:57:00) [14]

Iconka ©   (22.09.04 16:50) [1]
Я же говорю хотя бы имитировать.
У меня перед носом приложение, в котором так сделано. И что то я не соображу как они это сделали :(


Iconka   (2004-09-22 16:50:00) [15]

Есть модальные формы, есть не модальные. Чё еще не понятно?
А я например хочу в переменную типа integer записать строку. Можно ли так?


Наверх

Титульная страница Поиск, карта сайта Написать письмо