0

我已经更改了 D6 字符串网格,以允许在网格单元格中显示左对齐或右对齐复选框。当调用原位编辑器时,用于接收数据的编辑框从单元格的开头开始,其宽度覆盖了单元格的整个宽度(即,它填充了单元格,完全覆盖了我的复选框,直到重新绘制)。如何实现自己的就地编辑器并控制编辑器的起始位置及其宽度?在此先感谢大家。账单

4

1 回答 1

1

TStringGrid本身并不支持您的要求。就地编辑器的坐标固定到整个单元格边界,因为它从未设计为将用户定义的单元格控件考虑在内。

TStringGrid定位编辑器时,它调用CellRect()(不是虚拟的)并将返回的值传递TRectTInplaceEdit.Move()(不是虚拟的),后者调用(这是私有的)使用 Win32 API函数TInplaceEditor.InternalMove()将编辑器 HWND 移动到指定的坐标和大小。SetWindowPos()

您能够更改该逻辑的唯一方法是:

  1. 复制Grids.pas并更改TStringGrid的源代码,然后将修改后的文件添加到您的项目中(这仅在运行时包被禁用时才有效)。

  2. 使用钩子/绕道重定向TInplaceEdit.Move()到自定义方法,您可以在其中更改内容,TRect然后再将其传递给原始实现。

更新:现在我想得更多,当or消息询问时,您可能能够从中派生一个类TInplaceEdit并覆盖其虚拟WndProc()方法以计算不同的位置/大小信息。或者在网格将编辑器定位/调整到它想要的位置后,重写它的虚拟方法来重新定位/调整编辑器的大小。无论哪种方式,您都可以覆盖虚拟方法以使网格创建编辑器类的实例。WM_GETMINMAXINFOWM_WINDOWPOSCHANGINGBoundsChanged()TStringGrid.CreateEditor()

于 2014-08-11T19:37:08.907 回答