Конференция "Компоненты" » Что взять за основу создания компонента?
 
  • Abcdef123 (13.08.13 08:15) [0]
    Здравствуйте, Мастера.
    Хочу создать компонент, и ведь самое главное изначально пойти правильным путем, но, совершенно не знаю, какой компонент я должна принять за основу, какие нужные мне события/свойства/методы родителя надо сделать доступными, чтобы функциональность постановленной задачи была полностью реализована. Это мой первый опыт, поэтому я решила попросить совета направить меня изначально в правильное русло.
    Проясню, что мне нужно. Хочу создать компронент в основе которого будет во-первых -TcxGrid с тремя уровнями-Views: DBTableView, DBCardView, DBChartView. (причем,чтобы на инхеритед копоненте была возможность удалять какие то(использовать не обызательно все 3).
    2. К этой TcxGrid надо подвязать две TPopupMenu (если кликнуть на заголоке колонки, то всплывает PopupMenu1 (например пункты переименовать колонку, скрыть колонку), если кликнуть на ячейке данных , то всплывает PopupMenu2 (добавить новую запить, удалить запись, сохранить лайот, загрузить лайот, зкспортировать в эксель, ...)
    3. При использовании этого компонента, чтобы выполнялось следующее: если в дизайнере на инферитед форме с этим компонентом в гриде созданы колонки, то чтобы в рантайме они и использовались, а если не созданы, то в рантайме чтобы были созданы колонки на все поля автоматически в соответствии с количеством полей подключенного к гриду датасета.
    Вот, пожалуй и всё (есть еще правда кое что по мелочи – к примеру определение стилей в гриде и т.д). Я хочу создать этот компонент и потом с его использованием создам форму-темплейт, которую могу использовать во всех проектах (чтоб однотипно было и поддерживать было бы легко, так как менять в одном месте надо будет только, и не пересоздавать экзешники при изменении компонента, так как я экзешники с рантаймами билионеками делаю).
    Теперь по созданию...я так полагаю, что поскольку у меня видимые компоненты, то было бы быстрее использовать основу – видимый объект типа фрейма, панели...(уж очень муторно если всё вручную определять (каждый элемент грида, меню, событие ....) Я правильно рассуждаю? Если да, то какой именно компонент вы посоветуете использовать как родитель и как это здесь?  (к примеру, я не нашла в списке инсесторов класс фрейм)
    И еще, прокомментируйте, пожалуйста, остальные пункты моего описания функциональности. Что мне важно еще прописать/определить, чтобы всё работало?
    Буду очень благодарна за любой дельный совет.
    Заранее спасибо,
    Надежда
  • DimaBr © (13.08.13 10:12) [1]
    За основу можно взять TWinControl.

    cxGrid - очень сложный компонент чтобы создавать для него наследника, да ещё и с нулевыми знаниями в создании компонентов.
    Фреймы возможно вам помогут, но судя по постановке задачи лучше вообще отказаться от некой универсальности в сторону отдельных гридов. Думаю, что это значительно сократит объём кода и упростит дальнейшую отладку.

    P.S. Написанный мною компонент(справочник) на основе cxGrid занимает приблизительно 6500 сток кода
  • Abcdef123 (13.08.13 12:16) [2]
    To [1] "судя по постановке задачи лучше вообще отказаться от некой универсальности в сторону отдельных гридов" - Извините, не уверена, что правильно поняла вашу фразу, поэтому хочу уточнить - то есть вы имеете в виду, что в моем случае не имеет смысла создавать свой компонент, а просто использовать cxGrid. Правильно я поняла?
  • DimaBr © (13.08.13 23:45) [3]
    Перечитал постановку задачи заново. Скорее всего лучше унаследоваться от TcxGrid.
    Попробуйте сделать наследника хотя бы с одной вьюшкой.
  • Abcdef123 (14.08.13 04:44) [4]
    to [3] Если наследовать от TcxGrid, то создается просто unit, то есть это значит, я должна всё вручную прописать (создание грид и ее элементов, создание двух TPopupMenu и каждого Item, ...события), я правильно понимаю? (то есть взять и бросить готовые эти компоненты я не могу, поскольку некуда бросать)
  • DimaBr © (14.08.13 10:35) [5]
    В новом Юните вы пишите
    TMyGrid = class(TcxGrid)

    end;


    Далее регистрируете новый компонент в палитре
    RegisterComponents(NamePage,[TMyGrid]);



    После этого, когда проинициализируете свой новый компонент и кините его на форму и убедитесь что всё в порядке, добавляете в КОНСТРУКТОР нужные элементы
  • Abcdef123 (14.08.13 12:42) [6]
    Вы меня не правильно поняли, так что я прошу прощение за свое "косноязычие" предыдущего сообщения. Когда я писала "...поскольку некуда бросать", я не имела в виду использование моего готового нового компонента, я имела в виду процесс добавления нужных элементов в этот мой новый компонент.
    TMyGrid = class(TcxGrid)
      public
        PopupMenu1: TPopupMenu;
        PopupMenu2: TPopupMenu;
    //еще что то...
        constructor Create(AOwner: TComponent); override;
    end;
    constructor TMyGrid.Create(AOwner: TComponent);
    begin
     inherited Create(AOwner);
    PopupMenu1:= TPopupMenu.Create;
    и дальше вручную прописывать каждый элемент меню типа   PopupMenu1.Items.Add(Item);   ??
    и всё остальное также все кодом прописывать надо то что мне нужно, да? Ведь я не могу использовать готовый экземпляр компонента TPopupMenu, поскольку TcxGrid - ансестор моего нового компонента не компонент-контейнер, на который я могла бы просто бросить менюшку (как на форму, к примеру) в процессе СОЗДАНИЯ моего компонента (а не использования - вы написали мне как надо использовать)

    PopupMenu1.
    end;
  • DimaBr © (14.08.13 14:36) [7]
    Да, правильно, нужно создавать менюшки в конструкторе и уничтожать в деструткторе
 
Конференция "Компоненты" » Что взять за основу создания компонента?
Есть новые Нет новых   [118444   +30][b:0][p:0.001]