Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

Управление 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.099 c
4-1087046455
juiceman
2004-06-12 17:20
2004.08.01
АПИ-функции для работы с оборудованием


14-1089915956
Piter
2004-07-15 22:25
2004.08.01
Что на улице творится... ужас!


1-1090240503
Комбинатор
2004-07-19 16:35
2004.08.01
Можно ли заблокировать ShowMessage.


14-1089450666
Aldor_
2004-07-10 13:11
2004.08.01
Использование функции из kernel32.dll, которой нет в заголовках


1-1090302808
[BAD]Angel
2004-07-20 09:53
2004.08.01
Как побороть EXCEPTION?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский