Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

Вызов MDI окна не меняя WindowState у родителя   Найти похожие ветки 

 
Lexer ©   (2006-09-26 17:07) [0]

Стала передо мной задача извратить принципы MDI приложения (не хочется, а надо).

В общем...
Дано:
MDI-приложение
дочерние формы:
форма №1:
BorderStyle: bsSizeable
FormStyle: fsMDIChild

форма №2
BorderStyle: bsDialog
FormStyle: fsMDIChild

Задача: в MDI приложении вызвать форму №2 из формы №1 не меняя WindowState у формы №1.

Перекрыл WM_SIZE, но теперь у формы не отображаются стандартные кнопки меню (свернуть, максимизировать, закрыть):

procedure TfrmACurrentDelivery.WndProc(var Message: TMessage);
begin
 if (Message.Msg = WM_SIZE) then
 begin
   WindowState := wsMaximized;
   tcDetail.Perform(WM_SIZE, 0, 0);
 end
 else inherited WndProc(Message);
end;


 
Игорь Шевченко ©   (2006-09-26 17:10) [1]


> в MDI приложении вызвать форму №2 из формы №1 не меняя WindowState
> у формы №1.


Я не совсем улавливаю, как меняется WindowState (wsNormal, wsMinimized, wsMaximized) при вызове одной MDI-формы из другой.


 
Lexer ©   (2006-09-26 17:20) [2]

У второй формы WinState = wsNormal - это обычный диалог, правда пришлось сделать его MDIChild"ом...
В MDI приложениях изначально если какая-то из форм переводится в wsNormal, то переводятся все. А по задаче надо чтоб при вызове данного диалога родительское окно оставалось максимизированным, если оно было максимизировано до вызова данного диалога.


 
Игорь Шевченко ©   (2006-09-26 17:34) [3]

Lexer ©   (26.09.06 17:20) [2]


> В MDI приложениях изначально если какая-то из форм переводится
> в wsNormal, то переводятся все


Ну да, это Windows так устроено...


> У второй формы WinState = wsNormal - это обычный диалог,
>  правда пришлось сделать его MDIChild"ом...


Могу предложить такой способ:

MDI окно, откуда вызывается "диалог":

unit Child;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm2 = class(TForm)
   Button1: TButton;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
 end;

var
 Form2: TForm2;

implementation
uses
 DialogChild;

{$R *.DFM}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 with TForm3.Create (Application) do
   Show;
end;

end.


И сам "Диалог":

unit DialogChild;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TForm3 = class(TForm)
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 public
   procedure Loaded; override;
 end;

var
 Form3: TForm3;

implementation
uses
 Child;

{$R *.DFM}

{ TForm3 }

procedure TForm3.Loaded;
var
 I: Integer;
begin
 inherited;
 for I:=0 to Pred(Application.MainForm.MDIChildCount) do
   if Application.MainForm.MDIChildren[I] is TForm2 then begin
     WindowState := Application.MainForm.MDIChildren[I].WindowState;
     Break;
   end;
end;

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

end.


Может и криво, но работать пытается.


 
Lexer ©   (2006-09-26 17:54) [4]

спасибо, но не подходит, т.к. диалог не должен быть максимизирован


 
Игорь Шевченко ©   (2006-09-27 09:55) [5]

Lexer ©   (26.09.06 17:54) [4]

В MDI-приложении либо все Child"ы максимизированы, либо нет. Так, чтобы один Child был максимизирован, а другой - нет, не бывает. Выход - сделай диалог обычной формой, которую показывай либо по ShowModal, что предпочтительней для диалоговых окон, либо по Show


 
Lexer ©   (2006-09-27 10:26) [6]

>сделай диалог обычной формой, которую показывай либо по ShowModal, что предпочтительней для диалоговых окон, либо по Show

fsNormal делать нельзя, т.к. из диалога могут вызываться справочники поверх данной формы, максимизировать диалог тоже нельзя.

Так, чтобы один Child был максимизирован, а другой - нет, не бывает
но сделать то можно... я привел вариант в первом посте, всё работает отлично, за искличением того что у формы №1 пропадают кнопки меню, т.е. она постоянно максимизирована, и её нельзя ни закрыть, ни нормализовать ни свернуть...
Сам понимаю что это полный изврат... но очень сложно это объяснить начальству.


 
Игорь Шевченко ©   (2006-09-27 10:33) [7]

Lexer ©   (27.09.06 10:26) [6]


> но сделать то можно...


Нельзя. Windows так устроен.


> fsNormal делать нельзя, т.к. из диалога могут вызываться
> справочники поверх данной формы, максимизировать диалог
> тоже нельзя.


И пусть себе вызываются. Тоже в виде нормальных форм, желательно модальных.
В свое время для вызываемых форм справочников мною предусматривалось два конструктора, один для создания формы, как MDI child, другой для вызова ее же в модальном режиме, как раз для использования в диалогах. И ничего, никто не жаловался.


 
Lexer ©   (2006-09-27 10:42) [8]


> Нельзя. Windows так устроен.

:(

procedure TfrmACurrentDelivery.WndProc(var Message: TMessage);
begin
if (Message.Msg = WM_SIZE) then
begin
  WindowState := wsMaximized;
  tcDetail.Perform(WM_SIZE, 0, 0);
end
else inherited WndProc(Message);
end;


Этот код работает прекрасно, вызывается модальная форма с fsNormal, а родительская остается максимизированной, только вот глюк с кнопками меню. Помоему надо оценивать fwSizeType у WM_SIZE и по нему отфильтровывать ненужные сообщения. Или нужно обрабатывать совсем др. сообщения.
Игорь Шевченко, спасибо, за того что попытались помочь.
Буду мучить MDI дальше, думаю это реально сделать.


 
Игорь Шевченко ©   (2006-09-27 10:53) [9]


> а родительская остается максимизированной, только вот глюк
> с кнопками меню.


Если есть глюк, значит нельзя, об чем со второго поста твердят большевики.
Я полагаю, что ты потратишь гораздо больше времени на извраты, может, стоит присмотреться к альтернативным путям решения ?


 
Экспериментатор   (2006-09-28 10:43) [10]

Ну максимизируется твой диалог, ну что с того то?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.043 c
3-1157535205
Orxan
2006-09-06 13:33
2006.11.05
SQL Monitor


15-1160592277
DillerXX
2006-10-11 22:44
2006.11.05
Haskell Haskell Haskell !!!


4-1150644667
Aragon
2006-06-18 19:31
2006.11.05
Фильтрация процессов от системных


2-1161511329
Riply
2006-10-22 14:02
2006.11.05
EnumResourceTypes типы перебирает, но возвращает ошибку


2-1161329602
stalcker666
2006-10-20 11:33
2006.11.05
Telnet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский