TCheckBox
最初の列の文字列グリッド ( )にチェックボックス ( ) を配置TStringGrid
しています。チェックボックスは正しく表示され、正しく配置され、マウスをホバーすると光って反応します。ただし、それらをクリックしてもトグルしません。それらはクリックに反応して強調表示されますが、最終的に実際のChecked
プロパティは変更されません。OnClick
さらに不可解なのは、これらの値がいったんそこにあると変更するコードがなく、これらのチェックボックスにイベントが割り当てられていないことです。また、これらのチェックボックスをデフォルトでオフにしていますが、表示されるとチェックされます。
チェックボックスは、リストに追加される各レコードとともに作成され、チェックボックスが配置されるセル内のオブジェクトに割り当てられたレコード ポインター内で参照されます。
セルの強調表示のための文字列グリッドのハック:
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;
グリッドの 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 が正しく反応しないようです。これを克服する方法は?