如何初始化TColumnEh

How to initialize TColumnEh

这是一个简单的问题。 如何初始化变量Column以进行如下语句。

procedure TfmSomeForm.grdSomeGridDblClick(Sender: TObject);
var
  Column: TColumnEh;
  IsSomething: Boolean;
begin
  inherited;   
  //Initialize Column

  IsSomething := False;
  if Column.FieldName = 'SOMETHING' then
    IsSomething := True;

以这种方式初始化列

 Column := grdSomeGrid.Columns.FindColumnByName('SOMETHING');

没有意义,可能会导致异常 我必须在这里做

procedure TfmSomeForm.grdSomeGridCellClick(Column: TColumnEh);
begin
  inherited;
  FIsSomething := False;
  if Column.FieldName = 'SOMETHING' then
    FIsSomething := True;
end;

问题是我需要这个标志 onDblClick 并且我不想让它成为全局的。

你没有说你的 grdSomeGrid 是哪种数据类型。但是,对于普通的 TDBGrid,您似乎想做的事情在 DblClick 事件本身中很简单。

procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
  ACol : Integer;
  Pt : TPoint;
  CellValue : String;
begin
  { pick up the mouse cursor pos and convert to DBGrid's internal  coordinates }
  Pt.X := Mouse.CursorPos.X;
  Pt.Y := Mouse.CursorPos.Y;
  Pt := DBGrid1.ScreenToClient(Pt);

 { find the column number of the double-clicked column}
  ACol := DBGrid1.MouseCoord(Pt.X, Pt.Y).X - 1;

  if DBGrid1.Columns[ACol].FieldName = 'SOMETHING' then
    { do what you want}
end;

更新:Victoria 有帮助地提到了 SelectedIndex,这是获取当前列的另一种方法,但我总是设法忘记它,因为它的名称不包括Column 并且该行没有直接对应项(因为行操作基于书签,而不是行索引)。

所以,我按照我的方式来做,因为它提醒我如何获取活动的列和行索引,并且很容易编写一个同时获取两者的独立函数,如下所示:

type
  TRowCol = record
    Row,
    Col : Integer;
  end;

function GetRowCol(Grid : TDBGrid) : TRowCol;
var
  Pt : TPoint;
begin
  { pick up the mouse cursor pos and convert to DBGrid's internal  coordinates }
  Pt.X := Mouse.CursorPos.X;
  Pt.Y := Mouse.CursorPos.Y;
  Pt := Grid.ScreenToClient(Pt);

  Result.Row := Grid.MouseCoord(Pt.X, Pt.Y).Y;
  Result.Col := Grid.MouseCoord(Pt.X, Pt.Y).X;

  { adjust Col value to account for whether the grid has a row indicator }
  if dgIndicator in Grid.Options then
    Dec(Result.Col);

end;