1

RowSelect は OnCellClick の機能を壊すので、RowSelect をオフにする必要があります。では、現在の行のすべてのセルを強調表示して、行選択の外観をシミュレートするにはどうすればよいですか?

4

2 に答える 2

1

TDBGrid.OnDrawColumnCellイベントを使用しState、行が選択されていることを示すように を設定します。

procedure TfrmPrimaryCare.dbGrdPCClaimsDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  NewState: TGridDrawState;
  RowSelected: Boolean;
begin
  NewState := State;
  RowSelected := (Sender as TDBGrid).SelectedRows.CurrentRowSelected;
  if (RowSelected) then
    NewState := NewState + [gdSelected];
  TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, NewState);
end;
于 2012-12-11T16:52:34.607 に答える
1

これは私にとってはうまくいきました(dgRowSelect=FalseおよびdgMultiSelect=False):保護されたメソッドと2つの変数にアクセスするため
のハックタイプを宣言しますDBGridGridDataLink

type
  THackGrid = class(TDBGrid);
  THackDataLink = class(TGridDataLink);
var
  HackGrid: THackGrid;
  HackDataLink: THackDataLink;

OnFormCreate変数を割り当てて、描画時に使用できるようにします。

procedure TMyForm.FormCreate(Sender: TObject);
begin
  HackGrid := THackGrid(MainGrid);
  HackDataLink := THackDataLink(HackGrid.DataLink);
end;

を使用して選択した行をテストしTGridDataLink.GetActiveRecordます。

procedure TMyForm.MainGridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
  if Not (gdSelected in State) and (HackGrid.Row = HackDataLink.GetActiveRecord + 1) then
    MainGrid.Canvas.Brush.Color := clInfoBk;

  MainGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
于 2016-07-20T17:03:28.063 に答える