我将复选框 ( ) 放在第一列TCheckBox
的字符串网格 ( ) 中。TStringGrid
复选框显示良好,位置正确,鼠标悬停时会发光以响应鼠标。但是,当我单击它们时,它们不会切换。他们对点击做出反应,并突出显示,但最终,实际Checked
属性没有改变。更令人费解的是,一旦它们存在,我没有任何代码更改这些值,我什至没有OnClick
为这些复选框分配事件。另外,我将这些复选框默认为unchecked,但是当显示时,它们被选中。
复选框与添加到列表中的每条记录一起创建,并在记录指针内引用,该记录指针分配给要放置复选框的单元格中的对象。
用于单元格突出显示的字符串网格破解:
type
THackStringGrid = class(TStringGrid); //used later...
包含复选框的记录:
PImageLink = ^TImageLink;
TImageLink = record
...other stuff...
Checkbox: TCheckbox;
ShowCheckbox: Bool;
end;
复选框的创建/销毁:
function NewImageLink(const AFilename: String): PImageLink;
begin
Result:= New(PImageLink);
...other stuff...
Result.Checkbox:= TCheckbox.Create(nil);
Result.Checkbox.Caption:= '';
end;
procedure DestroyImageLink(AImageLink: PImageLink);
begin
AImageLink.Checkbox.Free;
Dispose(AImageLink);
end;
将行添加到网格:
//...after clearing grid...
//L = TStringList of original filenames
if L.Count > 0 then
lstFiles.RowCount:= L.Count + 1
else
lstFiles.RowCount:= 2; //in case there are no records
for X := 0 to L.Count - 1 do begin
S:= L[X];
Link:= NewImageLink(S); //also creates checkbox
Link.Checkbox.Parent:= lstFiles;
Link.Checkbox.Visible:= Link.ShowCheckbox;
Link.Checkbox.Checked:= False;
Link.Checkbox.BringToFront;
lstFiles.Objects[0,X+1]:= Pointer(Link);
lstFiles.Cells[1, X+1]:= S;
end;
Grid 的 OnDrawCell 事件处理程序:
procedure TfrmMain.lstFilesDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
Link: PImageLink;
CR: TRect;
begin
if (ARow > 0) and (ACol = 0) then begin
Link:= PImageLink(lstFiles.Objects[0,ARow]); //Get record pointer
CR:= lstFiles.CellRect(0, ARow); //Get cell rect
Link.Checkbox.Width:= Link.Checkbox.Height;
Link.Checkbox.Left:= CR.Left + (CR.Width div 2) - (Link.Checkbox.Width div 2);
Link.Checkbox.Top:= CR.Top;
if not Link.Checkbox.Visible then begin
lstFiles.Canvas.Brush.Color:= lstFiles.Color;
lstFiles.Canvas.Brush.Style:= bsSolid;
lstFiles.Canvas.Pen.Style:= psClear;
lstFiles.Canvas.FillRect(CR);
if lstFiles.Row = ARow then
THackStringGrid(lstFiles).DrawCellHighlight(CR, State, ACol, ARow);
end;
end;
end;
这是单击时的外观...
这可能是什么原因造成的?它绝对不会改变Checked
我代码中任何地方的属性。当放置在网格中时,复选框本身会出现一些奇怪的行为。
编辑
我做了一个简短的测试,我TCheckBox
在表格上放了一个常规。检查/取消检查很好。然后,在我的表单OnShow
事件中,我将复选框更改Parent
为这个网格。这一次,我得到了相同的行为,单击时不切换。TCheckBox
因此,当 a有另一个控件作为其父控件时,它似乎没有正确反应。如何克服这一点?