2

在 TStringGrid 中选择一个单元格时,将选择整个单元格内容,光标位于选择的末尾。这是个问题。

我的网格是通过实时绑定到 FoxPro 数据库的 TADOConnnection 填充的,我有一个带有 FieldDefs 的 TADODataSet,其中包括字段的大小和数据类型,例如:

object DSProtocol: TADODataSet
    Connection = CONProtocol
    CursorType = ctStatic
    LockType = ltBatchOptimistic
    CommandText = 'select jobc from protocol'
    FieldDefs = <
        item
            Name = 'jobc'
            Attributes = [faFixed]
            DataType = ftFixedChar
            Size = 200
        end>
end

我无法更改底层数据库架构。在大多数情况下,这些字段对于存储的信息来说是超大的,存储在jobc中的最大长度值是 8 个字符长,并且可能永远不会超过 10 个。

对于 UI,我没有理由将包含 jobc 的列调整为显示 200 个字符,我只需要它足够大以显示 10 个字符。但是,TStringGrid 单元格填充了该字段的内容以及足够的空格字符来填充它到200。(为什么?我不知道。)选择时,整个内容都被选中,光标放在选择的末尾,最终结果是看起来内容消失了。

我似乎无法使用任何 TSTringGrid 事件来覆盖此行为。

我尝试快速而肮脏地修复添加(已弃用):

keybd_event(VK_HOME, 0, 0, 0);
keybd_event(VK_HOME, 0, KEYEVENTF_KEYUP, 0);

到 OnGetEditMask 事件,但在开始编辑和完成编辑时,此事件似乎被多次调用。谢天谢地,这不起作用,因为我很想把它留在......

我试图追溯父类以确定调用全选的确切位置,但通过系统单元中的 asm 代码跟踪丢失了。我读到你可以在一个单元中添加一个 D 编译器指令,让调试器跳过这些单元,但出于明显的原因,我真的很犹豫是否要修改任何 VCL 单元。

此时正在寻找任何解决方案(修改 sql 查询?实时绑定属性?字段属性?),但理想情况下想知道这发生在哪里,以便我可以同时存储单元格的初始值。(我想在编辑恢复初始值时添加正常的电子表格类型的转义行为)。

看起来我需要遵循的类链是TInplaceEdit-> TCustomMaskEdit-> TCustomEdit->TWinControl 我假设它在某个地方。

4

0 回答 0