【问题标题】:DBGrid - OnCellClick & OnDblClick, return a form/TBMemo containing cell/column value/sDBGrid - OnCellClick & OnDblClick,返回一个包含单元格/列值/s的表单/TBMemo
【发布时间】:2016-10-05 21:40:41
【问题描述】:

我正在使用添加到我的 DBGrid - OnCellClick 事件的以下代码

procedure TForm2.DBGrid1CellClick(Column: TColumn);
begin
if dbmodule.comenziDataSet.Active then
  begin
    if not Assigned(dbgridCelulaForm) then
    begin
      dbgridCelulaForm := TdbgridCelulaForm.Create(Self);
      dbgridCelulaForm.DBMemoCelula.DataSource := dbmodule.comenziSource; 
    end;

    dbgridCelulaForm.Visible := False;
    dbgridCelulaForm.Visible := True;
    dbgridCelulaForm.DBMemoCelula.DataField := Column.FieldName;
    dbgridCelulaForm.Caption := Format('%s / randul: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]);
  end;
end;

dbgridCelulaForm = 包含TDBMemo 的表单名称 DBMemoCelula = TDBMemo 的名称 dbmodule.comenziDataSet =comenziDataSet 是DataSet 的名称,dbmodule 是data module 的名称(单位,类似于表单)-DataSetdata module 上,所以,dbmodule.comenziDataSet dbmodule.comenziSource = 同数据集,数据模块上的DataSource,源名为comenziSource

好的,这段代码的作用:

单击DBGrid 上的一个单元格后,它会弹出一个form(名为dbgridCelulaForm),其中包含一个TBMemo(名为DBMemoCelula),它会显示该单元格中包含的信息(例如,客户名称例如,或任何单元格在我的数据库中保存)

这很好,我的问题是我现在无法在DBGrid 中选择行,好吧,我可以,但是一旦我做了第一个地方,我在我想要选择的特定行上单击(一个单元格,任何)我的鼠标,然后单元格激活并弹出form

是否可以在 DBGrid - OnDblClick 事件中使用此代码而不是 OnCellClick ? 这意味着一旦我双击一行/单元格,form 应该会弹出并显示信息,但双击 - 不是单击。

这样,如果需要,我仍然可以选择行并查看单元格中的信息。

或任何其他方式/地方使用/接收此功能。 有什么想法吗?

如果我的解释模棱两可并且您认为这会有所帮助,我可以发布所有内容的快速视频,请在评论/答案中告诉我。

另外,我正在使用 RAD Studio 10 Seattle 和 dbexpress 组件作为数据库 - 如果有帮助的话。

谢谢!

【问题讨论】:

  • 完全没有歧义......我实现类似功能的方式是通过网格列的编辑按钮 - 在网格上触发 OnEditButtonClick 事件。将按钮样式设置为 cbsEllipsis,以便在单击时弹出对话框。也可以通过 Alt+Down 触发。
  • 您好,感谢您的回复。我已经将 OnEditButtonClick 用于其他用途,所以不能使用它。 Martyn 的回答对您的 SelectedField 评论也有帮助,谢谢!

标签: mysql delphi dbgrid tdbgrid


【解决方案1】:

以下代码显示如何访问 TDBGrid 的 dbl 单击单元格的列和行坐标,以及单元格内容的字符串值。

正如所写,它在表单的标题上显示单元格的列和行号 + 字符串内容。由您决定如何处理这些值。

之所以起作用,是因为连接到DBGrid的数据集上的数据集光标移动到了鼠标指针所在单元格对应的数据集行。

type
 TMyDBGrid = class(TDBGrid);

procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
  ARow,
  ACol : Integer;
  Pt : TPoint;
  CellValue : String;
begin
  //  First, get the mouse pointer coordinates
  Pt.X := Mouse.CursorPos.X;
  Pt.Y := Mouse.CursorPos.Y;
  //  Translate them into the coordinate system of the DBGrid
  Pt := DBGrid1.ScreenToClient(Pt);

  //  Use TDBGrids inbuilt functionality to identify the Column and
  //  row number. 
  ACol := DBGrid1.MouseCoord(Pt.X, Pt.Y).X -1;
  ARow := DBGrid1.MouseCoord(Pt.X, Pt.Y).Y;
  CellValue := DBGrid1.Columns[ACol].Field.AsString;

  Caption := Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue]);
end;

请注意,我使用表单的 Caption 属性来显示网格单元格信息,就像在某处显示信息的一种快速且肮脏的方式。当然,您同样可以将其显示在表单的另一个区域或完全不同的表单的某个位置。上面的代码在网格的OnCellClick 事件中同样有效,顺便说一句。

正如评论中所述,您可以使用网格的 SelectedField 属性而不是上面的,但我个人认为上面对如何使用 DBGrid 更有指导意义,因为它显示了如何获取单元格的 Column 和行坐标。有关 TDBGrid 有用属性的更多信息,请参阅联机帮助中的 DBGrid 的 SelectedFieldSelectedIndexSelectedRows 属性。

更新您在评论中询问了在另一个表单上显示信息的示例。假设此表单名为OtherForm,位于OtherFormu.Pas 单元中,并在调用DBGrid1DblClick eventbt 之前创建。您需要在包含 DBGrid 的单元的 Useslist 中使用该单元。让我们假设这个其他窗体包含一个名为 Memo1 的 TMemo 控件。然后,你可以像这样写你的DBGrid1DblClick handler:

procedure TForm1.DBGrid1DblClick(Sender: TObject);
[as above]
begin
  [ as above ]
  CellValue := DBGrid1.Columns[ACol].Field.AsString;

  OtherForm.Memo1.Lines.Add(Format('Col:%d Row:%d Cell Value:%s', [ACol, ARow, CellValue]));
end;

【讨论】:

  • 你不需要所有的单元格定位代码,你可以使用网格的SelectedField。
  • @SertacAkyuz:所以?它说明了如何从头开始执行此操作,这对了解 imo 很有用,并提示在当前未选择感兴趣的单元格时如何执行此操作。
  • “所以?” - 因为代码不是完全必要的。似乎是对我发表评论的正当理由。
  • @SertacAkyuz:很公平。
  • @MartynA - 你太棒了。您一直在回答我的问题,到目前为止,您的回答非常出色。真的谢谢你。它完美地工作。 2 个问题:您提到它更改了标题,但我希望它不是标题,而是显示相应数据的新 TForm,我可以关闭它。第二个问题是 - 如果我在(单击,而不是双击)之后选择另一行,标题不会恢复到以前的状态。如果我可以在 TForm 中显示第二个问题,那将不是问题,但我只是提到它,以便其他人可以知道他们是否来到这里并将代码用作标题。
猜你喜欢
  • 2015-02-20
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
相关资源
最近更新 更多