我想通过代码激活一个单元格TDBGrid。我所说的“激活”是指用户在单元格内部单击,准备编辑单元格内容。我怎么能这样做呢?
编辑:这可能涉及两个步骤:更改当前活动的单元格,然后进入编辑模式。
如果您的意思是\xe2\x80\x98activate 当前活动单元格\xe2\x80\x99 的编辑模式,那么您可能应该这样做:
\n\nMyDBGrid.EditorMode := True;\nRun Code Online (Sandbox Code Playgroud)\n\n激活特定单元格可以通过以下方式完成SelectedIndex:
MyDBGrid.SelectedIndex := 2; { or maybe MyDBGrid.SelectedIndex + 1 }\nRun Code Online (Sandbox Code Playgroud)\n\n或通过SelectedField:
MyDBGrid.SelectedField := MyDataSet.FieldByName(\'Name\');\nRun Code Online (Sandbox Code Playgroud)\n\n要确定当前鼠标光标位于哪个单元格,可以使用MouseCoord,它返回TGridCoord保存光标下单元格坐标的记录。该TGridCoord.X字段可直接用于设置网格的活动列。
var\n Cell: TGridCoord;\n\n...\n\nCell := MyDBGrid.MouseCoord(X, Y);\nMyDBGrid.SelectedIndex := Cell.X;\nRun Code Online (Sandbox Code Playgroud)\n\n设置行比较棘手,到目前为止,我能找到的唯一方法涉及所谓的protected hack,即访问类的受保护属性和方法的方法。这就是TDBGrid我们需要\xe2\x80\x98hack\xe2\x80\x99 的类。
基本上,您声明 的空后代TDBGrid,如下所示:
type\n THackDBGrid = class(TDBGrid);\nRun Code Online (Sandbox Code Playgroud)\n\n然后,当您需要访问受保护的属性或方法时,只需将标准类的实例(MyDBGrid在本例中)转换为 \xe2\x80\x98hacked\xe2\x80\x99 类型 ( THackDBGrid):
\xe2\x80\xa6 THackDBGrid(MyDBGrid).protected_property_or_method \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n\n我们感兴趣的项目是Row财产。它返回活动行的 Y 坐标。我们需要知道它来确定活动行和光标下的行之间的差异,以便我们可以相应地移动基础数据集的记录指针。就是这样:
MyDataSet.MoveBy(Cell.Y - THackDBGrid(MyDBGrid).Row);\nRun Code Online (Sandbox Code Playgroud)\n\n该Row值不是绝对的:它是相对于可见顶行的,但 也是相对的TGridCoord.Y,因此两者之间的差异对应于基础数据集中数据行之间的差异。
我想强调的一件事是:这种受保护的黑客方法应该谨慎使用。受保护的项目受到保护是有原因的。所以,如果你能避免它,请尽量避免。如果你不能(没有其他方法或者它可以帮助你更轻松地做事),请记住不要使用 protected hack 直接更改任何内容。我的意思是,这可能没问题,但通常你永远无法确定。你可以看到我只是使用了读取受保护内容的方法,并没有直接改变任何东西。对象的状态最终被更改,但这是该方法触发的标准机制的结果MoveBy。
您可以在此处阅读有关受保护黑客的更多信息。
\n| 归档时间: |
|
| 查看次数: |
19626 次 |
| 最近记录: |