Текущий архив: 2004.08.01;
Скачать: CL | DM;
ВнизУправление mdi-окнами Найти похожие ветки
← →
SeDOy (2004-07-10 19:51) [0]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] ?
← →
KilkennyCat © (2004-07-10 20:52) [1]ToolBar1.ButtonCount - число кнопок, верно. Только вот это число начинается с 0, а не с единицы.
← →
Defunct © (2004-07-11 04:32) [2]1)как мне отловить нажатие на какаую-либо кнопку ToolButton
ToolBottom.OnClick := <Метод созданной формы>;
2)потом найти по названию, нажатой кнопки ToolButton, mdi-окно
Это отпадает, как следствие первого.
3)послать команду на pазвёpтывание mdi-окна
Это тоже отпадает, как следствие первого. Форма сама себя выдвигает на передний план.
4)Пpи уничтожении mdi-окна уничтожить ей соответсвующую кнопку с ToolBar-а
ToolButton.Free?
Предварительно сохранив на форме указатели на соответствующие ей кнопки.
← →
Arm79 (2004-07-11 12:14) [3]ниже вырезанный текст модуля для 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.
← →
Galera (2004-07-11 14:18) [4]Презентую компонент как раз для этих целей
← →
Galera (2004-07-11 14:19) [5]Удалено модератором
Примечание: Не заюивай форум такими большими кусками кода, а посылай его прямо корреспонденту
← →
Galera (2004-07-11 14:20) [6]Удалено модератором
← →
Galera (2004-07-11 14:20) [7]Удалено модератором
← →
Galera (2004-07-11 14:25) [8]Это все добро: компонент TMDIPanel - закладка Win32
устан"овите без проблем
по сути дела это TPanel на которой располагаются кнопки TSpeedButton или подобные, и эта панель делает все что вам нужно.
располагается внизу формы
подобно панели в 1С
будут вопросы - пишите
← →
Galera (2004-07-11 14:29) [9]И кстати,
достаточно только установить компонент и положить его на MDI-форму,
больше ничего не надо делать
компонент сам перекрывает оконные функции и отлавливает месседжи
← →
Denis_Visma (2004-07-12 09:41) [10]Спасибо за компонент, классная штуковина
← →
evvcom © (2004-07-12 09:56) [11]Беглый взгляд:
> 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;
Это, кстати, тоже в массив можно запихать (параметры) и написать всего один обработчик.
← →
Galera (2004-07-12 13:03) [12]
> evvcom © (12.07.04 09:56) [11]
Согласен.
если хочешь можешь доделать-переделать, я не против :-)
Модератору:
Дико извиняюсь.
← →
Magikan © (2004-07-19 05:27) [13]Можно мне на мыло эту компоненту закинуть? Пожалуйста...
Страницы: 1 вся ветка
Текущий архив: 2004.08.01;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.034 c