在带有默认按钮的表单上,TMemo中的换行符问题

8
我在使用FireMonkey编写的应用程序中有一个表单。在这个模态表单中,有一个默认设置为True的OK按钮。还有一个备忘录组件。现在,在备忘录中输入时按下回车键,表单会关闭而不是在备忘录中插入换行符。
我想要实现的是,在备忘录组件中按下Enter(或Shift + Enter或类似的内容)时,插入换行符。在其他组件中,您不能输入换行符,但我仍希望按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;

这个方法可以实现,但是按下回车键和换行出现之间有一个小小的烦人延迟。另外我希望有一个更好的解决方案,不要使用hacky的方法。

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


1
在更改Memo内容之前尝试使用Memo.Lines.BeginUpdate;,并在更改完成后使用Memo.Lines.EndUpdate; - Abelisto
3
Emba错过了实现TMemo的WantReturns和WantTabs属性: o( 我将使用一个OnIdle事件在窗体上检查是否有焦点的TMemo来设置默认属性。但是Emba也没有FMX的TApplicationEvent: o( 只有TActionList具有OnUpdate事件,如果至少定义了一个操作并分配给控件,则在闲置时触发。 - Sir Rufo
1
在您的默认按钮的OnClick事件中,测试备忘录是否具有焦点,如果是这种情况,则将ModalResult设置为mrNone - LU RD
@LURD 这个问题是由于 TButton.Default := True 导致的,因此按下 RETURN 对 TMemo 没有影响。如果设置了 TButton.ModalResult,则不需要 OnClick 事件。 - Sir Rufo
2
那一定是FMX的一个bug。当备忘录获得焦点时,它应该消耗ENTER键的按下。 - David Heffernan
显示剩余3条评论
1个回答

2
在您的备忘录的OnEnter中将btnOk.Default设置为False,并在备忘录的OnExit中将其设置回True。请注意保留HTML标签。

这并不总是那么容易。我有一些表单,其中备忘录位于嵌入到带有“确定”按钮的表单中的另一个表单上(例如https://dev59.com/G1_Va4cB1Zd3GeqPW8zE#9048640)。因此,有时备忘录无法知道是否存在按钮。 - Avo Muromägi
1
在这种情况下,您可以创建TMemo的后代,该后代会搜索其父控件中具有设置为TrueDefault按钮,并在CMEnter()方法中将其设置为False,并在CMExit()中将其恢复为True - iMan Biglari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接