-
Для чего мне это нужно.
Есть компонент, одно из свойств которого - TCollection. Есть необходимость обращаться к конкретным элементам коллекции. Я даже сделал свойство Name для TCollectionItem и поиск по имени у TCollection.
Мне хочется, чтобы все TCollectionItem-ы содержались в классе формы, аналогия с TMenuItem.
-
1. Сделать некомпонентский класс компонентским невозможно.
2. А в данном случе - и не нужно. После того, как компонент - владелец коллекции будет положен на форму, форма и так будет содержать все элементы этой коллекции. Только не напрямую, а через этот самый компонент и его коллекцию (что не мешает).
3. Если нужно, чтобы элементы коллекции сохранялись в DFM, сделайте коллекцию в компоненте published свойством.
-
> Юрий Зотов © (13.01.08 21:49) [1]Представьте... Есть форма, у которой есть свойство Items (TCollectoin). В редакторе свойств я добавляю элемент, элементу автоматически присваивается имя ( Name ) "Item1", а в TMyForm1 появляется поле Item1: TItem; Как этого добиться?
-
Никак. Для того, чтобы элемент коллекции появлялся и исчезал, как поле формы (аналоги - TMenuItem, TField...), он должен быть компонентом. А компонентом он быть не может. И от добавления ему свойства Name ничего не изменится.
И незачем это. Потому что элементы коллекции среде и так доступны - через владельца коллекции (которым, кстати, может быть и сама форма).
-
> Юрий Зотов © (13.01.08 23:08) [3]
Я прекрасно понимаю, что TCollectionItem не может стать TComponent-ом по определению. Я прошу посоветовать, как мне наилучшим образом справиться с проблемой.
Нет ли какого-нибудь аналогичного класса, имеющего похожий редактор, но работа велась бы с TComponent-ами ?
Или может быть как то через кодо-генереторы ? О_о?
-
Может Delphi позволяет как-то изменять/добавлять строки в published-секции ?
-
> DevilDevil (13.01.08 23:19) [4] Чтобы посоветовать, как наилучшим образом справиться с проблемой, нужно понимать саму проблему. Пока я ее не только не понимаю, но и вообще никакой проблемы не вижу (вернее, вижу проблему надуманную, а такие проблемы всерьез не рассматриваю). Элементы коллекции создаются и уничтожаются, они доступны и среде, и коду, все нормально работает - и нет практически никакой разницы, как писать: 1. Как сейчас: Form.Component.Collection.Items[0]
или
Form.Component.Collection[0] 2. Как будет, если владельцем коллекции сделать саму форму: Form.Collection.Items[0]
или
Form.Collection[0] 3. Так, как Вы хотите, но непонятно, зачем: Form.Items[0]
Впрочем, можно попробовать в варианте 2 сделать коллекцию дефолтным свойством формы - тогда, по идее,тоже получим вариант 3.
Если задача состоит в том, чтобы обращаться к элементам коллекции по их именам, а не по индексам, то можно добавить в коллекцию свойство со строковым индексом (по аналогии с TStringList.Values). Далее - по варианту 1 или 2, только в квадратных скобках будет уже не число, а имя нужного элемента.
Если ничего из этого не годится, то опишите первичную задачу - что вообще нужно получить в итоге? Только не надо повторять то, что Вы уже говорили, я это прочел и понял. А вот "на фига оно надо" - не понял.
-
Сорри, забыл тег закрыть после Form.Items[0] > DevilDevil (14.01.08 00:03) [5]> Может Delphi позволяет как-то изменять/добавлять строки > в published-секции ? Она сама это делает, когда на форме повляется компонент (или удаляется, или переименовывается). Причем без разницы, положили этот компонент туда руками (из палитры), или его создала среда (редактор пунктов меню, редактор полей и т.п.). Но это должен быть именно компонент, с элементом коллекции такое не прокатит.
-
> Юрий Зотов © (14.01.08 01:16) [7]Да, задача у меня нестандартная, поэтому и понять "зачем" сложно. Рассматриваемая коллекция в моих формах - самая важная чтука. Причём коллекция не рассматривается как массив однородных данных; в программе происходит обращение к конкретному элементу этого "массива", отсюда и появилось однозначно идентифицирующее свойство Name . Почему тогда коллекция, а не просто компонентов накидать? Причин несколько: - коллекция позволяет визуально компактно расположить элементы, а куча компонентов (около 15) визуально будет мешать - коллекция позволяет задать порядок (что в моём случае крайне важно) - в редакторе коллекции имеется возможность добавлять описание, что очень даже полезная фича
-
Мне кажется вам коллекция не нужна. Посмотрите на TActionList
-
> DimaBr © (14.01.08 09:12) [9]
Посмотрел... Да, немного похоже, только намного сложнее, чем мне надо. Может ещё какие варианты?
-
> DevilDevil © (14.01.08 11:01) [10]
Варианты чего? Что нужно-то?
Обращение к элементу по имени? Так уже было сказано, как это сделать.
Еще что-то? Тогда что?
-
Ничего сложного нет Вот ваши требования
> - коллекция позволяет визуально компактно расположить элементы, а куча компонентов (около 15) визуально будет мешать > - коллекция позволяет задать порядок (что в моём случае крайне важно) > - в редакторе коллекции имеется возможность добавлять описание, что очень даже полезная фича
1. Не коллекция а редактор коллекции 2. Порядок = порядку считывания из ресурса 3. Не понял вообще
-
> [8] >а куча компонентов (около 15) визуально будет мешать компоненты TMenuItem и TField - на форме не видны
-
потерял я веру. Может быть существует какой-нибудь TComponentCollection ? Всё, что я нашёл либо не работает либо не имеет хорошего редактора. Ну или хитрым образом как-то можно модернизировать TCollection? > компоненты TMenuItem и TField - на форме не видныв том то и задача, чтобы было 15 компонентов, порядок их можно задавать произвольный, а редактировать в DesignTime посредством редактора аналогичного редактору TCollection. > 3. Не понял вообщеTCollection позволяет делать такое: http://devilhome.narod.ru/description.png (пользуясь случаем, Юрий, спасибо за статью)
-
-
Решение очень простое Вы уже написали компонент с коллекцией обьектов, следовательно остаётся нарисовать редактор этой коллекции который: 1. при выборе элемента коллекции выбирал Object на форме и соответственно в инспекторе 2. в дополнительном окне (в редакторе) отображал свойства и значения самого элемента коллекции.
В принципе готовый редактор есть в сырцах делфи остаётся его немного видоизменить и вызвать для своей коллекции.
-
Дополнительное окно даже не нужно. И коллекция тоже не нужна. Все делается по аналогии с полями.
Целевые компоненты делаются невидимыми (аналоги полей). Пишется компонент-контейнер таких невидимых компонентов. (аналог TDataSet). К нему пишется редактор (аналог редактора полей). В редакторе (и в дизайнере формы) выбирается невидимый компонент, который отображается в самом инспекторе.
-
> DimaBr © (17.01.08 11:41) [16] > Юрий Зотов © (17.01.08 18:36) [17]
Если честно, относительно сложно для понимания... но я стараюсь :)
> Пишется компонент-контейнер таких невидимых компонентов. > (аналог TDataSet). К нему пишется редактор (аналог редактора > полей). В редакторе (и в дизайнере формы) выбирается невидимый > компонент, который отображается в самом инспекторе.
Опишите, пожалуйста, по подробнее. Почти ни слова не понимаю.
-
Моя проблема в принципе решается, если вручную делать примерно так: TMyForm1 = class(TMyForm)
SomeComponens...
SomeEvents...
private
public
published
WaterFigures: TMyCollectionItem;
...
end; Ну и потом, в TMyForm.Loaded , имея Name элемента коллекции, присваивать published-полям соответствующие значения. Вопрос: возможно ли написать кодогенератор, который автоматически редактировал бы мою published-секцию ?
|