-
zsv (07.09.11 14:28) [0]день добрый.
имеется на форме визуальный компонент в котором есть класс типа Type1=class(TCollection) и в нем соответственно набор типа Type2=class(TCollectionItem).
Имеется также на форме другой компонент у которого есть св-во Х типа Type2.
Как мне сделать так чтобы в инспекторе обьектов у второго компонента на свойстве Х был выпадающий список всех возможных вариантов (которые есть у первого компонента). Ну аналогично тому как в свойстве PopupMenu появляется список всех доступных попапов.
Прошу прощения если вопрос задан коряво... -
DimaBr © (08.09.11 00:22) [1]Для этого нужно
1. Чтобы Item-ы отличались друг от друга
2. написать редактор свойства
3. зарегистрировать редактор свойства
На мой взгляд, проще всего хранить номер Itema, то есть свойства X - целое, плюс к нему можно прикрутить редактор -
zsv (08.09.11 12:04) [2]а не подскажете какой-нить станд. компонент где реализован такой редактор свойства (чтобы на живом примере так сказать...)
-
DimaBr © (08.09.11 12:50) [3]Стандартного не припомню, но должно получиться примерно так (пишу на ходу, поэтому возможны небольшие ошибочки)
TMyItem = class(TCollectionItem)
published
property Name: string read fName write fName; // свойство для отличия одного итема от другого
end;
TMyComponent = class(TComponent)
published
property AComp: TComponentCollection; // компонент с коллекцией
property X: integer read fX write fX; // свойство указывающее на № Itema
end;
// редактор свойства (должен быть в другом модуле)
TMyItemListProperty = class(TStringProperty)
function GetAttributes: TPropertyAttributes; override;
procedure GetValues(Proc: TGetStrProc); override;
end;
function TMyItemListProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList, paSortList];
end;
procedure TMyItemListProperty.GetValues(Proc: TGetStrProc);
var I: Integer;
A: TComponentCollection;
begin
// получаем коллекцию из компонента который привязан
A := TMyComponent(GetComponent(0)).AComp;
if not Assigned(A) then Exit;
for I := 0 to A.Items.Count - 1 do
Proc(A.Items[i].Name);
end;
procedure Register;
begin
RegisterComponents('вкладка',[компоненты]);
RegisterPropertyEditor(TypeInfo(integer), TMyComponent , 'X', TMyItemListProperty);
end; -
icWasya © (08.09.11 13:46) [4]В сабже было указано, что коллекция и компонент, в котором свойство - элемент коллекции - это разные компоненты.
Тогда в дополнение к вышеприведённому коду.TMyCollection = class(TComponent)
published
property AComp: TComponentCollection; // компонент с коллекцией
end;
TMyComponent = class(TComponent)
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
published
property Collection: TMyCollection read FCollection write SetCollection; // компонент с коллекцией
property X: integer read fX write fX; // свойство указывающее на № Itema
end;
procedure TMyComponent.Notification(AComponent: TComponent;
Operation: TOperation);
begin
if Operation = opRemove then begin
if AComponent = FCollection then begin
FCollection:=Nil;
end;
end;
inherited;
end;
procedure TMyComponent.SetCollection(ACollection:TMyCollection);
begin
if ACollection = FCollection then Exit;
if Assigned(FCollection) then RemoveFreeNotification(FCollection);
FCollection := ACollection;
if Assigned(FCollection) then FreeNotification(FCollection);
end; -
DimaBr © (08.09.11 23:38) [5]procedure TMyComponent.Notification(AComponent: TComponent;
Operation: TOperation);
begin
if Operation = opRemove then begin
if AComponent = FCollection then begin
Collection:=Nil; // именно так, а не FCollection:=Nil;
X := -1;
end;
end;
inherited;
end;