我已经更改了 D6 字符串网格,以允许在网格单元格中显示左对齐或右对齐复选框。当调用原位编辑器时,用于接收数据的编辑框从单元格的开头开始,其宽度覆盖了单元格的整个宽度(即,它填充了单元格,完全覆盖了我的复选框,直到重新绘制)。如何实现自己的就地编辑器并控制编辑器的起始位置及其宽度?在此先感谢大家。账单
1 回答
TStringGrid
本身并不支持您的要求。就地编辑器的坐标固定到整个单元格边界,因为它从未设计为将用户定义的单元格控件考虑在内。
当TStringGrid
定位编辑器时,它调用CellRect()
(不是虚拟的)并将返回的值传递TRect
给TInplaceEdit.Move()
(不是虚拟的),后者调用(这是私有的)使用 Win32 API函数TInplaceEditor.InternalMove()
将编辑器 HWND 移动到指定的坐标和大小。SetWindowPos()
您能够更改该逻辑的唯一方法是:
复制
Grids.pas
并更改TStringGrid
的源代码,然后将修改后的文件添加到您的项目中(这仅在运行时包被禁用时才有效)。使用钩子/绕道重定向
TInplaceEdit.Move()
到自定义方法,您可以在其中更改内容,TRect
然后再将其传递给原始实现。
更新:现在我想得更多,当or消息询问时,您可能能够从中派生一个类TInplaceEdit
并覆盖其虚拟WndProc()
方法以计算不同的位置/大小信息。或者在网格将编辑器定位/调整到它想要的位置后,重写它的虚拟方法来重新定位/调整编辑器的大小。无论哪种方式,您都可以覆盖虚拟方法以使网格创建编辑器类的实例。WM_GETMINMAXINFO
WM_WINDOWPOSCHANGING
BoundsChanged()
TStringGrid.CreateEditor()