我想创建一个属性编辑器,因为很多东西不受TValueListEditor的支持。所以我使用了一个TStringGrid和其他控件放置在它上面,当用户输入单元格时会出现。当我为布尔值放置一个TCheckBox时,动态创建的TCheckBox无法勾选。onClick事件处理程序不会被点击触发(网格会被触发),而TCheckBox的标题失去了其不透明度。我设置了它的父级并将其带到前面。此时我也使用了TEdit和TComboBox控件,它们工作正常。有人可以帮助我按预期方式使用它吗?
这里是一个重新创建情况的示例。 pas:
dfm是数据流管理器的缩写。
这里是一个重新创建情况的示例。 pas:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids,
StdCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure onCheckBoxClicked( sender_ : TObject );
public
{ Public declarations }
fCheckBox : TCheckBox;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.onCheckBoxClicked( sender_ : TObject );
begin
if ( TCheckBox( sender_ ).checked ) then
TCheckBox( sender_ ).caption := 'true'
else
TCheckBox( sender_ ).caption := 'false';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
fCheckBox := TCheckBox.create( NIL );
fCheckBox.Parent := stringGrid1;
fCheckBox.caption := 'Dynamic checkbox';
fCheckBox.left := 70;
fCheckBox.top := 30;
fCheckBox.onClick := onCheckBoxClicked;
fCheckBox.BringToFront;
stringgrid1.cells[1,1] := 'fgfgfgfgfgf';
stringgrid1.cells[1,2] := 'fgfgfgfgfgf';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
fCheckBox.Free;
end;
end.
dfm是数据流管理器的缩写。
object Form1: TForm1
Left = 358
Top = 183
Caption = 'Form1'
ClientHeight = 601
ClientWidth = 854
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object StringGrid1: TStringGrid
Left = 120
Top = 72
Width = 320
Height = 120
TabOrder = 0
end
object CheckBox1: TCheckBox
Left = 192
Top = 128
Width = 97
Height = 17
Caption = 'Static checkbox'
TabOrder = 1
end
end
TValueListEditor
无法处理什么问题?TStringGrid
不适合托管子控件,除了它自己的原地单元格编辑器。您可以尝试使用网格的OnDrawCell
事件来绘制所需单元格上的 复选框 图像,然后使用网格的OnMouseDown/Up
事件来“切换”单元格的选中状态。您可以使用网格的Objects
属性来跟踪状态数据。 - Remy Lebeau