Delphi TEdit和焦点选择根据Show/showmodal的不同而不同

Delphi TEdit和焦点选择根据Show/showmodal的不同而不同,delphi,firemonkey,delphi-xe7,Delphi,Firemonkey,Delphi Xe7,在TEDIT之间切换焦点时,选择会根据您显示表单的方式而变化。 使用Form.show显示文本,并在两个TEDIT之间切换时,文本被选中。 当您使用form.showmodel显示表单并在两者之间切换时,光标位于新聚焦的TEdit的末尾 复制: 创建一个包含2个TEDIT的新表单,在这两个表单中键入一些文本。然后在两个TEDIT之间切换,整个文本被选中,但是当我用模态显示表单时,插入符号位于文本后面 为什么功能上存在差异?我在哪里可以换呢 我发现代码有责任: procedure TStyledE

在TEDIT之间切换焦点时,选择会根据您显示表单的方式而变化。 使用Form.show显示文本,并在两个TEDIT之间切换时,文本被选中。 当您使用form.showmodel显示表单并在两者之间切换时,光标位于新聚焦的TEdit的末尾

复制: 创建一个包含2个TEDIT的新表单,在这两个表单中键入一些文本。然后在两个TEDIT之间切换,整个文本被选中,但是当我用模态显示表单时,插入符号位于文本后面

为什么功能上存在差异?我在哪里可以换呢

我发现代码有责任:

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;

DoEnter是一个受保护的方法,因此,如果愿意,您可以使用自己的方法进行重写

您可以通过创建具有不同类型名称的自己的子类,或者使用此链接中所述的所谓拦截器类,以传统方式完成此操作:

我认为您需要像这样扩展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

我无法复制你们描述的问题。行为完全相同。也许这在问题中还不清楚,但运行的代码来自TStyledEdit,当你关注一个TEdit时,它会触发。我不能截取TSyledEdit的代码,因为我的控件是一个TEdit类,当我为TEdit创建一个截取类并执行“SelectAll”时,文本不会突出显示。好的,我有Delphi XE7,我将尝试复制并返回给您。我已经按照您在XE7中的建议进行了构建和测试,在行为上没有发现任何差异。所以其他的东西一定是不同的。你能发布你的完整代码吗,包括你为TEdit属性和TabOrder属性设置的任何内容,我会再看一遍。还有您设置的任何样式。