Конференция "Компоненты" » Компонент в компоненте. Сериализация [D7, WinXP]
 
  • thenomad © (04.03.09 19:41) [0]
    Создаю компонент, содержащий другой компонент. Кидаю компонент на форму. После проведения сериализации, десериализации (путем View as Text -> View as Form) в дереве объектов появляется еще один объект класса TEDAChild без Parent`а - собственно это он и прочитался из потока - родителем которого является форма, а не компонент. Где проблема?

    unit EDATest;

    interface

    Uses Classes;

    type
     TEDAChild = class;

     TEDAParent = class(TComponent)
       constructor Create(AOwner:TComponent);override;
       destructor Destroy;override;
       procedure GetChildren(Proc: TGetChildProc; Root: TComponent);override;
     private
       FChild:TEDAChild;
     published
       property Child:TEDAChild read FChild write FChild;
     end;

     TEDAChild = class(TComponent)
     
     end;

     procedure Register;

    implementation

    Uses SysUtils;

    constructor TEDAParent.Create(AOwner:TComponent);
    begin
     inherited Create(AOwner);
     Child := TEDAChild.Create(Self);
    end;

    destructor TEDAParent.Destroy;
    begin
     FreeAndNil(FChild);
     inherited;
    end;

    procedure TEDAParent.GetChildren(Proc: TGetChildProc; Root: TComponent);
    begin
     Proc(Child);
    end;

    procedure Register;
    begin
     RegisterComponents('EDA',[TEDAParent]);
     RegisterNoIcon([TEDAChild]);
    end;

    Initialization
     RegisterClass(TEDAChild);
    end.

  • Юрий Зотов © (05.03.09 12:01) [1]
    Не помню точно, а навскидку что-то типа этого:

    constructor TEDAParent.Create(AOwner:TComponent);
    begin
     inherited Create(AOwner);
     Child := TEDAChild.Create(Self);
     Child.SubComponent := True; // Или SetSubComponent, не помню точно
    end;

    И еще - одного замещения GetChildren может оказаться мало. Посмотрите в коде VCL, как реализована связка TDataSet с его полями.
  • thenomad © (10.03.09 18:42) [2]
    Вот этого одного замещения и оказывается мало. SubComponent никак в данном случае не влияет (имеет значение только для визуальных компонент?)
  • DimaBr © (11.03.09 14:56) [3]
    в данном случае использование GetChildren приводит к тому что ваш внутренний компонент сохраняется в ресурс целиком, а вам нужны только его свойства.
    Для этого нужно воспользоваться одним из вариантов
    1. убрать GetChildren и установить SubComponent := True
    2. вручную сохранять свойства внутреннего компонента через DefineProperties
    3. Вывести свойства внутренного компонента в published совйства внешнего компонента
 
Конференция "Компоненты" » Компонент в компоненте. Сериализация [D7, WinXP]
Есть новые Нет новых   [134466   +3][b:0][p:0.001]