Текущий архив: 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.49 MB
Время: 0.012 c