【发布时间】: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