-
господа, доброе время суток. пишу нечто среднее между valuelisteditor-ом и drawgrid-ом с возможность приклеивать к произвольной ячейке, свой собственный редактор (комбобокс, чекбокс, календарик, колордиалог и прочую фигню). Естественно все это хранится в свойстве Editors:tcollection который правится штатным редактором коллекций. Но штатный ретактор может править итемы только какого нибудь одного класса. и так вопрос занимался кто-нибудь созданием сабжа. и если занимался то проконсультируйте если не лениво. ЗЫ. компонентик получился заглядение а вот редактор.. ну скажем так.. хреновенький.
-
Смотри в направлении TPropertyEditor, как и что там работает - куча литературы. Наработок на эту тему тоже куча и маленькая тележка.
-
В вашем случае нужно смотреть не в сторону TCollection, а в сторону НЕиконных компонентов, по типу TDataSet-TField, TActionList-TAction, TMenu-TMenuItem и т.д.
-
> dinulya © (11.05.10 14:34)
Можно и через коллекцию.
> Естественно все это хранится в свойстве Editors:tcollection
К каждой колонке можно приклеить свойство "тип редактора" (или даже сразу "класс редактора"), что тоже позволит создавать его "на лету". Тогда коллекция редакторов вполне прокатывает.
> Но штатный ретактор может править итемы только какого нибудь одного > класса.
У Вас все итемы и будут одного класса - TMyCollectionItem. Если делать так, как говорилось выше, то этот класс должен содержать в себе свойство типа TComponentClass. Но это свойство можно сделать и прямой ссылкой на внешний компонент-редактор, поскольку "комбобокс, чекбокс, календарик, колордиалог и прочая фигня" - это все TComponent.
-
2Юрий Зотов "колордиалог и прочая фигня" - это все TComponent."
нет это не ткомпоненты, механизм ввода отрабатывется самим гридом.
-
> dinulya © (22.06.10 11:03) [4] > нет это не ткомпоненты, механизм ввода отрабатывется самим > гридом.
Как правило механизм ввода грида основан на использовании InplaceEditor (см. TCustomGrid.InplaceEditor), который зависит от того, какой редактор ввода захочет увидеть разработчик компонента для данной конкретной ячейки, т.е. "прочая фигня". Судя по описанию задачи, элемент коллекции должен содержать информацию о координатах ячейки к которой относится, о типе данных ячейки или о типе редактора, и возможно, текстовое описание содержимого ячейки. В таком случае, все элементы коллекции будут однотипными.
-
> dinulya © (22.06.10 11:03) [4]
Уверяю Вас - это все TComponent.
Но я бы все равно компоненты-редакторы делать не стал, а пошел бы первым путем (о котором и Наиль тоже говорит). Собственно, без разницы, будет ли редактор реализован, как внутренний класс или как внешний компонент - но во втором случае форма будет "засорена" редакторами, что нехорошо.
-
Можно редакторы-компоненты хранить в одном списке, а коллекции ячеек (или колонок) отдельно. Тогда один рекактор можно будет назначать разным колонкам. Если же список редакторов вынести в отдельный компонент, тогда возможно будет иметь один набор редакторов для сотни гридов, то есть для всего приложения.
-
Лучше таки не хранить список редакторов, а создавать редактор нужного класса в момент когда началось редактирование, и уничтожать его по завершении редактирования. Останется только сохранить для каждой ячейки некий указатель на код создания экземпляра - либо через классовую ссылку, либо еще как нибудь. Тогда состояние редактора будет сбрасываться каждый раз, и вероятность ошибок снизится. А если делать совсем по хорошему, то неплохо было бы дать возможность пользователям компонента регистрировать свои собственные классы редакторов.
-
Во, придумал: Объявляем интерфейс IInplaceEditor, делаем в нем нужные с точки зрения грида (который будет им управлять) методы, типа SetBounds, Hide, и прочая и вешаем на грид событие OnGetInplaceEdit = procedure(Sender: TMyGrid; ACol, ARow: Integer; var Editor: IInplaceEditor) of object; И пусть вешают свои обработчики, в которых создают эдитор сами (можно опубликовать несколько готовых реализаций интерфейса для простых случаев), а разрушаться он будет сам по потере всех ссылок
-
Посмотрите на DevExpress. Каждая колонка может иметь собственный редактор, а так же есть компонент со списком редакторов, которые можно назначать колонкам
|