我想为每一列创建一个不同的弹出窗口。由于列顺序可以更改,所以我需要通过列标题来标识它,但我没有找到解决方案。
这是我成功应用的两种方法。
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,它可以处理右击列标题:
如果选定的列名= ' test‘,则开始显示消息(’您已经选择了测试列‘);
我将使用if创建动态弹出以应用过滤器。
发布于 2021-10-18 20:22:52
下面的代码是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的值与任何硬编码常量进行比较,但显然这是您的选择。
顺便说一句,如果您更愿意访问为列的内容提供显示值的dataset字段的名称,则可以读取该列的FieldName属性。
https://stackoverflow.com/questions/69621841
复制相似问题