お世話になります。
TStringGridで、1行目(Row=0)の固定セルををクリック可能にしようとして、
FixedCols := 1;
FixedRows := 1;
Options := Options+[gofixedrowclick]; // 他はデフォルト
としましたが、2行目の固定セルもクリックで沈み込んでしまいます。
これを回避する方法を教えてください。
こんな感じですかね。
gridを置いてるformの定義の前に下記TStringGridの定義をコピペして使って下さい。
どうも、VCLのバグっぽい感じがしますね。元のソースだと下記の判定が<=とFixedRows、FixedCols以下と判定してるので2行目である(0,1)セルでクリック処理が走ってしまってるようです。
if ((goFixedRowClick in Options) and (CellHit.Y < FixedRows)) or
((goFixedColClick in Options) and (CellHit.X < FixedCols)) then
以下、ソース
TStringGrid = class(Vcl.Grids.TStringGrid)
protected
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
end;
{ TStringGrid }
procedure TStringGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
var
CellHit: TGridCoord;
begin
inherited;
if FGridState = gsNormal then
begin
if (csDesigning in ComponentState) then
Exit;
// Highlight "fixed" cell
MouseToCell(X, Y, CellHit.X, CellHit.Y);
if ((goFixedRowClick in Options) and (CellHit.Y < FixedRows)) or
((goFixedColClick in Options) and (CellHit.X < FixedCols)) then
begin
if (FHotTrackCell.Coord.X <> -1) or (FHotTrackCell.Coord.Y <> -1) then
InvalidateCell(FHotTrackCell.Coord.X, FHotTrackCell.Coord.Y);
if (CellHit.X <> FHotTrackCell.Coord.X) or (CellHit.Y <> FHotTrackCell.Coord.Y) then
begin
FHotTrackCell.Coord := CellHit;
FHotTrackCell.Pressed := False;
InvalidateCell(FHotTrackCell.Coord.X, FHotTrackCell.Coord.Y);
end;
end
else
if (FHotTrackCell.Coord.X <> -1) or (FHotTrackCell.Coord.Y <> -1) then
begin
InvalidateCell(FHotTrackCell.Coord.X, FHotTrackCell.Coord.Y);
FHotTrackCell.Coord.X := -1;
FHotTrackCell.Coord.Y := -1;
FHotTrackCell.Pressed := False;
end;
end;
end;
うまくいきました。
vclのバグを見つけられるなんて...
素晴らしい回答、ありがとうございます。
ツイート | ![]() |