Конференция "Компоненты" » TComponent как элемент TCollection, возможно ли это ?
 
  • DevilDevil (13.01.08 20:26) [0]
    Для чего мне это нужно.

    Есть компонент, одно из свойств которого - TCollection. Есть необходимость обращаться к конкретным элементам коллекции. Я даже сделал свойство Name для TCollectionItem и поиск по имени у TCollection.

    Мне хочется, чтобы все TCollectionItem-ы содержались в классе формы, аналогия с TMenuItem.
  • Юрий Зотов © (13.01.08 21:49) [1]
    1. Сделать некомпонентский класс компонентским невозможно.

    2. А в данном случе - и не нужно. После того, как компонент - владелец коллекции будет положен на форму, форма и так будет содержать все элементы этой коллекции. Только не напрямую, а через этот самый компонент и его коллекцию (что не мешает).

    3. Если нужно, чтобы элементы коллекции сохранялись в DFM, сделайте коллекцию в компоненте published свойством.
  • DevilDevil (13.01.08 22:17) [2]
    > Юрий Зотов ©   (13.01.08 21:49) [1]

    Представьте...
    Есть форма, у которой есть свойство
    Items

    (TCollectoin). В редакторе свойств я добавляю элемент, элементу автоматически присваивается имя (
    Name

    ) "Item1", а в
    TMyForm1

    появляется поле
    Item1: TItem;



    Как этого добиться?
  • Юрий Зотов © (13.01.08 23:08) [3]
    Никак. Для того, чтобы элемент коллекции появлялся и исчезал, как поле формы (аналоги - TMenuItem, TField...), он должен быть компонентом. А компонентом он быть не может. И от добавления ему свойства Name ничего не изменится.

    И незачем это. Потому что элементы коллекции среде и так доступны - через владельца коллекции (которым, кстати, может быть и сама форма).
  • DevilDevil (13.01.08 23:19) [4]
    > Юрий Зотов ©   (13.01.08 23:08) [3]

    Я прекрасно понимаю, что TCollectionItem не может стать TComponent-ом по определению. Я прошу посоветовать, как мне наилучшим образом справиться с проблемой.

    Нет ли какого-нибудь аналогичного класса, имеющего похожий редактор, но работа велась бы с TComponent-ами ?

    Или может быть как то через кодо-генереторы ? О_о?
  • DevilDevil (14.01.08 00:03) [5]
    Может Delphi позволяет как-то изменять/добавлять строки в published-секции ?
  • Юрий Зотов © (14.01.08 01:10) [6]
    > 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, только в квадратных скобках будет уже не число, а имя нужного элемента.

    Если ничего из этого не годится, то опишите первичную задачу - что вообще нужно получить в итоге? Только не надо повторять то, что Вы уже говорили, я это прочел и понял. А вот "на фига оно надо" - не понял.

  • Юрий Зотов © (14.01.08 01:16) [7]
    Сорри, забыл тег закрыть после
    Form.Items[0]



    > DevilDevil   (14.01.08 00:03) [5]

    > Может Delphi позволяет как-то изменять/добавлять строки
    > в published-секции ?

    Она сама это делает, когда на форме повляется компонент (или удаляется, или переименовывается). Причем без разницы, положили этот компонент туда руками (из палитры), или его создала среда (редактор пунктов меню, редактор полей и т.п.). Но это должен быть именно компонент, с элементом коллекции такое не прокатит.
  • DevilDevil (14.01.08 09:09) [8]
    > Юрий Зотов ©   (14.01.08 01:16) [7]

    Да, задача у меня нестандартная, поэтому и понять "зачем" сложно.

    Рассматриваемая коллекция в моих формах - самая важная чтука.
    Причём коллекция не рассматривается как массив однородных данных; в программе происходит обращение к конкретному элементу этого "массива", отсюда и появилось однозначно идентифицирующее свойство
    Name

    .

    Почему тогда коллекция, а не просто компонентов накидать?
    Причин несколько:
    - коллекция позволяет визуально компактно расположить элементы, а куча компонентов (около 15) визуально будет мешать
    - коллекция позволяет задать порядок (что в моём случае крайне важно)
    - в редакторе коллекции имеется возможность добавлять описание, что очень даже полезная фича
  • DimaBr © (14.01.08 09:12) [9]
    Мне кажется вам коллекция не нужна. Посмотрите на TActionList
  • DevilDevil © (14.01.08 11:01) [10]
    > DimaBr ©   (14.01.08 09:12) [9]

    Посмотрел...
    Да, немного похоже, только намного сложнее, чем мне надо.
    Может ещё какие варианты?
  • Юрий Зотов © (14.01.08 11:32) [11]
    > DevilDevil ©   (14.01.08 11:01) [10]

    Варианты чего? Что нужно-то?

    Обращение к элементу по имени? Так уже было сказано, как это сделать.

    Еще что-то? Тогда что?
  • DimaBr © (14.01.08 12:04) [12]
    Ничего сложного нет
    Вот ваши требования

    > - коллекция позволяет визуально компактно расположить элементы, а куча компонентов (около 15) визуально будет мешать
    > - коллекция позволяет задать порядок (что в моём случае крайне важно)
    > - в редакторе коллекции имеется возможность добавлять описание,  что очень даже полезная фича

    1. Не коллекция а редактор коллекции
    2. Порядок = порядку считывания из ресурса
    3. Не понял вообще
  • icWasya © (14.01.08 17:33) [13]
    > [8] >а куча компонентов (около 15) визуально будет мешать
    компоненты TMenuItem и TField - на форме не видны
  • DevilDevil (16.01.08 23:17) [14]
    потерял я веру. Может быть существует какой-нибудь TComponentCollection ? Всё, что я нашёл либо не работает либо не имеет хорошего редактора.
    Ну или хитрым образом как-то можно модернизировать TCollection?

    > компоненты TMenuItem и TField - на форме не видны
    в том то и задача, чтобы было 15 компонентов, порядок их можно задавать произвольный, а редактировать в DesignTime посредством редактора аналогичного редактору TCollection.

    > 3. Не понял вообще
    TCollection позволяет делать такое:
    http://devilhome.narod.ru/description.png  
    (пользуясь случаем, Юрий, спасибо за статью)
  • DimaBr © (17.01.08 10:03) [15]
    Я нарисовал такой компонент (точнее похожий) - контейнер для хранения множества компонентов
    http://dymondbox.narod.ru/1.JPG
  • DimaBr © (17.01.08 11:41) [16]
    Решение очень простое
    Вы уже написали компонент с коллекцией обьектов, следовательно остаётся нарисовать редактор этой коллекции который:
    1. при выборе элемента коллекции выбирал Object на форме и соответственно в инспекторе
    2. в дополнительном окне  (в редакторе) отображал свойства и значения самого элемента коллекции.

    В принципе готовый редактор есть в сырцах делфи остаётся его немного видоизменить и вызвать для  своей коллекции.
  • Юрий Зотов © (17.01.08 18:36) [17]
    Дополнительное окно даже не нужно. И коллекция тоже не нужна. Все делается по аналогии с полями.

    Целевые компоненты делаются невидимыми (аналоги полей). Пишется компонент-контейнер таких невидимых компонентов. (аналог TDataSet). К нему пишется редактор (аналог редактора полей). В редакторе (и в дизайнере формы) выбирается невидимый компонент, который отображается в самом инспекторе.
  • DevilDevil (17.01.08 22:33) [18]
    > DimaBr ©   (17.01.08 11:41) [16]
    > Юрий Зотов ©   (17.01.08 18:36) [17]


    Если честно, относительно сложно для понимания... но я стараюсь :)

    >  Пишется компонент-контейнер таких невидимых компонентов.
    >  (аналог TDataSet). К нему пишется редактор (аналог редактора
    > полей). В редакторе (и в дизайнере формы) выбирается невидимый
    > компонент, который отображается в самом инспекторе.


    Опишите, пожалуйста, по подробнее. Почти ни слова не понимаю.
  • DevilDevil (17.01.08 23:26) [19]
    Моя проблема в принципе решается, если вручную делать примерно так:
    TMyForm1 = class(TMyForm)
       SomeComponens...
       SomeEvents...
     private
       { Private declarations }
     public
       { Public declarations }
     published
       WaterFigures: TMyCollectionItem;
       ...
     end;



    Ну и потом, в
    TMyForm.Loaded

    , имея
    Name

    элемента коллекции, присваивать published-полям соответствующие значения.

    Вопрос: возможно ли написать кодогенератор, который автоматически редактировал бы мою published-секцию ?
 
Конференция "Компоненты" » TComponent как элемент TCollection, возможно ли это ?
Есть новые Нет новых   [134463   +60][b:0][p:0.002]