Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TCollection внутри TPersistent, не работает в DT


Автор: Coriolis 31.10.2007, 11:33
Привет всем.
Пишу свой компонент. Захотел спрятать группу настроек в отдельном объекте, наследнике TPersistent, как водицо. Одна из настроек - коллекция. На мой взгляд все правильно, но в DesingTime не открывается редактор коллекции - после нажатия на кнопку с тремя точками никакой реакции :(

Код компонента:
Код

unit uMTable;

interface

uses
  Classes,
  Controls,
  Graphics,
  Messages,
  SysUtils,
  Buttons,
  Windows;

type

  TMColumns = class;
  TMHeader = class;
  TMTableBase = class;

  TMColumn = class (TCollectionItem)
  private
    FCaption: TCaption;
    procedure SetCaption(const Value: TCaption);
  protected
    function GetOwner: TMColumns; reintroduce;
  published
    // свойства колонки
    {Текст в колонке}
    property Caption: TCaption read FCaption write SetCaption;
  end;

  TMColumns = class (TCollection)
  private
    FHeader: TMHeader;    
  protected
    function GetOwner: TPersistent; override;
    procedure Update(Item: TCollectionItem); override;
  public
    constructor Create(AOwner: TMHeader);
  end;

  {оболочка для настройки заголовка таблицы - хидера}
  TMHeader = class (TPersistent)
  private
    FOwner: TMTableBase;
    FColumns: TMColumns;
    procedure SetColumns(const Value: TMColumns);
  public
    constructor Create(AOwner: TMTableBase);
    destructor Destroy; override;
  published
    property Columns: TMColumns read FColumns write SetColumns;
  end;


  TMTableBase = class (TCustomControl)
  private
    // координаты рабочей области внутри бордюра
    FHeader: TMHeader;
    procedure SetHeader(const Value: TMHeader);
  protected
    {инфа о заголовке - хидере}
    property Header: TMHeader read FHeader write SetHeader;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;


  TMTable = class (TMTableBase)
  published
    property Header;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MSM', [TMTable]);
end;

{ TMTable }

constructor TMTableBase.Create(AOwner: TComponent);
begin
  inherited;
  FHeader := TMHeader.Create(Self);
end;

destructor TMTableBase.Destroy;
begin
  FHeader.Free;
  inherited;
end;

procedure TMHeader.SetColumns(const Value: TMColumns);
begin
  FColumns.Assign(Value);
end;

procedure TMTableBase.SetHeader(const Value: TMHeader);
begin
  FHeader.Assign(Value);
end;

{ TMColumns }

constructor TMColumns.Create(AOwner: TMHeader);
begin
  FHeader := AOwner;
  inherited Create(TMColumn);
end;

function TMColumns.GetOwner: TPersistent;
begin
  Result := FHeader;
end;

procedure TMColumns.Update(Item: TCollectionItem);
begin
  inherited;  
end;

{ TMColumn }

function TMColumn.GetOwner: TMColumns;
begin
  Result := Collection as TMColumns;
end;

procedure TMColumn.SetCaption(const Value: TCaption);
begin
  FCaption := Value;
end;

{ TMColHeader }

constructor TMHeader.Create(AOwner: TMTableBase);
begin
  inherited Create;
  FOwner := AOwner;
  FColumns := TMColumns.Create(Self);
end;

destructor TMHeader.Destroy;
begin
  FColumns.Free;
  inherited;
end;

end.

Автор: Coriolis 31.10.2007, 18:21
Шо, никто не знает?  smile Я перерыл кучу инфы но не могу понять почему не открывается редактор :(

Автор: Coriolis 31.10.2007, 18:47
Хаха. Нашел таки.
У TPersistent тожеть надо было завести FOwner и перекрыть функцию GetOwner: TPersistent;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)