通过 DBGrid 列标题做一个 IF

Do an IF by DBGrid Column Title

我想为每一列创建一个不同的弹出窗口。由于列顺序可以更改,我需要通过列标题来识别它,但我还没有找到解决方案。

这是我用过的两种方法,都没有成功。

    procedure TForm2.DBGrid1MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
var
  ACol, ARow: Integer;
begin
  if Y < DBGrid1.DefaultRowHeight then
  begin
    (Sender as TDBGrid).MouseToCell(X, Y, ACol, ARow);
    if Button = mbRight then
    begin
    if DBGrid1.SelectedColumn.FieldName = 'Title1' then
      BEGIN
        ShowMessage('Title1'+ IntToStr(ACol));
      end;
 
      if DBGrid1.SelectedColumn.FieldName = 'Title2' then
      BEGIN
        ShowMessage('Title2'+ IntToStr(ACol));
      end;    
end;
end;
end; 

它不起作用,因为它通过 ID 而不是名称来标识列,因此如果用户更改列顺序,它将无法正常工作。

还有这个错误代码

procedure TForm2.Button2Click(Sender: TObject);
var
  i: Integer;
  CaptionText: string;
begin
  for i := 0 to DBGrid1.Columns.Count - 1 do
  case DBGrid1.Columns[i].FieldName of
    'TEST':
      begin
        DBGrid1.Columns[i].Title.Caption := 'REPLACE TEXT';
      end;
  end;  
end;   

只需单击一下即可替换所有标题。

我想要做的是创建一个这样的 IF 来处理右键单击列标题:

if selected column name = 'test' then 开始 显示消息('You have selected test column'); 结束;

我将使用 if 创建动态弹出窗口以应用过滤器。

下面的代码是 TDBGrid 的 MouseMove 事件的事件处理程序,它 显示鼠标悬停在窗体标题上的列标题的标题。

procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Col,
  Row : Integer;
begin
  Col := DBGrid1.MouseCoord(X, Y).X;
  Row := DBGrid1.MouseCoord(X, Y).Y;
  if (dgIndicator in DBGrid1.Options) then
    Dec(Col);
  if (Col >= 0) and (Col < DBGrid1.Columns.Count) then
    Caption := DBGrid1.Columns[Col].Title.Caption
  else
    Caption := '';
end;

请注意

if (dgIndicator in DBGrid1.Options) then
    Dec(Col);

是为了在 dgIndicator 选项关闭时调整正确操作的行为。

显然,而不是

Caption := DBGrid1.Columns[Col].Title.Caption

你可以

MenuItem.Caption := DBGrid1.Columns[Col].Title.Caption

将列标题复制到菜单项的标题中。我认为您可能不需要对 Title.Caption 的值与任何 hard-coded 常量进行任何比较,但显然这是您的选择。

顺便说一句,如果您更愿意访问为列内容提供显示值的数据集字段的名称,您可以阅读列的 FieldName 属性.