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

Создание визуального компонента в Delphi с TPageControl и TTabSheet

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

 

Создание визуального компонента в Delphi с использованием TPageControl и TTabSheet может вызвать ряд проблем, особенно если компоненты создаются внутри другого компонента. В этой статье мы рассмотрим, как правильно организовать создание таких компонентов, чтобы избежать ошибки "Control xx has no parent window", и предоставим альтернативные решения.

Описание проблемы

Когда вы создаете визуальный компонент, который содержит внутри себя TPageControl с несколькими TTabSheet, вы можете столкнуться с ошибкой "Control xx has no parent window". Эта ошибка возникает из-за того, что компонент, внутри которого создаются другие компоненты, еще не имеет родительского окна (HWND) на момент создания дочерних компонентов. В вашем случае, когда вы создаете TTabSheet внутри TCustomGr, компонент еще не завершил процесс создания своего родительского окна.

Решение проблемы

Для решения этой проблемы необходимо отложить создание дочерних компонентов до тех пор, пока родительский компонент не завершит создание своего окна. Это можно сделать, перегружая метод CreateWnd в вашем компоненте TCustomGr. В этом методе вы можете создать и настроить все необходимые дочерние компоненты, так как на момент вызова CreateWnd родительское окно уже создано.

Пример кода

Давайте рассмотрим, как можно перегрузить метод CreateWnd в вашем компоненте TCustomGr:

unit CustomGrUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Grids, Vcl.DBGrids;

type
  TCustomGr = class(TPanel)
  private
    fPanelTop: TPanel;
    fPageControlMain: TPageControl;
    procedure CreateWnd; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

{$R *.dfm}

constructor TCustomGr.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fPanelTop := TPanel.Create(Self);
  fPanelTop.Parent := Self;
  fPanelTop.Align := alTop;
  fPanelTop.Height := 50;

  fPageControlMain := TPageControl.Create(Self);
  fPageControlMain.Parent := Self;
  fPageControlMain.Align := alClient;
  fPageControlMain.TabPosition := tpTop;
  fPageControlMain.TabWidth := 100;
end;

procedure TCustomGr.CreateWnd;
var
  workSheet: TTabSheet;
begin
  inherited CreateWnd;

  // Создаем TTabSheet только после того, как родительское окно создано
  workSheet := TTabSheet.Create(fPageControlMain);
  workSheet.PageControl := fPageControlMain;
  workSheet.Caption := 'Sheet 1';
  fPageControlMain.ActivePage := workSheet;

  workSheet := TTabSheet.Create(fPageControlMain);
  workSheet.PageControl := fPageControlMain;
  workSheet.Caption := 'Sheet 2';
end;

end.

Альтернативное решение

Если вы хотите избежать перегрузки метода CreateWnd, вы можете использовать асинхронные вызовы для создания дочерних компонентов. В Delphi 12 вы можете использовать задачи (TTask) или события для отложенного создания компонентов.

Пример использования задач для отложенного создания:

uses
  System.Threading;

constructor TCustomGr.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fPanelTop := TPanel.Create(Self);
  fPanelTop.Parent := Self;
  fPanelTop.Align := alTop;
  fPanelTop.Height := 50;

  fPageControlMain := TPageControl.Create(Self);
  fPageControlMain.Parent := Self;
  fPageControlMain.Align := alClient;
  fPageControlMain.TabPosition := tpTop;
  fPageControlMain.TabWidth := 100;

  TTask.Run(
    procedure
    var
      workSheet: TTabSheet;
    begin
      workSheet := TTabSheet.Create(fPageControlMain);
      workSheet.PageControl := fPageControlMain;
      workSheet.Caption := 'Sheet 1';
      fPageControlMain.ActivePage := workSheet;

      workSheet := TTabSheet.Create(fPageControlMain);
      workSheet.PageControl := fPageControlMain;
      workSheet.Caption := 'Sheet 2';
    end
  ).Start;
end;

Использование Frame для создания компонентов

Если вы столкнулись с проблемами при использовании компонентов внутри других компонентов, возможно, стоит рассмотреть использование TFrame. TFrame специально предназначен для создания компонентов, которые могут быть многократно использованы на одном и том же окне. Это может быть полезно, если у вас есть несколько экземпляров вашего компонента на одной форме.

Пример использования TFrame:

  1. Создайте новый TFrame в вашем проекте.
  2. Добавьте в TFrame все необходимые компоненты, такие как TPageControl, TTabSheet и другие.
  3. Используйте TFrame на вашей форме, как обычный компонент.

Заключение

Создание визуальных компонентов в Delphi с использованием TPageControl и TTabSheet может вызвать ряд проблем, особенно если компоненты создаются внутри другого компонента. Для решения этой проблемы можно перегрузить метод CreateWnd или использовать асинхронные вызовы для отложенного создания компонентов. Также стоит рассмотреть использование TFrame для создания компонентов, которые могут быть многократно использованы на одном и том же окне.

Надеюсь, эта статья поможет вам успешно создать визуальные компоненты в Delphi с использованием TPageControl и TTabSheet.

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

Контекст описывает решение проблемы создания визуальных компонентов в Delphi с использованием `` TPageControl `` и `` TTabSheet `` внутри других компонентов, включая перегрузку метода `` CreateWnd `` и использование асинхронных вызовов или фреймов для из


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

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




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


:: Главная :: Компоненты ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-22 18:45:54/0.0034451484680176/0