Конференция "Компоненты" » Как-то старнно работет дизайнер свойства [WinXP]
 
  • 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, в котором всё это уже реализовано.
 
Конференция "Компоненты" » Как-то старнно работет дизайнер свойства [WinXP]
Есть новые Нет новых   [119014   +24][b:0][p:0.001]