Компонент со вложенной панелью

Материал из DRKB

Компонент со вложенной панелью[править | править код]

Следующий небольшой компонент представляет собой панель, содержащую другую, вложенную панель. Во вложенной панели могут быть размещены другие компоненты, читаться они будут правильно. Ключевым моментом здесь является перекрытие методов WriteComponents и ReadState.


unit RzPnlPnl;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, ExtCtrls;

type
  TSubPanel = class(TPanel)
  protected
    procedure ReadState(Reader: TReader); override;
  end;

  TPanelPanel = class(TPanel)
  private
    FSubPanel: TSubPanel;
  protected
    procedure WriteComponents(Writer: TWriter); override;
    procedure ReadState(Reader: TReader); override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

procedure Register;

implementation

procedure TSubPanel.ReadState(Reader: TReader);
var
  OldOwner: TComponent;
begin
  { Сохраняем старого владельца, что необходимо для PanelPanel }
  OldOwner := Reader.Owner;
  Reader.Owner := Reader.Root; { Задаем в качестве владельца форму }
  try
    inherited ReadState(Reader);
  finally
    Reader.Owner := OldOwner;
  end;
end;

constructor TPanelPanel.Create(AOwner: TComponent);
const
  Registered: Boolean = False;
begin
  inherited Create(AOwner);

  FSubPanel := TSubPanel.Create(Self);
  FSubPanel.Parent := Self;
  FSubPanel.SetBounds(20, 20, 200, 100);
  FSubPanel.Name := 'SomeName';

  if not Registered then
  begin
    Classes.RegisterClasses([TSubPanel]);
      { так TSubPanel может храниться в файле формы }
    Registered := True;
  end;
end;

procedure TPanelPanel.ReadState(Reader: TReader);
var
  OldOwner: TComponent;
  I: Integer;
begin
  for I := 0 to ControlCount - 1 do
    Controls[0].Free;

  OldOwner := Reader.Owner;
  Reader.Owner := Self;
    { Для чтения субкомпонентов, установите данный экземпляр в качестве родителя }
  try
    inherited ReadState(Reader);
  finally
    Reader.Owner := OldOwner;
  end;
end;

procedure TPanelPanel.WriteComponents(Writer: TWriter);
var
  I: Integer;
begin
  for I := 0 to ControlCount - 1 do
    Writer.WriteComponent(Controls[I]);
end;

procedure Register;
begin
  RegisterComponents('Samples', [TPanelPanel]);
end;

end.

Комментарии:

 Выдает ошибки
 procedure WriteComponents(Writer: TWriter); override;  Метод не найден в базовом классе
 
 Registered := True;на присвоение значения константе


Author: Ray Konopka
Source: http://delphiworld.narod.ru/
ID: 00949