Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007
Автор: Ray Konopka

Следующий небольшой компонент представляет собой панель, содержащую другую, вложенную панель. Во вложенной панели могут быть размещены другие компоненты, читаться они будут правильно. Ключевым моментом здесь является перекрытие методов 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
 
OldOwner := Reader.Owner;
   
{ Сохраняем старого владельца, что необходимо для PanelPanel }
 
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.
 
 

https://delphiworld.narod.ru/

DelphiWorld 6.0