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

"Управление коллекцией шейдеров в Delphi: два подхода к поддержке времени проектирования и файлов DFM"

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

Управление коллекцией шейдеров в Delphi: два подхода к поддержке времени проектирования и файлов DFM

При работе с графикой в Delphi может возникнуть потребность управлять коллекцией шейдеров. Для этого можно использовать два подхода, обеспечивающих полную поддержку времени проектирования и файлов DFM.

Подход 1: Наследование от TCollectionItem

В этом подходе общий базовый класс шейдеров (TGLCustomGLSLShader) наследуется от TCollectionItem. Затем в основном компоненте библиотеки создается опубликованное свойство TOwnedCollection, которое содержит шейдеры. Пользователи не смогут перетаскивать шейдеры на форму во время проектирования, но стандартный редактор коллекций позволит нормально удалять и редактировать объекты шейдеров. Для создания экземпляров классов шейдеров можно использовать кастомный редактор времени проектирования, передавая в конструктор объект TOwnedCollection. Также необходимо реализовать кастомное стриминговое управление DFM для компонента библиотеки, чтобы при загрузке файла DFM создавались экземпляры соответствующих классов шейдеров, а не объектов TGLCustomGLSLShader.

Подход 2: Наследование от TComponent

В этом подходе общий базовый класс шейдеров наследуется от TComponent, что позволяет пользователям перетаскивать шейдеры на форму и настраивать их свойства, как обычные компоненты. В компоненте библиотеки создается опубликованное свойство TOwnedCollection, и определяется кастомный класс TCollectionItem с опубликованным свойством TGLCustomGLSLShader. Это позволяет пользователю использовать стандартный редактор коллекций для добавления элементов и при необходимости связывать их с нужными компонентами шейдеров. Хотя этот подход требует больше объектов и настройки пользователя, он дружелюбнее относится к стандартным редакторам времени проектирования и файлам DFM, так как позволяет использовать стандартные поведения и не требует каких-либо кастомных редакторов времени проектирования для управления объектами.

Пример кода для подхода 1

unit Unit1;

interface

uses
  Winapi.Windows, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Types;

type
  TGLCustomGLSLShader = class(TCollectionItem)
  private
    FVertexShader: string;
    FFragmentShader: string;
  public
    constructor Create(AOwner: TCollection);
    property VertexShader: string read FVertexShader write FVertexShader;
    property FragmentShader: string read FFragmentShader write FFragmentShader;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FShaderCollection: TOwnedCollection;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TGLCustomGLSLShader.Create(AOwner: TCollection);
begin
  inherited Create(AOwner);
  FVertexShader := '';
  FFragmentShader := '';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FShaderCollection := TOwnedCollection.Create(nil);
  FShaderCollection.OwnsObjects := True;
  // Добавляем шейдеры в коллекцию
  FShaderCollection.Add(TGLCustomGLSLShader.Create(FShaderCollection));
  // Другие шейдеры...
end;

end.

Пример кода для подхода 2

unit Unit1;

interface

uses
  Winapi.Windows, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Types, Vcl.ComCtrls;

type
  TGLCustomGLSLShader = class(TComponent)
  private
    FVertexShader: string;
    FFragmentShader: string;
  public
    constructor Create(AOwner: TComponent);
    property VertexShader: string read FVertexShader write FVertexShader;
    property FragmentShader: string read FFragmentShader write FFragmentShader;
  end;

  TCustomShaderItem = class(TCollectionItem)
  private
    FShader: TGLCustomGLSLShader;
  public
    constructor Create(AOwner: TCollection);
    property Shader: TGLCustomGLSLShader read FShader write FShader;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FShaderCollection: TOwnedCollection;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TGLCustomGLSLShader.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FVertexShader := '';
  FFragmentShader := '';
end;

constructor TCustomShaderItem.Create(AOwner: TCollection);
begin
  inherited Create(AOwner);
  FShader := TGLCustomGLSLShader.Create(nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FShaderCollection := TOwnedCollection.Create(nil);
  FShaderCollection.OwnsObjects := True;
  // Добавляем шейдеры в коллекцию
  FShaderCollection.Add(TCustomShaderItem.Create(FShaderCollection));
  // Другие шейдеры...
end;

end.

Каждый подход имеет свои преимущества и недостатки, и выбор между ними зависит от конкретных требований проекта. Подход 1 требует меньше объектов и настройки пользователя, но подход 2 более дружелюбен к стандартным редакторам времени проектирования и файлам DFM. В обоих случаях важно правильно реализовать стриминговое управление DFM, чтобы гарантировать правильное создание экземпляров классов шейдеров при загрузке файлов DFM.

Создано по материалам из источника по ссылке.

Данный текст описывает два подхода к управлению коллекцией шейдеров в Delphi, обеспечивающих полную поддержку времени проектирования и файлов DFM.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Коллекции ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 14:21:38/0.0056219100952148/1