Форум: "Основная";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];
ВнизРедактор компонента Найти похожие ветки
← →
OlkaGTS (2003-04-01 17:39) [0]Уважаемые мастера!
Есть компонент, который содержит список компонентов(TCollection), который в свою очередь содержит список компонентов(тоже TCollection). Из инспектора объектов можно увидеть только первый уровень, второй не показывается.
Можно ли как-то на это повлиять, если нет то как написать свой редактор, чтобы из него можно было видеть свойства выбранных объектов.
← →
Юрий Зотов (2003-04-01 18:30) [1]Вынесите внутреннюю коллекцию в свойства компонента. Примерно так.
type
TMyComponent = class(...)
private
FMyCollection: TMyCollection; // Первый уровень
function GetSecondCollection: TSecondCollection;
procedure SetSecondCollection(const Value: TSecondCollection);
...
published
property MyCollection: TMyCollection
read FMyCollection
write SetMyCollection;
property SecondCollection: TSecondCollection
read GetSecondCollection
write SetSecondCollection stored False;
end;
function TMyComponent.GetSecondCollection: TSecondCollection;
begin
Result := FMyCollection.SecondCollection
end;
procedure TMyComponent.SetSecondCollection(const Value: TSecondCollection);
begin
FMyCollection.SecondCollection.Assign(Value)
end;
← →
OlkaGTS (2003-04-03 10:30) [2]Не совсем понимаю. Второй уровень сложенности зависит от индексов первого. Конструкция приблизительно такова:
Type TSMenuItem=class(TCollectionItem)
...
TSMenuItems=class(TCollection)
property Items[index: integer]: TSMenuItem
read GetItem write SetItem; default;
...
TGroupItem=class(TCollectionItem)
property MenuItems: TSMenuItems read FMenuItems;
...
TGroups=class(TCollection)
...
property Items[index: integer]: TGroupItem
read GetItem write SetItem; default;
...
TSMenu=class(TCustomPanel)
property Groups: TGroups read FGroups write SetGroups;
...
Так вот стандартными средствами я могу добавлять/убирать группы и изменять их свойства и даже видеть, что у него есть свойство MenuItems. Но при нажатии на кнопочку рядом с этим свойством ничего не происходит.
← →
Юрий Зотов (2003-04-03 12:05) [3]Читаем исходный вопрос:
"Есть компонент, который содержит список компонентов(TCollection), который в свою очередь содержит список компонентов(тоже TCollection)".
Откуда следует, что вторая коллекция вживлена в САМУ первую КОЛЛЕКЦИЮ, а не в ее элементы. Исходя из этого я и отвечал.
Теперь читаем код в следующем Вашем постинге:
type
TSMenuItem=class(TCollectionItem)
...
TSMenuItems=class(TCollection)
property Items[index: integer]: TSMenuItem...
...
TGroupItem=class(TCollectionItem)
property MenuItems: TSMenuItems...
Откуда следует, что вторая коллекция вживлена в каждый ЭЛЕМЕНТ первой коллекции, а не в САМУ первую коллекцию.
Возникает вопрос - где же истина? Вероятно, стоит верить коду. Но тогда делаем вывод - если Вы хотите получить ТОЧНЫЙ ответ, то и вопрос надо формулировать ТОЧНО.
Теперь по сути.
property MenuItems: TSMenuItems read FMenuItems;
Свойство объявлено, как read-only. Естественно, редактировать его среда не позволяет. Видимо, надо так:
published
property MenuItems: TSMenuItems
read FMenuItems write SetMenuItems;
procedure TGroupItem.SetMenuItems(const Value: TSMenuItems);
begin
FMenuItems.Assign(Value)
end;
И для нормальной работы IDE надо у обеих коллекций перекрыть метод GetOwner. Во второй коллекции он должен возвращать ссылку на элемент TGroupItem (владелец этой коллекции), а в первой коллекции он должен возвращать сыылку на компонент-владелец. Либо можно наследовать коллекции от TOwnedCollection.
← →
OlkaGTS (2003-04-03 13:31) [4]Все работает. Спасибо большое
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c