TEdit和焦点选择的工作方式因Show / showmodal而异

时间:2015-05-29 13:22:48

标签: delphi firemonkey delphi-xe7

TEdits之间切换焦点时,选择会根据您显示表单的方式而改变。 当您使用Form.show显示它并在两个TEdits之间切换时,会选择文本。 当您使用Form.Showmodal显示表单并在其间切换时,光标位于新聚焦的TEdit

的末尾

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

为什么功能上存在差异?我在哪里可以改变它。

我发现代码负责了:

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;

1 个答案:

答案 0 :(得分: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