【问题标题】:Line breaks in TMemo on a form with Default button带有默认按钮的表单上的 TMemo 中的换行符
【发布时间】:2013-03-05 02:22:52
【问题描述】:

我在使用 FireMonkey 编写的应用程序中有一个表单。在该(模态)表单上有一个确定按钮,我已将其默认属性设置为 True。还有一个备忘录组件。现在,如果在输入备忘录时按回车键,则表单将关闭,而不是在备忘录中插入换行符。

我想要完成的是,当在备忘录组件中按下 enter (或 shift+enter 或类似的 smth )时,输入换行符。在无法键入换行符的其他组件中,我仍然希望按 Enter 键关闭表单。到目前为止,我发现的最好的方法是将以下代码添加到表单 OnCloseQuery 操作中:

if (Focused.GetObject.ClassName = 'TMemo') and (ModalResult = mrOk) then
begin
  CanClose := False;
  Memo := TMemo(Focused.GetObject);
  Memo.InsertAfter(Memo.CaretPosition, sLineBreak, [TInsertOption.ioMoveCaret,
    TInsertOption.ioCanUndo]);
end
else
  CanClose := True;

这可行,但现在在按 Enter 后和出现换行符之前会有一点恼人的延迟。我也想要解决方案,那样会不那么老套。

我还应该指出,我也有包含 OK 按钮的表单,但不包含备忘录组件,但是备忘录将在运行时通过更改其父属性移动到该表单。

【问题讨论】:

  • 在更改备忘录内容之前尝试Memo.Lines.BeginUpdate;,之后尝试Memo.Lines.EndUpdate;
  • Emba 错过了实现 TMemo WantReturns,WantTabs 属性 :o( 我会在表单上使用 OnIdle 事件来检查是否有焦点 TMemo 来设置 Default 属性。但是 Emba 也没有 TApplicationEvent 用于FMX :o( 只有 TActionList 有 OnUpdate 事件,如果至少定义了一个动作并将其分配给控件,则该事件会在空闲时触发
  • 在您的默认按钮OnClick 事件中,测试备忘录是否具有焦点,如果是,则将ModalResult 设置为mrNone。
  • @LURD 问题是由 TButton.Default := True 引起的,所以按 RETURN 对 TMemo 没有影响。如果设置了 TButton.ModalResult,则不需要 OnClick 事件
  • 这一定是一个 FMX 错误。当备忘录有焦点时,它应该消耗 ENTER 键。

标签: delphi firemonkey-fm2


【解决方案1】:

在备忘录的OnEnter 中将btnOk.Default 设置为False,然后在备忘录的OnExit 中设置回True

【讨论】:

  • 这并不总是那么容易。我有一些表单,其中备忘录位于另一个表单上,该表单使用“确定”按钮嵌入到表单中(如stackoverflow.com/a/9048640/721309)。因此,有时备忘录无法知道是否有按钮。
  • 在这种情况下,您可以创建TMemo 的后代,它通过其父控件搜索将Default 设置为True 的按钮,并将其设置为@ 中的False 987654331@方法,然后在CMExit()中返回True
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 2019-09-26
  • 2014-01-07
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多