如何编写 TDBCtrlGrid VCL 样式自定义类?

问题描述 投票:0回答:1

这里有很多关于 XE2 VCL 样式和按钮、面板、编辑等的自定义颜色以及 VCL 样式的问题。尽管我希望现有的问题能够涵盖它,但它们并没有......所以数据库控制网格似乎是另一个特殊情况。

  1. 在DB Control Grid VCL源代码中,它注册了一个样式钩子:

    TCustomStyleEngine.RegisterStyleHook( TDBCtrlGrid, TScrollingStyleHook);

  2. 但是,如果您想编写自己的 DB Control Grid VCL 样式挂钩,那么这不是您应该继承的。如果这样做,整个控件就会被绘制成一个非常大的滚动条。

enter image description here

  1. 那么如何自定义数据库控制网格的主题?当您完全禁用主题时,似乎仍然不允许自定义绘制活动行。所以我认为为此必须编写一个自定义子类并重写 Paint 方法,再加上编写一个 VCL 风格的钩子类。

  2. 看来人们应该主要使用常规所有者绘制事件 OnPaintPanel 进行自定义,并且添加该事件(如果您没有这样做)可以修复我在

    TDBCtrlGrid
    中看到的最大的 VCL 样式故障,即它不永远不要使用 SelectedColor,只需将所有内容绘制为纯灰色或任何其他基色。如果有人能证实这一点,或者告诉我其他情况,我将不胜感激。

delphi delphi-xe2 vcl-styles
1个回答
0
投票

创建 TDBCtrlGrid VCL 样式自定义类涉及几个步骤。这是一般指南:

了解 TDBCtrlGrid:TDBCtrlGrid 以自由格式布局显示来自数据源的记录1。每条记录都显示在其自己的面板中。您在设计时设计一个面板,TDBCtrlGrid 会为显示的每条记录复制该面板。

了解 VCL 样式: VCL 样式是一组定义 VCL 应用程序外观的图形细节。您可以更改控件每个部分的外观和状态。

使用位图样式设计器:您可以使用“工具”菜单中的位图样式设计器创建自己的样式或修改现有样式。

管理样式:您可以使用Vcl.Themes.StyleServices函数以编程方式访问有关当前样式的信息。使用 Vcl.Themes.TStyleEngine 类为您的自定义 VCL 组件注册样式钩子类。

每个控件样式设置:通过 VCL 样式功能,您可以在单个应用程序中以不同的形式使用多种 VCL 样式,甚至可以使用同一窗体上的不同可视控件。

自定义控件的样式:使用StyleElements自定义控件的样式。如果启用了自定义样式,您可以启用或禁用控件中的样式元素。

有关更详细的说明,您可能需要查看本教程,了解如何编写 TDBCtrlGrid VCL 样式自定义类。

请注意,这是一般指南,可能不会涵盖创建 TDBCtrlGrid VCL 样式自定义类的所有方面。请始终参阅官方文档和教程以获取全面的说明。 更多..

Delphi 中的 TDBCtrlGrid:

procedure TForm1.Button1Click(Sender: TObject);
var
  I, J: Integer;
  MyPanel: TDBCtrlPanel;
begin
  // Create a new TDBCtrlGrid
  MyDBCtrlGrid := TDBCtrlGrid.Create(Self);
  MyDBCtrlGrid.Parent := Self;
  MyDBCtrlGrid.Align := alClient;

  // Set properties
  MyDBCtrlGrid.DataSource := MyDataSource;
  MyDBCtrlGrid.PanelHeight := 100;
  MyDBCtrlGrid.PanelWidth := 200;

  // Create panels for each record
  for I := 0 to MyDataSource.DataSet.RecordCount - 1 do
  begin
    MyPanel := TDBCtrlPanel.Create(MyDBCtrlGrid);
    MyPanel.Parent := MyDBCtrlGrid;

    // Add controls to the panel
    for J := 0 to MyDataSource.DataSet.FieldCount - 1 do
    begin
      with TDBText.Create(MyPanel) do
      begin
        Parent := MyPanel;
        DataField := MyDataSource.DataSet.Fields[J].FieldName;
        Left := J * 50;
        Top := I * 20;
      end;
    end;

    // Move to the next record
    MyDataSource.DataSet.Next;
  end;
end;

在此示例中,创建了一个 TDBCtrlGrid 并将其链接到数据源。然后,对于数据集中的每条记录,创建一个面板并将其添加到网格中。在每个面板内,为记录中的每个字段创建一个 TDBText 控件。

© www.soinside.com 2019 - 2024. All rights reserved.