gpt4 book ai didi

delphi - 如何在TDBGrid中设置事件单元格?

转载 作者:行者123 更新时间:2023-12-03 15:27:43 26 4
gpt4 key购买 nike

我想通过代码激活 TDBGrid 中的单元格。我所说的“激活”是指用户在单元格内部单击,准备编辑单元格内容。我怎样才能做到这一点?

编辑:这可能涉及两个步骤:更改当前事件的单元格,然后进入编辑模式。

最佳答案

如果您的意思是“激活当前事件单元格的编辑模式”,那么您可能应该这样做:

MyDBGrid.EditorMode := True;

可以通过SelectedIndex激活特定单元格:

MyDBGrid.SelectedIndex := 2;  { or maybe MyDBGrid.SelectedIndex + 1 }

或通过SelectedField:

MyDBGrid.SelectedField := MyDataSet.FieldByName('Name');

要确定当前鼠标光标所在的单元格,可以使用 MouseCoord,它返回一个 TGridCoord 记录,其中保存光标所在单元格的坐标。 TGridCoord.X 字段可直接用于设置网格的事件列。

var
Cell: TGridCoord;

...

Cell := MyDBGrid.MouseCoord(X, Y);
MyDBGrid.SelectedIndex := Cell.X;

设置行比较棘手,到目前为止,我能找到的唯一方法涉及所谓的“ protected 黑客”,即访问类的 protected 属性和方法的方法。我们需要‘破解’的是 TDBGrid 类。

基本上,您声明 TDBGrid 的空后代,如下所示:

type
THackDBGrid = class(TDBGrid);

然后,当您需要访问 protected 属性或方法时,只需将标准类的实例(在本例中为MyDBGrid)转换为“黑客”类型(THackDBGrid):

… THackDBGrid(MyDBGrid).<i>protected_property_or_method</i> …

我们感兴趣的项目是 Row 属性。它返回事件行的 Y 坐标。我们需要知道它来确定事件行和光标下的行之间的差异,以便我们可以相应地移动基础数据集的记录指针。方法如下:

MyDataSet.MoveBy(Cell.Y - THackDBGrid(MyDBGrid).Row);

Row 值不是绝对的:它是相对于可见顶行的,但 TGridCoord.Y 也是如此,因此两者之间的差异对应于差异基础数据集中的数据行之间。

我想强调的一件事:这种 protected 黑客方法应该谨慎使用。 protected 项目受到保护是有原因的。所以,如果你能避免它,请尽量避免。如果您不能(没有其他方法或者它可以帮助您更轻松地完成任务),请记住不要使用 protected 黑客直接更改任何内容。我的意思是,这可能没问题,但通常你永远无法确定。你可以看到我只使用该方法读取 protected 内容,我没有直接更改任何内容。对象的状态最终发生了变化,但这是由 MoveBy 方法触发的标准机制的结果。

您可以阅读有关 protected 黑客的更多信息 here .

关于delphi - 如何在TDBGrid中设置事件单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7978780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com