Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.07;
Скачать: CL | DM;

Вниз

Как свернуть/развернуть все MDI-окна в моём приложении?   Найти похожие ветки 

 
Volf_555   (2006-02-14 22:33) [0]

В одной из лабораторок есть задание по сабжу.
Искал нужную процедуру... так и не нашёл.
Может вы подскажете? :)

Искал нужные события по следующему образцу:

procedure TfrMain.CloseAll1Click(Sender: TObject);
var i: integer;
begin
 for i:= 0 to MdiChildCount - 1 do
   MDIChildren[i].Close;
end;


Вместо Close по идее должны быть события Maximize и Mininize, но их нет...


 
Игорь Шевченко ©   (2006-02-14 23:48) [1]

Лабораторки обычно делаются самостоятельно или после консультаций с преподавателем. Или ты с ним через форум общаешься ?

Кстати, достаточно развернуть одно окно.


 
Volf_555   (2006-02-15 00:38) [2]


> Лабораторки обычно делаются самостоятельно или после консультаций
> с преподавателем. Или ты с ним через форум общаешься ?

Нет :-) Просто консультаций практически нет и через форум можно получить ответ намного быстрее


> Кстати, достаточно развернуть одно окно.

Как тогда развернуть одно MDI-окно? (события Maximize нет)


 
Игорь Шевченко ©   (2006-02-15 11:28) [3]


> Просто консультаций практически нет и через форум можно
> получить ответ намного быстрее


Видишь ли, отвечающим участникам форума лабы делать не надо. Нет у них такой потребности.


> Как тогда развернуть одно MDI-окно?


Изучить сообщения WM_SYSCOMMAND и WM_MDIMAXIMIZE


 
Volf_555   (2006-02-15 14:58) [4]


> Игорь Шевченко
> Изучить сообщения WM_SYSCOMMAND и WM_MDIMAXIMIZE

Написал следующий код:

procedure TfMDI.N1Click(Sender: TObject);
var
i: integer;
begin
for i:= 0 to MdiChildCount - 1 do
begin
 SendMessage(MDIChildren[i].Handle,WM_MDIMAXIMIZE,0,0);
//  ShowMessage(MdiChildren[i].Caption);
end;
end;

В результате ничего не происходит, хотя ShowMessage... показывает заголовки всех MDI-окон. Что может быть не так?


 
begin...end ©   (2006-02-15 15:14) [5]

> Volf_555   (15.02.06 14:58) [4]

> SendMessage(MDIChildren[i].Handle,WM_MDIMAXIMIZE,0,0)

Не туда шлёте.

An application sends the WM_MDIMAXIMIZE message to a multiple document interface (MDI) client window to maximize an MDI child window.

WM_MDIMAXIMIZE  
wParam = (WPARAM) (HWND) hwndMax; // handle of child to maximize
lParam = 0;                       // not used; must be zero


SendMessage(ClientHandle, WM_MDIMAXIMIZE, ..., 0)


 
Игорь Шевченко ©   (2006-02-15 15:17) [6]

Volf_555   (15.02.06 14:58) [4]

Я вроде написал "изучить". Или русский язык здесь не в почете ?

ЗЫ: Я свои лабы давным-давно сделал и сдал, без форума. Это намек такой.


 
Volf_555   (2006-02-15 17:59) [7]


> begin...end ©   (15.02.06 15:14) [5]
> > Volf_555   (15.02.06 14:58) [4]
>
> > SendMessage(MDIChildren[i].Handle,WM_MDIMAXIMIZE,0,0)
>
> Не туда шлёте.
>
> An application sends the WM_MDIMAXIMIZE message to a multiple
> document interface (MDI) client window to maximize an MDI
> child window.
>
> WM_MDIMAXIMIZE  
> wParam = (WPARAM) (HWND) hwndMax; // handle of child to
> maximize
> lParam = 0;                       // not used; must be zero
>
> SendMessage(ClientHandle, WM_MDIMAXIMIZE, ..., 0)


Пробывал и  ClientHandle, и MDIChildren[i].ClientHandle - бесполезно


 
begin...end ©   (2006-02-15 18:17) [8]

> Volf_555   (15.02.06 17:59) [7]

Код можно увидеть?

Кроме того, после [4] мне непонятно, действительно ли нужно тут непосредственно работать на API (вначале я думал, что нужно, потому что вопрос задан именно в этой конференции), или подойдёт и свойство WindowState.


 
Volf_555   (2006-02-15 20:30) [9]

Вот коддинг:

Doc.dpr:

program Doc;

uses
 Forms,
 uDoc in "uDoc.pas" {fDoc},
 uMDI in "uMDI.pas" {fMDI};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TfMDI, fMDI);
 Application.Run;
end.


uDoc.pas:
unit uDoc;

interface

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

type
 TfDoc = class(TForm)
   RichEdit1: TRichEdit;
   OpenDialog1: TOpenDialog;
   SaveDialog1: TSaveDialog;
   MainMenu1: TMainMenu;
   mFile: TMenuItem;
   mOpen: TMenuItem;
   mSave: TMenuItem;
   procedure mOpenClick(Sender: TObject);
   procedure mSaveClick(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 fDoc: TfDoc;

implementation

{$R *.dfm}

procedure TfDoc.mOpenClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
richedit1.Clear;
richedit1.Lines.LoadFromFile(opendialog1.FileName);
end;
end;

procedure TfDoc.mSaveClick(Sender: TObject);
begin
if savedialog1.Execute then
richedit1.Lines.SaveToFile(savedialog1.FileName);
end;

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

end.


uMDI.pas:

unit uMDI;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs,
 uDoc, Menus;

type
 TfMDI = class(TForm)
   MainMenu1: TMainMenu;
   mWind: TMenuItem;
   mNew: TMenuItem;
   mCascade: TMenuItem;
   mHor: TMenuItem;
   mVert: TMenuItem;
   mIcons: TMenuItem;
   C1: TMenuItem;
   N1: TMenuItem;
   procedure mNewClick(Sender: TObject);
   procedure mCascadeClick(Sender: TObject);
   procedure mHorClick(Sender: TObject);
   procedure mVertClick(Sender: TObject);
   procedure mIconsClick(Sender: TObject);
   procedure C1Click(Sender: TObject);
   procedure N1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 fMDI: TfMDI;

implementation

{$R *.dfm}

procedure TfMDI.mNewClick(Sender: TObject);
var
NewF:TFDoc;
begin
NewF:=TFDoc.Create(Application);
NewF.Caption:="Окно "+IntToStr(MDIChildCount);
NewF.Show;
end;

procedure TfMDI.mCascadeClick(Sender: TObject);
begin
Cascade;
Tile;
end;

procedure TfMDI.mHorClick(Sender: TObject);
begin
TileMode:=tbHorizontal;
Tile;
end;

procedure TfMDI.mVertClick(Sender: TObject);
begin
TileMode:=tbVertical;
Tile;
end;

procedure TfMDI.mIconsClick(Sender: TObject);
begin
Tile;
end;

procedure TfMDI.C1Click(Sender: TObject);
{var
i: integer;}
begin
{ for i:= 0 to MdiChildCount - 1 do
 MDIChildren[i].;}
end;

procedure TfMDI.N1Click(Sender: TObject);
var
i: integer;
begin
for i:= 0 to MdiChildCount - 1 do
begin
 SendMessage(MdiChildren[i].ClientHandle,WM_MDIMAXIMIZE,0,0);
 //ShowMessage(MdiChildren[i].Caption);
end;
end;

end.


 
begin...end ©   (2006-02-15 20:44) [10]

> Volf_555   (15.02.06 20:30) [9]

> SendMessage(MdiChildren[i].ClientHandle,WM_MDIMAXIMIZE,0,0)

Внимательно посмотрите на [5]. Сообщение нужно посылать MDI-клиентскому окну, и в качестве параметра wParam нужно передавать дескриптор дочернего окна:

SendMessage(ClientHandle, WM_MDIMAXIMIZE, MDIChildren[...].Handle, 0)

Или, если можно обойтись средствами VCL, устанавливайте свойство WindowState у каждого дочернего окна в wsMaximized.


 
Volf_555   (2006-02-15 21:10) [11]

Всем спасибо! Решил проблему так:
SendMessage(ClientHandle,WM_SYSCOMMAND,SC_MINIMIZE,0); //для минимизиции всех MDI-окон
SendMessage(ClientHandle,WM_SYSCOMMAND,SC_MAXIMIZE,0); //для разворачивания всех MDI-окон


 
Anatoly Podgoretsky ©   (2006-02-15 21:11) [12]

Может вместо этой кнопочки procedure TfMDI.N1Click(Sender: TObject);, нажать соответствую кнопочку на окне и код даже писать не надо.


 
Volf_555   (2006-02-15 21:18) [13]


> Anatoly Podgoretsky ©   (15.02.06 21:11) [12]
> Может вместо этой кнопочки procedure TfMDI.N1Click(Sender:
>  TObject);, нажать соответствую кнопочку на окне и код даже
> писать не надо.

Это MDI-приложения - если нажать на кнопку Свернуть одного дочернего окна, то свернётся только это окно, а не все дочерние окна.
Такая же ситуация с Развернуть.


 
fellix   (2006-02-16 13:12) [14]

> Volf_555   (15.02.06 21:18) [13]
> ... свернётся только это окно, а не все дочерние окна ...

Ну так ловить OnResize, проверять WindowState и выполнять нужные действия с остальными окнами.



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

Текущий архив: 2006.05.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.038 c
1-1143488106
kutuzov47
2006-03-27 23:35
2006.05.07
Программно назначить объекту ShortCut


8-1131123964
serko
2005-11-04 20:06
2006.05.07
Звук и видео!


1-1143059918
Yegorchic
2006-03-22 23:38
2006.05.07
Сохранение компонета


1-1143802681
bns
2006-03-31 14:58
2006.05.07
Определение места AV


6-1136870292
[Gss]Pass
2006-01-10 08:18
2006.05.07
TIdSocketHandle