#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
.