![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 записать строку. Можно ли так?