Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

Запись/Чтение неопубликованных свойств компонента   Найти похожие ветки 

 
olegz77   (2006-01-20 15:50) [0]

Пишу компонент-панель, в которую вставлены две панели - на одной выводится текст (caption), а другая используется как клиентская для вставки других контролов. Обе вложенные панели описаны в разделе private. Как правильно сохранить/загрузить в DFM файл компоненты, вложенные в клиентскую панель???


 
Digitman ©   (2006-01-20 16:09) [1]

см. TPersistent.DefineProperty, TFiler.Read/WriteXXXX


 
Юрий Зотов ©   (2006-01-20 16:15) [2]

Предвижу проблемы с сохранением в DFM. Похоже, придется разбираться с GetParentCompoment, GetChildren и иже с ними. Гораздо проще сделать фрейм и зарегистрировать его в палитре.


 
olegz77   (2006-01-20 16:20) [3]

Да, думаю проще сделать компонент без вложенных панелей, просто ограничив клиентскую область с помощью AdjustClientRect и вставлять дочерние контролы прямо в саму панель. Тогда никаких проблем. Нашел тут в сборнике Delphi World 6 старый пример (наверное для delphi2 или даже delphi1). Но пример не работает:
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.


Допустим, что метода WriteComponents уже нет. Скорее всего это метод WriteState. Но все равно не работает :(



Страницы: 1 вся ветка

Текущий архив: 2006.08.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
2-1154054923
Leksey
2006-07-28 06:48
2006.08.20
открытие таблиц Excel


3-1150286095
Nicky
2006-06-14 15:54
2006.08.20
Как написать код, чтобы открывался файл справки при инсталляции п


1-1151616926
SkyRanger
2006-06-30 01:35
2006.08.20
Работа с указателями


15-1153740447
ZeroDivide
2006-07-24 15:27
2006.08.20
Что вас заставляет метать бисер?


4-1145953633
Creative
2006-04-25 12:27
2006.08.20
разница между WM_CREATE и WM_COMMAND