Search code examples
lazarus

Do an IF by DBGrid Column Title


I want to create a different Popup for each column. Since the columns order can be changed I need to identify that by the column title but I have not found a solution.

These are two method I have applied without success.

    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; 

It is not functional because it identifies the columns by id and not the name so if the user change the columns order it will not work fine.

Also this faily code

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;   

It simply replace all titles in a click.

What I'm looking to do is to create an IF like this that handle on right clicking column title:

if selected column name = 'test' then begin showmessage('You have selected test column'); end;

I'll use the if to create dynamic popup to apply filters.


Solution

  • The code below is an event handler for a TDBGrid's MouseMove event which displays the Caption of the Title of the column the mouse is over on the caption of the form.

    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;
    

    Note that the

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

    is to adjust the behaviour for correct operation if the dgIndicator option is turned off.

    Obviously, instead of

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

    you could do

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

    to copy the column title to a menuitem's caption. I think you probably don't need to do any comparison of the Title.Caption's value with any hard-coded constants, but obviously that's your choice.

    Btw, if you would rather access the name of the dataset field which is supplying the displayed values for the Column's contents, you can read the Column's FieldName property.