通过 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
属性.
我想为每一列创建一个不同的弹出窗口。由于列顺序可以更改,我需要通过列标题来识别它,但我还没有找到解决方案。
这是我用过的两种方法,都没有成功。
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
属性.