Сделайте ЕСЛИ по заголовку столбца DBGrid

#lazarus

Вопрос:

Я хочу создать другое всплывающее окно для каждого столбца. Поскольку порядок столбцов может быть изменен, мне нужно определить это по названию столбца, но я не нашел решения.

Это два метода, которые я безуспешно применил.

     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; 
 

Он не работает, потому что он идентифицирует столбцы по идентификатору, а не по имени, поэтому, если пользователь изменит порядок столбцов, он не будет работать нормально.

Также этот код сбоя

 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 для создания динамического всплывающего окна для применения фильтров.

Ответ №1:

Приведенный ниже код является обработчиком событий для события 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
 

чтобы скопировать заголовок столбца в заголовок элемента меню. Я думаю, что вам, вероятно, не нужно проводить какое-либо сравнение названия.Значение подписи с любыми жестко заданными константами, но, очевидно, это ваш выбор.

Кстати, если вы предпочитаете получить доступ к имени поля набора данных, которое предоставляет отображаемые значения для содержимого столбца, вы можете прочитать свойство столбца FieldName .