TDrawGrid OnSetEditText触发两次+ Inplace Editors + TCustomGrid

时间:2010-07-21 21:12:53

标签: delphi

我(在D2010中)在我的表单上有一个TDrawGrid。我正在处理我的OnDrawCell,OnSetEditText,OnSetEditText等所有gfine。

但是,如果您在特定情况下进入具有某些文本的单元格,请在其整数中突出显示该文本,然后键入要替换的某个字符。现在,OnSetEditText事件从一个按键连续触发两次,首先是一个空字符串,然后是一个包含您键入的字符的字符串。这是正确的还是错误的?我原本希望用包含我的单个字符的字符串来触发事件一次。

我正在使用OnSetEdit文本来设置其他类属性,这些属性就像验证一样,所以当上面的情况导致我的其他代码暂时考虑我的类属性无效时,在第二次火上再次设置回有效之前,它仍然有不可取的后果,我想停止第一次事件发射,或得到我可以下注的工作。

现在关于网格问题,我可以向你们大家提出有关愚蠢事情的有用提示。我是相当新的从p#deplhi(我会走另一条路!)但我发现文件在地面上非常薄,并且得到令人惊讶的有限结果谷歌搜索的东西,所以你的帮助真的很感激。

1)TDrawGrid的自定义内部编辑器 - 任何提示或好的链接赞赏! 2)对于客户现场编辑,我最好使用TDrawGrid还是从TCustomGrid下降我自己的控制并从那里开始? 3)TCustomGrid。我在这里无处可去......如果我创建一个新的组件并从TCustomGrid下降,我只是在我将其放入表单时得到一个“抽象错误”。因此,进一步的实验非常有意义 - 甚至开始使用TCustomGrid的建议值得赞赏!

我的计划是首先让组合框(在虚拟模式下)作为单元格编辑器工作。这是标准的VCL控制。之后我计划基于虚拟组合框创建我自己的控件,但在顶部有一个搜索内容来过滤列表(有点像Delphi IDE Tool pallette),如果可能的话,使用这个组件作为inlace编辑器。我现在很平常!谢谢大家

编辑:Remy - 这是我在OnSetEditText中从beak点开始的两个调用栈。左边是第一个用空字符串触发,右边是第二个用正确的字符串值触发。中间的5条截断线都是对两者中comctl32.dll的引用。 TY。

Click here for call stack

2 个答案:

答案 0 :(得分:2)

只要因任何原因更新了就地编辑器的内容,在选择不同的值后关闭了下拉编辑器,双击了下拉编辑器,或者一个事件,就会触发OnSetEditText事件调用下拉编辑器的RestoreContents()方法。所以你很可能会一个接一个地更新编辑器。我建议你在TCustomDrawGrid.SetEditText()方法中放置一个断点,看看每次触发事件时调用堆栈的样子。

关于#2,你从中得到什么并不重要。任何TCustomGrid后代都可以拥有自定义的inplace编辑器。只需覆盖虚拟CreateEditor()方法。

关于#3,如果在直接从TCustomGrid派生时遇到abstrct错误,那么你没有正确地override它的抽象方法。

网格本身已经支持模拟组合框的下拉内置编辑器。查看TInplaceEditList课程。您可以使用OnGetPickListItems事件在编辑器中填入值。另外,请查看TValueListEditor如何实现其自定义编辑器。

答案 1 :(得分:-1)

关于“抽象错误”

Delphi 中,“抽象错误”的原因是您尝试使用未重写的virtual abstract方法实例化类。如果你看到这样的错误,你应该看看父对象的定义(在这种情况下是TCustomGrid),看看它的哪个方法是virtual abstract,那么你应该override那些函数在你的后代班。

请注意,Delphi(很差)只需要覆盖被调用的函数,因此很多编码器甚至都不知道上述行为的原因。