![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Управление mdi-окнами [D7, Win2k]
SeDOy © (2004-07-10 19:51:00)Hаpод у меня есть вопpос.
_*Буфеp начало*
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, Menus, StdCtrls;
type
TForm1 = class(TForm)
ToolBar1: TToolBar;
MainMenu1: TMainMenu;
...
procedure TForm1.CreateB(const childName : string);
var
B:TToolButton;
begin
B :=TToolButton.Create(ToolBar1);
B.Parent:=ToolBar1;
B.Caption := childName;
end;
гдето в пpогpамме идёт вызов mdi-окна, и заодно на ToolBar добавляется новая кнопка с
названием этого окна
Application.CreateForm(Tf_sotrudnik, f_sotrudnik);
CreateB('Сотpудники'));
_*Буфеp конец*
Тепеpь самое интеpесное
1)как мне отловить нажатие на какаую-либо кнопку ToolButton
2)потом найти по названию, нажатой кнопки ToolButton, mdi-окно
3)послать команду на pазвёpтывание mdi-окна
4)Пpи уничтожении mdi-окна уничтожить ей соответсвующую кнопку с ToolBar-а
Hаpод помогите, я особенно не пойму как pеализовать1 и 4 вопpос
P.S.
Создаётся фоpма, создаю динамически 3 кнопки на ToolBar-е
пpостой код, для вывода названий всех кнопок, создаваемых во вpемя pаботы пpогpаммы
var i:integer;
begin
for i:=Form1.ToolBar1.ButtonCount downto 1 do
showmessage(Form1.ToolBar1.Buttons[i].caption);
end;
После запуска этого кода выскакивает сообщение об ошибке: List index out of bounds (3)
Как пpавильно обpатиться к ToolBar1.Buttons[i] ?
Magikan (2004-07-19 05:27:00) [1]Можно мне на мыло эту компоненту закинуть? Пожалуйста...
Galera (2004-07-12 13:03:00) [2]
> evvcom © (12.07.04 09:56) [11]
Согласен.
если хочешь можешь доделать-переделать, я не против :-)
Модератору:
Дико извиняюсь.
evvcom (2004-07-12 09:56:00) [3]Беглый взгляд:
> mi := TMenuItem.Create(Self);
> mi.Caption := 'Каскадом';
> mi.OnClick := CascadeMDIWindow;
> PopupMenu.Items.Add(mi);
>
> mi := TMenuItem.Create(Self);
> mi.Caption := 'Встык горизонтально';
> mi.OnClick := TileHorMDIWindow;
> PopupMenu.Items.Add(mi);
>
> mi := TMenuItem.Create(Self);
> mi.Caption := 'Встык вертикально';
> mi.OnClick := TileVertMDIWindow;
> PopupMenu.Items.Add(mi);
и т.д. Я такие вещи обычно пихаю в массив, а присвоения делаю в цикле.
> with Application.MainForm.MDIChildren[I] do
> begin
> Left:=0;
> Top:=0;
> Width:=Rect.Right;
> Height:=Rect.Bottom;
> end;
Каждое из присвоений Left, Top и т.д. вызывает SetBounds, так не лучше ли сразу вызвать однажды этот SetBounds?
> procedure TMDIButton.OnPopupMenu(Sender: TObject);
> var I : integer;
> begin
> I:=7;
> if GetTopWindow(Application.MainForm.ClientHandle)=AHandle
> then
> PopupMenu.Items[I+0].Enabled := False
> else
> PopupMenu.Items[I+0].Enabled := True;
>
> if IsIconic(AHandle) then begin
> PopupMenu.Items[I+2].Enabled := True;
> PopupMenu.Items[I+3].Enabled := False;
> PopupMenu.Items[I+4].Enabled := True;
> end
Очень не читабельно! Что такое Items[I+0] или Items[I+2]? Почему я должен помнить какому индексу, что соответствует? Я в таких случаях делаю перечисляемый тип и вместо индексов подставляю его, приводя к нужному типу. Увеличения машинного кода - ноль, а читаемость - 100%.
> procedure TMDIButton.CascadeMDIWindow(Sender: TObject);
> begin
> SendMessage(Application.MainForm.ClientHandle, WM_MDICASCADE,
> 0, 0);
> end;
>
> procedure TMDIButton.TileHorMDIWindow(Sender: TObject);
> begin
> SendMessage(Application.MainForm.ClientHandle, WM_MDITile,
> MDITILE_HORIZONTAL, 0);
> end;
>
> procedure TMDIButton.TileVertMDIWindow(Sender: TObject);
> begin
> SendMessage(Application.MainForm.ClientHandle, WM_MDITile,
> MDITILE_VERTICAL, 0);
> end;
Это, кстати, тоже в массив можно запихать (параметры) и написать всего один обработчик.
Denis_Visma (2004-07-12 09:41:00) [4]Спасибо за компонент, классная штуковина
Galera (2004-07-11 14:29:00) [5]И кстати,
достаточно только установить компонент и положить его на MDI-форму,
больше ничего не надо делать
компонент сам перекрывает оконные функции и отлавливает месседжи
Galera (2004-07-11 14:25:00) [6]Это все добро: компонент TMDIPanel - закладка Win32
устан'овите без проблем
по сути дела это TPanel на которой располагаются кнопки TSpeedButton или подобные, и эта панель делает все что вам нужно.
располагается внизу формы
подобно панели в 1С
будут вопросы - пишите
Galera (2004-07-11 14:20:00) [7]Удалено модератором
Galera (2004-07-11 14:20:00) [8]Удалено модератором
Galera (2004-07-11 14:19:00) [9]Удалено модератором
Примечание: Не заюивай форум такими большими кусками кода, а посылай его прямо корреспонденту
Galera (2004-07-11 14:18:00) [10]Презентую компонент как раз для этих целей
Arm79 (2004-07-11 12:14:00) [11]ниже вырезанный текст модуля для mdi формы
-----------------------------
unit Unit1;
interface
uses
...
const
WM_ShowLinkedToolBar = WM_User + 1979;
WM_HideLinkedToolBar = WM_User + 1980;
WM_CloseActiveMDIForm= WM_User + 1981;
type
TfrmParentDBGrid = class(TForm)
...
procedure FormActivate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
uses Unit2;
{$R *.DFM}
...
{ TfrmParentDBGrid }
...
procedure TfrmParentDBGrid.FormActivate(Sender: TObject);
begin
SendMessage(TForm(Owner).Handle, WM_ShowLinkedToolBar, 0, 0);
end;
procedure TfrmParentDBGrid.FormDeactivate(Sender: TObject);
begin
SendMessage(TForm(Owner).Handle, WM_HideLinkedToolBar, 0, 0);
end;
procedure TfrmParentDBGrid.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
Self.Deactivate;
end;
end.
следом идет вырезка текста модуля для основной формы
-------------------------------------------
unit Unit2;
interface
uses
...
const
WM_ShowLinkedToolBar = WM_User + 1979;
WM_HideLinkedToolBar = WM_User + 1980;
WM_CloseActiveMDIForm= WM_User + 1981;
type
TForm2 = class(TForm)
...
CoolBar1: TCoolBar;
ToolBar2: TToolBar;
...
procedure new1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure WMShowLinkedToolBar (var Msg: TMessage); message WM_ShowLinkedToolBar;
procedure WMHideLinkedToolBar (var Msg: TMessage); message WM_HideLinkedToolBar;
procedure WMCloseActiveMDIForm(var Msg: TMessage); message WM_CloseActiveMDIForm;
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.DFM}
procedure AddButton(var ToolBar : TToolBar;
const ButtonName : string;
const ButtonStyle : TToolButtonStyle;
const ButtonAction: TAction);
begin
with TToolButton.Create(ToolBar) do
begin
Parent := ToolBar;
Action := ButtonAction;
Name := ButtonName;
Style := ButtonStyle;
end;
end;
procedure TForm2.new1Click(Sender: TObject);
var
frm1 : TfrmParentDBGrid;
begin
Frm1 := TfrmParentDBGrid.Create(Form2, ...);
frm1.Show;
end;
procedure TForm2.WMShowLinkedToolBar(var Msg: TMessage);
var
i : integer;
begin
ToolBar2.Images := TfrmParentDBGrid(ActiveMDIChild).ImageList1;
for i := TfrmParentDBGrid(ActiveMDIChild).ActionList1.ActionCount-1 downto 0
do begin
AddButton(ToolBar2, 'ToolButton' + IntToStr(i), tbsButton,
TAction(TfrmParentDBGrid(ActiveMDIChild).ActionList1.Actions[i]));
end;
end;
procedure TForm2.WMHideLinkedToolBar(var Msg: TMessage);
var
i : integer;
c : integer;
begin
c := ToolBar2.ButtonCount-1;
for i := c downto 0
do begin
try
ToolBar2.Buttons[i].Action := nil;
ToolBar2.Buttons[i].Free;
except
end;
end;
end;
procedure TForm2.WMCloseActiveMDIForm(var Msg: TMessage);
begin
ActiveMDIChild.Close;
end;
end.
Defunct (2004-07-11 04:32:00) [12]1)как мне отловить нажатие на какаую-либо кнопку ToolButton
ToolBottom.OnClick := <Метод созданной формы>;
2)потом найти по названию, нажатой кнопки ToolButton, mdi-окно
Это отпадает, как следствие первого.
3)послать команду на pазвёpтывание mdi-окна
Это тоже отпадает, как следствие первого. Форма сама себя выдвигает на передний план.
4)Пpи уничтожении mdi-окна уничтожить ей соответсвующую кнопку с ToolBar-а
ToolButton.Free?
Предварительно сохранив на форме указатели на соответствующие ей кнопки.
KilkennyCat (2004-07-10 20:52:00) [13]ToolBar1.ButtonCount - число кнопок, верно. Только вот это число начинается с 0, а не с единицы.