-
Здравствуйте, Мастера. Хочу создать компонент, и ведь самое главное изначально пойти правильным путем, но, совершенно не знаю, какой компонент я должна принять за основу, какие нужные мне события/свойства/методы родителя надо сделать доступными, чтобы функциональность постановленной задачи была полностью реализована. Это мой первый опыт, поэтому я решила попросить совета направить меня изначально в правильное русло. Проясню, что мне нужно. Хочу создать компронент в основе которого будет во-первых -TcxGrid с тремя уровнями-Views: DBTableView, DBCardView, DBChartView. (причем,чтобы на инхеритед копоненте была возможность удалять какие то(использовать не обызательно все 3). 2. К этой TcxGrid надо подвязать две TPopupMenu (если кликнуть на заголоке колонки, то всплывает PopupMenu1 (например пункты переименовать колонку, скрыть колонку), если кликнуть на ячейке данных , то всплывает PopupMenu2 (добавить новую запить, удалить запись, сохранить лайот, загрузить лайот, зкспортировать в эксель, ...) 3. При использовании этого компонента, чтобы выполнялось следующее: если в дизайнере на инферитед форме с этим компонентом в гриде созданы колонки, то чтобы в рантайме они и использовались, а если не созданы, то в рантайме чтобы были созданы колонки на все поля автоматически в соответствии с количеством полей подключенного к гриду датасета. Вот, пожалуй и всё (есть еще правда кое что по мелочи – к примеру определение стилей в гриде и т.д). Я хочу создать этот компонент и потом с его использованием создам форму-темплейт, которую могу использовать во всех проектах (чтоб однотипно было и поддерживать было бы легко, так как менять в одном месте надо будет только, и не пересоздавать экзешники при изменении компонента, так как я экзешники с рантаймами билионеками делаю). Теперь по созданию...я так полагаю, что поскольку у меня видимые компоненты, то было бы быстрее использовать основу – видимый объект типа фрейма, панели...(уж очень муторно если всё вручную определять (каждый элемент грида, меню, событие ....) Я правильно рассуждаю? Если да, то какой именно компонент вы посоветуете использовать как родитель и как это здесь? (к примеру, я не нашла в списке инсесторов класс фрейм) И еще, прокомментируйте, пожалуйста, остальные пункты моего описания функциональности. Что мне важно еще прописать/определить, чтобы всё работало? Буду очень благодарна за любой дельный совет. Заранее спасибо, Надежда
-
За основу можно взять TWinControl.
cxGrid - очень сложный компонент чтобы создавать для него наследника, да ещё и с нулевыми знаниями в создании компонентов. Фреймы возможно вам помогут, но судя по постановке задачи лучше вообще отказаться от некой универсальности в сторону отдельных гридов. Думаю, что это значительно сократит объём кода и упростит дальнейшую отладку.
P.S. Написанный мною компонент(справочник) на основе cxGrid занимает приблизительно 6500 сток кода
-
To [1] "судя по постановке задачи лучше вообще отказаться от некой универсальности в сторону отдельных гридов" - Извините, не уверена, что правильно поняла вашу фразу, поэтому хочу уточнить - то есть вы имеете в виду, что в моем случае не имеет смысла создавать свой компонент, а просто использовать cxGrid. Правильно я поняла?
-
Перечитал постановку задачи заново. Скорее всего лучше унаследоваться от TcxGrid. Попробуйте сделать наследника хотя бы с одной вьюшкой.
-
to [3] Если наследовать от TcxGrid, то создается просто unit, то есть это значит, я должна всё вручную прописать (создание грид и ее элементов, создание двух TPopupMenu и каждого Item, ...события), я правильно понимаю? (то есть взять и бросить готовые эти компоненты я не могу, поскольку некуда бросать)
-
В новом Юните вы пишите TMyGrid = class(TcxGrid)
end;
Далее регистрируете новый компонент в палитре RegisterComponents(NamePage,[TMyGrid]); После этого, когда проинициализируете свой новый компонент и кините его на форму и убедитесь что всё в порядке, добавляете в КОНСТРУКТОР нужные элементы
-
Вы меня не правильно поняли, так что я прошу прощение за свое "косноязычие" предыдущего сообщения. Когда я писала "...поскольку некуда бросать", я не имела в виду использование моего готового нового компонента, я имела в виду процесс добавления нужных элементов в этот мой новый компонент. 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;
-
Да, правильно, нужно создавать менюшки в конструкторе и уничтожать в деструткторе
|