Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.049 c
14-1089823533
GanibalLector
2004-07-14 20:45
2004.08.01
Цены на авиабилеты и все такое...


6-1086176513
osama
2004-06-02 15:41
2004.08.01
Памажите сделать сервер средствами АПИ


3-1089015499
YA
2004-07-05 12:18
2004.08.01
Использование триггера при генерировании нового значения поля


1-1090295053
Eagle
2004-07-20 07:44
2004.08.01
DBGrid, ручное управление


1-1089880184
MegaVolt
2004-07-15 12:29
2004.08.01
Как из моей программы управлять TotalCommanderom?