Конференция "Компоненты" » Компонент, содержащий фреймы.
 
  • Kolan © (30.10.08 17:57) [0]
    Здравствуйте,
     Стоит задача, не знаю с чего начать. Нужно сделать компонент схожий в работе с TPageControl, но каждая закладка которого была бы отдельным фреймом. То есть при вызове функции New Page, аналогичной ПэйджКонтроловской, должен добавляться новый пустой фрейм со своим модулем и т. д.

    С чего начать? И на сколько это трудоёмкая задача, как вы считаете?
  • Сергей М. © (31.10.08 08:56) [1]

    > С чего начать?


    Вестимо с чего - с шаблона, генерируемого с пом.меню "Component -> New Component"


    > на сколько это трудоёмкая задача


    Если наследоваться прямо от TPageСontrol, то задача практически плевая
  • Kolan © (31.10.08 09:53) [2]
    Хорошо, шаблон сгенерировал. Как теперь сделать, чтобы при вызове команды New Page создался фрейм всесте с новым *.пас файлом?
  • Сергей М. © (31.10.08 09:58) [3]
    А, ты вон о чем ..

    Под это придется новый IDE-эксперт писать и регистрировать ..
  • Сергей М. © (31.10.08 10:27) [4]

    > Kolan


    Написание соотв.эксперта, конечно, забот добавит, но это и не такое уж сложное дело
  • b z (31.10.08 10:43) [5]
    Интересно, а зачем такое надо? сори за офтоп
  • Kolan © (31.10.08 10:45) [6]
    Раз задача прояснилась, повтарюсь — с чего начать?.
  • Kolan © (31.10.08 10:50) [7]
    b z, мне контролы на закладках часто работают независимо от контролов на других закладках, а код все равно приходится пихать в одну и ту же форму — это неудобно.
  • Сергей М. © (31.10.08 10:54) [8]

    > Kolan ©   (31.10.08 10:45) [6]


    По-любому начинать нужно с компонента.
    Эксперт - это второй этап
  • DimaBr © (31.10.08 11:07) [9]
    Постановка задачи вообще не ясна.
    С одной стороны нужен многовкладочный компонент, а с другой стороны фрэйм.
    Использование компонента вообще приводит в тупик: если вы хотите избавиться от написания всего кода в одном модуле, то такой вариант вообще не подходит, поскольку только родитель находится в отдельном модуле, а наследники, брошенные на форму, всё равно в одном модуле.

    Если не затруднит, разъясните пожалуйста идею вашей задумки.
  • b z (31.10.08 11:10) [10]

    > код все равно приходится пихать в одну и ту же форму — это
    > неудобно
    А, просто раскидать на разные фреймы, а фрэймы уже на закладки - не вариант? Я к тому что есть ли целесообразность в таком контроле?
  • b z (31.10.08 11:11) [11]

    > целесообразность в таком контроле?
    * целесообразность в написании такого контрола?
  • Сергей М. © (31.10.08 11:13) [12]

    > DimaBr ©   (31.10.08 11:07) [9]


    Подозреваю, что автор клонит в сторону дизайн-тайм-генерации различных классов фреймов ..
  • Kolan © (31.10.08 12:40) [13]
    > Если не затруднит, разъясните пожалуйста идею вашей задумки.

    Попробую.
    Идея
    Для примера возьмем пэйджконтрол с двумя закладками. На одной из закладок кнопка и эдит. По клику на кнопке в эдит вводится значение. Взаимная работа кнопки и эдита никому больше не нужна и я хочу убрать этот код из модуля формы.

    Как я вижу работу
    Пользователь кидает на форму компонент по виду похожий на пэйджконтрол без табов. При вызове функции New Page создается новая страница, и у этой страницы должен быть свой модуль для кода. Хорошо бы, чтобы дизайнить можно было прямо на форме, то есть код отдельно, а дизайн вместе.

    Идеи реализации
    Как создать модуль — хз, отсюда и идея с фреймами.

    b z в посте [10] правильно описал то, что я хочу сделать, только все это должно быть в компоненте.
  • DimaBr © (31.10.08 14:00) [14]
    То есть вы хотите одну форму с компонентами и 100 модулей с описанием их взаимодействий ?
  • Kolan © (31.10.08 14:48) [15]
    Да, только не сто, а столько сколько страниц на нем.
  • DimaBr © (31.10.08 15:00) [16]
    Это противоречит идеалогии "одна форма - один модуль"
  • Kolan © (31.10.08 15:02) [17]
    Ну и что? Если на форму положить фрейм, то этот принцип тоже будет нарушен.
  • DimaBr © (31.10.08 15:56) [18]
    Ничего подобного, при создании фрейма создаётся новый модуль (форма+код)
  • Kolan © (31.10.08 16:15) [19]
    Не понял, что под формой вы подразумеваете и фреймы тоже.
    Я допускаю, что отделить модули от формы не получится. Пусть, пусть это выглядит как форма + код, как я говорил в [0]. Как их собрать в компонент и создавать из него?
  • atruhin © (04.11.08 17:52) [20]
    > Как их собрать в компонент и создавать из него?

    Тебе уже сказали - писать эксперт. Только если делать, то во вкладки вставлять не фрэймы,
    а формы. Т.к. с фреймами есть глюки, по крайней мере от d7 до rad studio 2007 включительно.
    Вообще давно использую такой подход, только не понимаю, зачем тут эксперт.
    Один раз написал CustomXXX форму, которая встраивается в TCustomWindow, включил в проект,
    далее File-New-Other-Inheritable Items, выбираем форму, задаем имя, и добавляем одну строку в
    OnCreate. Получаем на 1-2 движения больше чем в твоем варианте.
  • Kolan © (05.11.08 12:53) [21]
    А что значит «встраивается»? И что такое TCustomWindow?
  • atruhin © (05.11.08 15:05) [22]
    > А что значит «встраивается»?

    Т.е. визуально и функционально ведет себя как и фрэйм.
    >И что такое TCustomWindow?

    Имел ввиду наследника TWinControl.
  • Kolan © (05.11.08 15:49) [23]
    > Т.е. визуально и функционально ведет себя как и фрэйм.

    А как это сделат — вот что я не понял...

    Есть у меня форма, на которой я хочу создавать «страницы». Создаю новую форму, называю ее CustomXXX. Что делать дальше?
  • atruhin © (06.11.08 17:49) [24]
    Вообще это хорошо описанно у Стива Тейксейра, Ксавье Пачеко - Delphi 5 Руководство разработчика, но смотри:

    unit untCustomWindow;

    interface

    uses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

    type
     TCustomWindow = class(TForm)
     private
       FAsChild : Boolean;
       FTempParent : TWinControl;
     protected
       procedure CreateParams (var Params : TCreateParams); override;
       procedure Loaded; override;
     public
       constructor Create (AOwner : TComponent;
                           AParent : TWinControl); reintroduce;
     end;

    implementation

    {$R *.dfm}

    constructor TCustomWindow.Create (AOwner : TComponent; AParent : TWinControl);
    begin
     FAsChild := true;
     FTempParent := AParent;
     inherited Create (AOwner);
    end;

    procedure TCustomWindow.CreateParams (var Params : TCreateParams);
    begin
     inherited;
     if FAsChild then
       Params.Style := Params.Style or WS_CHILD;
    end;

    procedure TCustomWindow.Loaded;
    begin
     inherited;
     if FAsChild then begin
       Align := alClient;
       BorderStyle := bsNone;
       BorderIcons := [];
       Parent := FTempParent;
       Position := poDefault;
     end;
    end;

    end.


    Включаем этот модуль в проект.
    Теперь когда тебе нужно создать новую форму (для вкладки), ты выбираешь File-New-Other-Inheritable Items,
    это в Delphi 2007, в старых, создаешь просто создаешь новую форму (например TMyWindow), и правиш:
    1. в pas файле, TMyWindow = class(TForm) -->>> TMyWindow = class(TCustomWindow)
    2. в dfm файле object MyWindow : TMyWindow ->>> inherited MyWindow : TMyWindow

    Далее там где нужен PageControl, кидаем его на форму, создаем вкладки, и в OnCreate формы пишем
    TMyWindow.Create(self, MyTabSheet);



    ВСЕ!! Получаем форму встроенную в MyTabSheet, аналогично фрэйму, но без его глюков.
  • alexrayne (30.09.09 17:34) [25]
    Удалено модератором
 
Конференция "Компоненты" » Компонент, содержащий фреймы.
Есть новые Нет новых   [134466   +3][b:0][p:0.001]