Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2009, 13:36   #1
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
Вопрос PageControl как панель кнопок открытых окон в MDI приложении

В общем необходимо реализовать в MDI приложении панельку, которая бы выполняла функции подобные панели задач в Windows, а именно:
1. создание кнопки соответствующей открытой дочерней форме
2. активация дочерней формы по щелчку связанной с ней кнопкой
3. удаление соответствующей кнопки при закрытии окна

Как создать программно кнопку и присвоить ей заголовок с иконкой я разобрался, а вот как сделать так чтобы при щелчке на определенной кнопки, становилась активной определенная дочерняя форма, а так же удалить кнопку после закрытия дочерней формы, я не могу разобраться. Помогите пожалуйста. Либо может есть какой-то компонент, выполняющий эту задачу???
Заранее спасибо!
Водку мы пьем для запаха - а дури нам своей хватает!
Vit@L вне форума Ответить с цитированием
Старый 18.12.2009, 06:54   #2
Zo0M
Пользователь
 
Регистрация: 09.07.2009
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Vit@L Посмотреть сообщение
В общем вопрос еще такой, можно ли как-то определить индекс вкладки по ее заголовку?
Я боюсь отвечать, я сделал, но оно как-то не так работает.
Вернее работает на создание, но не на удаление.
Сейчас ещё разбираюсь, думаю вечером выложу.

Да, я использовал не вкладка, а тулбар и на нём создавал кнопки.
Zo0M вне форума Ответить с цитированием
Старый 18.12.2009, 07:06   #3
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

Zo0M, спасибо огромное, буду очень признателен за помощь. Только вот если с тулбаром, тогда нужно чтобы если была активная форма, то соответствующая ей кнопка тоже становилась нажатой.
Водку мы пьем для запаха - а дури нам своей хватает!

Последний раз редактировалось Vit@L; 18.12.2009 в 07:16.
Vit@L вне форума Ответить с цитированием
Старый 18.12.2009, 07:34   #4
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

У меня как-то возникла задача - организовать в приложении кучу страничек. Использовал PageControl. Но он некрасивый. Надо было скрыть отображение вкладок. Нашел вследующее решение в виде компонента:
Код:
unit MyPageControl;
interface
uses
 SysUtils, Classes, Controls, ComCtrls, Types;

type
 TMyPageControl = class(TPageControl)
 private
   FHideTabs: boolean;
   procedure SetHideTabs(const Value: boolean);
   { Private declarations }
 protected
   procedure AdjustClientRect(var Rect: TRect); override;
 public
   { Public declarations }
   constructor Create(AOwner: TComponent); override;
 published
   { Published declarations }
   property HideTabs : boolean read FHideTabs write SetHideTabs default false;
   property Color;
   property ParentColor;
 end;

procedure Register;

implementation
procedure Register;
begin
 RegisterComponents('MyComponents', [TMyPageControl]);
end;

{ TMyPageControl }

procedure TMyPageControl.AdjustClientRect(var Rect: TRect);
begin
 inherited;
 if HideTabs and not (csDesigning in ComponentState) then
   begin
     Rect.Top := 0;
     Rect.Left := 0;
     Rect.Right := Width;
     Rect.Bottom := Height;  
   end;

end;

constructor TMyPageControl.Create(AOwner: TComponent);
begin
 inherited;
 FHideTabs := false;
end;

procedure TMyPageControl.SetHideTabs(const Value: boolean);
begin
 if FHideTabs = Value
   then exit;
 FHideTabs := Value;
 Invalidate;
end;

end.
Компонент позволяет скрывать вкладки + отступы по краям делать нулевыми. Теперь создавай свою панельку с кнопками и по нажатию на кнопку - просто активируй нужные странички. А насчет нажатых кнопок - рекомендую компоненты LbButtons - там есть есть свои TLbSpeedButton - у них есть свойства быть нажатами + несколько настроек цветов, что делает их довольно красивыми.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 18.12.2009, 08:01   #5
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

Ребята, спасибо большое всем тем, кто не прошел мимо сей темы. Я вроде бы разобрался с этой задачей сам. Стиль вкладок сделал кнопочный и поместил в самый низ родительской формы (пример как в 1С). Вот что у меня получилось:

1. Создание вкладки:
Код:
with PageControl1 do
         begin
            mytab:=TTabSheet.Create(Self);
            mytab.PageControl:=PageControl1;
            mytab.Caption:='Заголовок вкладки'
            mytab.ImageIndex:=номер картинки из ImageList;
            mainform.i1:=pagecontrol1.PageCount-1;
            pagecontrol1.ActivePageIndex:=i1;
         end;
2. Активиция окна при нажатии на вкладку(кнопку) PageControl'a:
Код:
procedure TMainForm.PageControl1Change(Sender: TObject);
begin
   if pagecontrol1.ActivePageIndex=i1 then Mdichild1.Show;
end;
3. При активации окна по строке заголовка, вкладка(кнопка) делается нажатой:
Код:
procedure Mdichild1.FormActivate(Sender: TObject);
begin
   PageControl1.ActivePageIndex:=i1;
end;
4. Удаление вкладки при закрытии окна:
Код:
PageControl1.ActivePage.Free;
Здесь я описал действия для одной дочерней формы. Для каждой формы я заводил свою переменную (i1, i2, i3 ....) причем расположил их в публичной части родительской формы, чтобы они были доступны другим формам.

Фу-у-у (вытирая пот со лба) ну вроде бы все. Может кому-то тоже пригодиться, пользуйтесь на здоровье

09:17

Кстати, нет, если форм получается больше 2-х то этот код работает не корректно на удаление.
В общем вопрос остается открытым.

У нас принято пользоваться кнопочкой "Правка", дабы не плодить посты подряд, друг за другом.
Модератор
Водку мы пьем для запаха - а дури нам своей хватает!

Последний раз редактировалось mihali4; 18.12.2009 в 12:45.
Vit@L вне форума Ответить с цитированием
Старый 18.12.2009, 16:24   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию Может пригодится

Лежит компонент тут http://decoding.narod.ru/download/mycomponent/main.html
Цитата:
MDIPanel (ver 1.1)
Компонент является менеджером дочерних окон в MDI приложении (своего рода аналог виндового TaskBar). Все возможности компонента можно увидеть в демонстрационном приложении, идущем в комплекте с компонентом.
MDIPanel
Alter вне форума Ответить с цитированием
Старый 21.12.2009, 07:46   #7
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

Модераторов прошу меня простить за многочисленные посты.
Alter, спасибо огромное за компонент, очень выручили.
Водку мы пьем для запаха - а дури нам своей хватает!
Vit@L вне форума Ответить с цитированием
Старый 21.12.2009, 10:29   #8
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Для выделения дочерней формы при нажатии на вкладку я делаю так:
При создании вкладки её полю Tag присваиваю ссылку на требуемую форму. Выглядит это примерно так:

Код:
myTabSheet := TTabSheet.Create(Self);
with myTabSheet do begin
  //... Выполнить инициализацию вкладки (родитель, цвет, стиль и т.д.)
  Tag := Integer(mdiChild1); // Связать вкладку и форму
end;
Теперь при возниконвении события TPageControl.OnChange можно обратиться к текущей вкладке и извлечь из поля Tag ссылку на форму, после чего с ней можно делать всё, что заблагорассудится (напр. сделать её активной)

Код:
procedure TfrmMain.PageControl1Change(Sender: TObject);
var
  tab:TTabSheet;
  frm:TForm; // ссылка на экземпляр класса 
    //     формы (в нашем случае - дочерней)
begin
  tab := (Sender as TPageControl).ActivePage;
  frm := TForm(tab.Tag); // Получить ссылку на связанную форму
  frm.Show; // Далее работаем с экземпляром так как потребуется
end;
Для удаления вкладок необходимо в главной форме (на ней, по-идее, находится наш TPageControl) отловить событие закрытия дочерней формы, внутри этого события найти вкладку у которой значение поля Tag привязано к закрываемой форме, после чего можно будет эту вкладку удалить.

Подобный подход весьма прост и лично я им пользуюсь в простых случаях, когда неохота заморачиваться на создание всяких списков для хранения кучи перекрёстных ссылок внутри компонентов.
Greek9000 вне форума Ответить с цитированием
Старый 21.12.2009, 14:36   #9
Vit@L
Форумчанин
 
Аватар для Vit@L
 
Регистрация: 24.06.2009
Сообщений: 216
По умолчанию

Цитата:
Для удаления вкладок необходимо в главной форме (на ней, по-идее, находится наш TPageControl) отловить событие закрытия дочерней формы, внутри этого события найти вкладку у которой значение поля Tag привязано к закрываемой форме, после чего можно будет эту вкладку удалить.
А можно это примером показать?
Спасибо!
Водку мы пьем для запаха - а дури нам своей хватает!
Vit@L вне форума Ответить с цитированием
Старый 22.12.2009, 07:58   #10
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Это работает примерно так:
TaskBar.zip

Правда там есть один нерешённый момент, а именно
frmChild.Show не активизирует найденное окно. Не знаю в чём причина.

И для упрощения кода я перенёс закрытие вкладки внутрь дочернего окна (путём добавления св-ва TfrmChild.LinkedTab).

В общем, скачаете - разберётесь.
Greek9000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список окон кнопок которые появляются на панели задач? Paul Hindenburg Win Api 6 20.02.2009 09:58
MDI приложения и PageControl.... maLoy*508 Общие вопросы Delphi 2 04.04.2008 02:28
Открытие файлов в MDI-приложении Eofol Общие вопросы Delphi 2 20.12.2007 22:05
Как сделать Панель задач для MDI окошек своего приложения? Angel86rus Общие вопросы Delphi 1 04.10.2007 15:15
Как создать программу-панель (как панель Msoffice), чтобы была поверх всех окон Romanbl4 Общие вопросы Delphi 6 27.06.2007 17:23