2015-05-29 41 views
0

当在TEdits之间切换焦点时,选择将根据您显示表单的方式而变化。 当您用Form.show显示它,并在两个TEdits之间切换时,将选中该文本。 当你表现出与Form.Showmodal形式,而且之间切换时,光标是在新的重点TEditTEdit和焦点选择根据Show/showmodal的不同而不同

重现结束:创建一个新的形式,请在双方一些文本。然后在两个TEdits之间切换,选择整个文本,但是当我用Modal显示窗体时,插入符号位于文本后面。

为什么在功能上有所不同?我在哪里可以改变它。

我找到负责代码:

procedure TStyledEdit.DoEnter; 
var 
    Form: TCommonCustomForm; 
begin 
    inherited; 
    Form := TCommonCustomForm(Root); 
    if not Model.IsReadOnly and Model.InputSupport and not FTextService.HasMarkedText and 
    ((Form = nil) 
//next part returns false 
or (Form.FormState * [TFmxFormState.Showing] = [TFmxFormState.Showing]) or 
    (Form.FormState = [TFmxFormState.Engaged])) then 
    Edit.SelectAll 
    else 
    begin 
    UpdateSelectionPointPositions; 
    UpdateCaretPosition; 
    end; 
end; 
+0

我无法重现您所描述的问题。行为完全一样。 XE8。 – Zam

回答

0

DoEnter是一个受保护的方法,因此,你可以,如果你想用自己的方法来覆盖。

您可以通过创建自己的后代类(使用不同的类型名称)来执行此操作,也可以使用所谓的拦截器类,如本链接中所述:interceptor classes

我认为你需要扩展if语句是这样的(而不是测试 - 对不起)

if not Model.IsReadOnly and Model.InputSupport and not FTextService.HasMarkedText and 
    ((Form = nil) 
    or (Form.FormState * [TFmxFormState.Showing] = [TFmxFormState.Showing]) 
    or (Form.FormState * [TFmxFormState.Modal] = [TFmxFormState.Modal]) 
    or (Form.FormState = [TFmxFormState.Engaged])) then 
+0

也许这个问题并不清楚,但是运行的代码来自TStyledEdit,当你关注TEdit时会触发。我无法拦截TSyledEdit的代码,因为我的控件是一个TEdit类,当我为TEdit创建一个拦截器类并执行'SelectAll'时,文本没有突出显示。 –

+0

好吧,我有Delphi XE7,我会尽力重现并回复给你。 – Dsm

+0

我已经按照您在XE7中的建议进行了构建和测试,并且可以在行为中找到任何区别。所以别的东西一定是不一样的。你可以发布你的完整代码,包括你为TEdit属性和TabOrder属性设置的任何东西,我会再看一遍。还有您设置的任何样式。 – Dsm

相关问题