-
DimaBr (20.03.07 13:41) [20]Возможно проблема в том что ваша коллекция на знает хозяина, так как вы не переопределили GetOwner
function TPersistent.GetOwner: TPersistent;
begin
Result := nil;
end;
procedure TCollectionProperty.Edit;
var
Obj: TPersistent;
begin
Obj := GetComponent(0);
while (Obj <> nil) and not (Obj is TComponent) do
Obj := TPersistentCracker(Obj).GetOwner;
ShowCollectionEditorClass(Designer, GetEditorClass,
TComponent(Obj), TCollection(GetOrdValue), GetName, GetColOptions);
end;
Попробуйте унаследоваться такTSmcFilters = class(TOwnedCollection) -
Alexandr2007 (21.03.07 12:25) [21]В таком случае я не знаю как (куда) добавить функцию
function TPersistent.GetOwner: TPersistent;
begin
Result := nil;
end;
И не знаю кто такой TPersistentCracker... - ругается на него. :( -
RASkov (21.03.07 14:05) [22]> И не знаю кто такой TPersistentCracker... - ругается на него. :(
TPersistentCracker = class(TPersistent); -
DimaBr (21.03.07 17:05) [23]её никуда ненадо добавлять. Это я код из VCL привёл.
-
Alexandr2007 (21.03.07 18:07) [24]Дмитрий, если Вам не тяжело, то объясните специфику... я считаю что я залез в дебри для уровня на котором в данный момент нахожусь... меня интересует такая вещь. Есть мой компонент, мне необходимо снабдить его свойством, которое можно в дизайн тайме изменять так же как, например, добавляются, удаляются, изменяются поля в DataSet. Тут я так понимаю мне необходимо сделать свои классы TCollection и TCollectionItem (что я и сделал). Потом на компоненте, на этом свойстве должен вызываться редактор - я так понимаю стандартный. Может все на много проще, а я не в ту степь полез :) ???
-
DimaBr (22.03.07 08:44) [25]В принципе - правильно рассуждаете, единственное НО. Для того чтобы редактор смог заработать нужно чтобы по вашей коллекции можно было отыскать компонент. Это всё реализовано в редакторе вот таким способом.
Это вам писать не нужно
procedure TCollectionProperty.Edit;
var
Obj: TPersistent;
begin
Obj := GetComponent(0);
while (Obj <> nil) and not (Obj is TComponent) do
Obj := TPersistentCracker(Obj).GetOwner;
ShowCollectionEditorClass(Designer, GetEditorClass,
TComponent(Obj), TCollection(GetOrdValue), GetName, GetColOptions);
end;
То есть когда вызывается метод EDIT для свойства - коллекции, ищется компонент , которому пренадлежит коллекция и вызывается редактор. Чтобы правильно найти компонент Вы должны:
1. Переопределить метод GetOwner чтобы он возвращал ссылку на родителя
TMyCollection = class(TCollection)
private
fOwner: TPersistent;
protected
function GetOwner: TPersistent;override;
public
constructor Create(AOwner:TPersistent);
end;
constructor TMyCollection.Create(AOwner:TPersistent);
begin
fOwner := AOwner;
inherited Create(TClass_MyCollectionItem);
end;
function TMyCollection.GetOwner: TPersistent;
begin
Result := fOwner;
end;
2. Или же (что значительно проще) унаследоваться от TOwnedCollection, в котором всё это уже реализовано.