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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2013, 23:35   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию TPageControl и TFrame. Динамическая организация.

Доброго времени суток!

Слева окна программы, находятся этакий туллбар с кнопками, справа 1 сплиттер и TPageControl.

При клике на опр. кнопку: в PageControl'е, рождается вкладка а на ней фрейм, и все это таким кодом:
Код:
procedure TMainForm.ColorsBtnClick(Sender: TObject);
var
  Sheet: TTabSheet;
  Frame: TDogColorsEditorFrame;
begin
  CloseSheet;
  Sheet := TTabSheet.Create(PC);
  Sheet.PageControl := PC;
  Sheet.OnShow := SheetsShow;
  Sheet.OnHide := SheetsHide;
  Sheet.Parent := PC;
  Sheet.TabVisible := True;
  Sheet.Tag := TAG_ITEM_COLORS;
  Sheet.Caption := 'Редактор: Окрас собак';
  Frame := TDogColorsEditorFrame.Create(Sheet);
  Frame.Parent := Sheet;
  Width := PC.Left + Frame.Width + 25;
  Height := Frame.Height + 40;
  Frame.Align := alClient;
  Sheet.Visible := True;
  PC.ActivePage := Sheet;
end;
Возникшие вопросы:
1. Как правильно организовать программу с фреймами? Как вы это делаете? Несколько фреймов у меня не будет, будет 1 вкладка и на ней будут меняться фреймы(Да я заметил, что делаю лишнюю работу в коде, создавая вкладку заново).

2. Как динамически менять размер формы в соотв. с размером фрейма? Я правильно делаю? Можно что-то лучше сделать?

3. Мне необходимо при создании фрейма что-то сделать конкретно для него и что-то сделать при его смерти.
Как?

Я приспособил к этому делу TAG свойство TabSheet'а. И думал через ActivePage.Tag понимать что сейчас за фрейм и делать действия в OnShow, OnHide вкладки.
Но почему-то это не работает.

Есть альтернатива?

Последний раз редактировалось Человек_Борща; 11.01.2013 в 23:38.
Человек_Борща вне форума Ответить с цитированием
Старый 12.01.2013, 14:53   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Есть идеи?
Человек_Борща вне форума Ответить с цитированием
Старый 12.01.2013, 15:38   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как вы это делаете?
Я именно создаю новую вкладку, и на ней новый фрейм.
Цитата:
Как динамически менять размер формы в соотв. с размером фрейма?
ИМХО лучше не форму менять а просто дать возможность использовать Скроллы фрейма.
Цитата:
3. Мне необходимо при создании фрейма что-то сделать конкретно для него и что-то сделать при его смерти.
Как?
Если сам фрейм не в курсе что нужно делать, то создай в нем некое событие published, которое будет вызываться:
При креации
Код:
begin
 if Assigned(OnMeCreate) then OnMeCreate(self)
end;
При деструкции
Код:
begin
 if Assigned(OnMeDestroy) then OnMeDestroy(self);
end;
Это событие ты можешь назначать при создании:
Код:
Frame:=TMyFrame.Create(self,MeCerate);
Frame.OnMeDestroy:=MeDestroyFoo;
Где MeCerate и MeDestroyFoo обработчик типа TNotifyEvent;

Еще такой момент - может стоит подумать в сторону MDI?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.01.2013, 16:19   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

По скольку у меня всегда 1 фрейм в работе, то я сделал проще:
Вкладка тоже всегда 1 и по этому нет нужды её пересоздавать.

При создании фрейма: в свойство tag идет некий идентификатор, который определяет что за фрейм сейчас работает.
Код:
var
  btn: TButton ABSOLUTE Sender;
begin
  FrameSheet.Hide; // Destroy previous frame
  FrameSheet.Tag := TAG_ITEM_COLORS; // Resetup frame id
  FrameSheet.Caption := 'Редактор: ' + btn.Caption;
  Frame := TDogColorsEditorFrame.Create(FrameSheet);
  Frame.Parent := FrameSheet;
  // Make form compatible with frame
  Width := PC.Left + Frame.Width + 25;
  Height := Frame.Height + 60;
  //
  Frame.Align := alClient;
  FrameSheet.TabVisible := True;
  FrameSheet.Show; // init current frame
  PC.ActivePage := FrameSheet;
end;
В качестве аналогов OnCreate, OnDestroy я приспособил OnShow, OnHide от TabSheet'а.
Код:
...
    TAG_ITEM_COLORS:
      begin
        cmp := Sheet.FindComponent('DogColorsEditorFrame');
        if cmp<> nil then
        begin
          DogColorList.ListView := (cmp as TDogColorsEditorFrame).ColorsLV;
          DogColorList.Visible := True;
        end;
      end;
...

Последний раз редактировалось Человек_Борща; 12.01.2013 в 16:48.
Человек_Борща вне форума Ответить с цитированием
Старый 12.01.2013, 17:10   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем PageControl c одной вкладкой? Фрейм и на TPanel к примеру можно выкладывать. А сколько вариантов фреймов? Если не много, то можно в PageControl создать соответствующее число вкладок и управлять видимостью через TabVisible обойдясь без фреймов. Не так уж и много доп.памяти сожрется
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.01.2013, 17:19   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вкладка тоже всегда 1 и по этому нет нужды её пересоздавать.
Стесняюсь спросить, может ни фрейм ни вкладка тогда не нужны, раз они в единственном числе?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.01.2013, 21:09   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Аватар, смотря как смотреть. Есть очень "весомые" вкладки.
Вариант всего 1 окна удобен да и опыт работы в фреймами и вкладками весьма кстати
Stilet, удобство всего 1 окна без модальных форм и форм в целом.


Со своей проблемой я разобрался. Возьму к примеру QIP и Miranda , каким образом там организовано управление и разность данных и опций для отдельных вкладок(каждому своё)?

Последний раз редактировалось Человек_Борща; 12.01.2013 в 21:21.
Человек_Борща вне форума Ответить с цитированием
Старый 12.01.2013, 21:31   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А пес их знает...
Свое что-то сделано, но я делаю на каждую "учетную" отдельный набор компонентов.
Памяти не так много кушается, зато возни меньше, чем если бы переключаться между данными используя всего один набор для всех.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с TFRame в своих компонентах smolbars Компоненты Delphi 0 04.02.2012 17:29
TFrame MAZADA Общие вопросы Delphi 3 22.10.2010 00:51
TpageControl+SynEdit DimOn4Ik Общие вопросы Delphi 10 02.01.2010 01:35
TPageControl Kycaka Общие вопросы C/C++ 1 29.05.2009 15:14
Обработка wm_keydown если на форме присутствует TFrame Oburec Компоненты Delphi 1 13.04.2009 10:01