这里有很多关于 XE2 VCL 样式和按钮、面板、编辑等的自定义颜色以及 VCL 样式的问题。尽管我希望现有的问题能够涵盖它,但它们并没有......所以数据库控制网格似乎是另一个特殊情况。
在DB Control Grid VCL源代码中,它注册了一个样式钩子:
TCustomStyleEngine.RegisterStyleHook( TDBCtrlGrid, TScrollingStyleHook);
但是,如果您想编写自己的 DB Control Grid VCL 样式挂钩,那么这不是您应该继承的。如果这样做,整个控件就会被绘制成一个非常大的滚动条。
那么如何自定义数据库控制网格的主题?当您完全禁用主题时,似乎仍然不允许自定义绘制活动行。所以我认为为此必须编写一个自定义子类并重写 Paint 方法,再加上编写一个 VCL 风格的钩子类。
看来人们应该主要使用常规所有者绘制事件 OnPaintPanel 进行自定义,并且添加该事件(如果您没有这样做)可以修复我在
TDBCtrlGrid
中看到的最大的 VCL 样式故障,即它不永远不要使用 SelectedColor,只需将所有内容绘制为纯灰色或任何其他基色。如果有人能证实这一点,或者告诉我其他情况,我将不胜感激。创建 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 控件。