繁体   English   中英

DBGrid-OnCellClick和OnDblClick,返回包含单元格/列值/秒的表单/ TBMemo

[英]DBGrid - OnCellClick & OnDblClick, return a form/TBMemo containing cell/column value/s

我正在使用以下代码添加到我的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 (单元,如表格) -的DataSet是在data module ,因此,dbmodule.comenziDataSet dbmodule.comenziSource =与数据集相同,数据模块上有一个DataSource,其源名为comenziSource

好的,这段代码的作用是:

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

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

是否有可能在使用此代码DBGrid - OnDblClick事件代替的OnCellClick 意思是一旦我双击行/单元格, form应该弹出并显示给我信息,但是双击-而不是单击。

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

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

如果我的解释含糊,我可以发布所有内容的快速视频,您认为这会有所帮助,只需在评论/答案中告诉我即可。

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

谢谢!

下面的代码显示如何访问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事件btw中同样有效。

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

更新您在评论中要求提供一个示例,该示例在另一个表单上显示信息。 让我们假设这种形式称为OtherForm ,是单位OtherFormu.Pas和之前创建DBGrid1DblClick evenbt被调用。 您需要在包含DBGrid的单元的使用列表中使用此单元。 让我们假设另一种形式包含一个称为Memo1的TMemo控件。 然后,您可以这样编写DBGrid1DblClick程序:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM