2016-10-05 52 views
0

我使用添加到我的DBGrid以下代码 - OnCellClick事件的DBGrid - OnCellClick&onfocus此,返回包含一个形式/ TBMemo细胞/列值/秒

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 =相同的数据集,数据模块上的数据源,源被命名为comenziSource

好了,所以这段代码的含义:

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

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

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

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

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

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

此外,我使用RAD Studio 10 Seattle和dbexpress组件来完成数据库 - 如果有帮助的话。

谢谢!

+0

没有歧义在所有...我实现类似功能的方法是通过网格列的编辑按钮 - 火灾栅格上的OnEditButtonClick事件。将按钮样式设置为cbsEllipsis,以便在点击时弹出一个对话框。也可以用Alt + Down触发。 –

+0

你好,谢谢你的回复。我已经在使用OnEditButtonClick来做其他事情,所以不能使用它。 Martyn的回答确实有帮助,您的SelectedField评论也一样,谢谢! – Petzy

回答

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更具启发性,因为它显示了如何获取单元格的列和行坐标。请参阅联机帮助中的DBGrid的SelectedField,SelectedIndexSelectedRows属性以获取有关TDBGrid的有用属性的更多信息。

更新您在评论中询问了显示其他表单上的信息的示例。假设这种形式被称为OtherForm,在单元OtherFormu.Pas中,并且在调用evenbt之前创建。您需要在包含DBGrid的设备的使用列表中使用本设备。假设这个其他表单包含名为Memo1的TMemo控件。然后,你可以写你的DBGrid1DblClick hanndler这样的:

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; 
+1

您不需要所有这些单元格定位代码,您可以使用网格的SelectedField。 –

+0

@SertacAkyuz:那么?它说明了如何从头开始,这对知道,imo和提示当感兴趣的单元格当前未被选中时如何做到这一点很有用。 – MartynA

+1

*“那么?”* - 因为代码不是完全必要的。似乎是给我评论的合理理由。 –