Следующий небольшой компонент представляет собой панель, содержащую другую,
вложенную панель. Во вложенной панели могут быть размещены другие компоненты,
читаться они будут правильно. Ключевым моментом здесь является перекрытие
методов WriteComponents и ReadState.
unit RzPnlPnl;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls;
type
TSubPanel = class(TPanel)
protectedprocedure ReadState(Reader: TReader); override;
end;
TPanelPanel = class(TPanel)
private
FSubPanel: TSubPanel;
protectedprocedure WriteComponents(Writer: TWriter); override;
procedure ReadState(Reader: TReader); override;
publicconstructor Create(AOwner: TComponent); override;
end;
procedureRegister;
implementationprocedure TSubPanel.ReadState(Reader: TReader);
var
OldOwner: TComponent;
begin
OldOwner := Reader.Owner;
{ Сохраняем старого владельца, что необходимо для PanelPanel }
Reader.Owner := Reader.Root; { Задаем в качестве владельца форму }tryinherited ReadState(Reader);
finally
Reader.Owner := OldOwner;
end;
end;
constructor TPanelPanel.Create(AOwner: TComponent);
const
Registered: Boolean = False;
begininherited Create(AOwner);
FSubPanel := TSubPanel.Create(Self);
FSubPanel.Parent := Self;
FSubPanel.SetBounds(20, 20, 200, 100);
FSubPanel.Name := 'SomeName';
ifnot Registered thenbegin
Classes.RegisterClasses([TSubPanel]);
{ так TSubPanel может храниться в файле формы }
Registered := True;
end;
end;
procedure TPanelPanel.ReadState(Reader: TReader);
var
OldOwner: TComponent;
I: Integer;
beginfor I := 0 to ControlCount - 1 do
Controls[0].Free;
OldOwner := Reader.Owner;
Reader.Owner := Self;
{Для чтения субкомпонентов, установите данный экземпляр в качестве родителя}tryinherited ReadState(Reader);
finally
Reader.Owner := OldOwner;
end;
end;
procedure TPanelPanel.WriteComponents(Writer: TWriter);
var
I: Integer;
beginfor I := 0 to ControlCount - 1 do
Writer.WriteComponent(Controls[I]);
end;
procedureRegister;
begin
RegisterComponents('Samples', [TPanelPanel]);
end;
end.
Обзор
Эта компонента Delphi представляет собой панель с вложенной панелью. Вложенная панель может содержать другие компоненты, и они будут читаться правильно. Ключевое здесь - это переопределение методов WriteComponents и ReadState.
Компоненты
В коде есть две основные компоненты: TSubPanel и TPanelPanel.
TSubPanel: Это панель, которая наследуется от TPanel. Она имеет переопределенный метод ReadState, чтобы прочитать свой статус.
TPanelPanel: Это панель, которая также наследуется от TPanel. Она имеет три основные метода: Create, WriteComponents и ReadState.
Методы
1. TSubPanel.ReadState(Reader: TReader): Этот метод читает статус компонента TSubPanel. Он сохраняет старого владельца, устанавливает новый владелец в корневой компонент, читает свой статус и затем восстанавливает старого владельца.
2. TPanelPanel.Create(AOwner: TComponent): Конструктор создает новую инстанцию TPanelPanel. Он создает вложенную панель TSubPanel, устанавливает ее родителя в себя, задает ее границы и присваивает ей имя.
3. TPanelPanel.ReadState(Reader: TReader): Этот метод читает статус компонента TPanelPanel. Он освобождает все контролы, сохраняет старого владельца, устанавливает новый владелец в себя, читает свой статус и затем восстанавливает старого владельца.
4. TPanelPanel.WriteComponents(Writer: TWriter): Этот метод записывает все компоненты TPanelPanel в писатель.
5. Register: Процедура регистрирует компонент TPanelPanel.
Анализ кода
Код хорошо организован и легко понятен. Автор предоставил четкие комментарии, объясняющие цель каждого метода. Переопределение методов WriteComponents и ReadState выполнено правильно, что позволяет вложенной панели быть прочитанной и записанной правильно.
Однако, можно улучшить использование более описательных имен переменных. Например, вместо использования I как переменной цикла, лучше использовать что-то вроде ControlIndex.
Также код использует некоторые магические числа (например, 20, 200, 100), которые можно заменить константами или переменными для лучшей поддержки.
В целом, это хороший пример реализации вложенных панелей в Delphi.
Компонент со вложенной панелью представляет собой панель, содержащую другую, вложенную панель, которая может быть использована для размещения других компонентов и чтения их состояния.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.