Форум: "Компоненты";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизЗапись/Чтение неопубликованных свойств компонента Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.043 c