TStringGridで、gofixedrowclick=True のとき、cell[0,1]をクリックで沈み込まないようにするには

解決


Nov  2012-01-06 19:27:30  No: 41406

お世話になります。
TStringGridで、1行目(Row=0)の固定セルををクリック可能にしようとして、
 FixedCols := 1;
 FixedRows := 1;
 Options := Options+[gofixedrowclick]; // 他はデフォルト
としましたが、2行目の固定セルもクリックで沈み込んでしまいます。
これを回避する方法を教えてください。


au  2012-01-06 20:59:20  No: 41407

こんな感じですかね。
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;


Nov  2012-01-06 22:39:59  No: 41408

うまくいきました。

vclのバグを見つけられるなんて...

素晴らしい回答、ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加