Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Компоненты и Классы , TPanel

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

Автор: 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.

Обзор Эта компонента 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TPanel ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:55:07/0.0034849643707275/0