我使用以下命令调用子窗体:
var frm: TForm2;
begin
try
frm := TForm2.Create(Application);
frm.ShowModal;
finally
frm.Free;
end;
end;
在该子表单中有一个Rich Edit,但是,当我按下[enter]时它会作为Tab键并切换焦点(对于我在此特定应用程序中创建的所有子表单都是如此,与RichEdit本身无关)。
备注:我在主要和子表单上尝试了RichEdit.WantReturns true / false,RichEdit.WanTabs为true / false,KeyPreview为true / false。
我的想法:主表单根本没有任何onkey事件,祖先表单确实与[enter]无关。由于代码是巨大的,可能有一个地方指定输入作为选项卡,但是这很难找到。所以我只想知道是否有办法使输入行为像输入它更容易。
有什么想法吗?
谢谢!
修改
我发现问题深埋在远程.pas文件中。
if Msg.wParam = 13 then
begin
//bunch of code
Msg.wParam := 9; //Ta-da
谢谢大家的支持。
答案 0 :(得分:3)
首先,你没有遵循成语的任何特殊原因
frm := TForm2.Create(Self);
try
frm.ShowModal;
finally
frm.Free;
end;
?此标准代码更好,因为1)如果未成功创建Free
,则不会调用frm
,以及(2)操作系统(即Windows)知道要关注的形式({{ 1}})关闭对话框时。
其次,Self
上有Default := true
的按钮吗?如果是这样,当您按Enter键时,此按钮将被“单击”(除非具有键盘焦点的控件执行某些特殊操作 - TForm2
不是这种情况,但TEdit
可能不是这种情况。但是,如果TRichEdit
有TRichEdit
,则Enter键应该只在Rich Edit控件中创建一个新行。这是正常行为。
如果在WantReturns := true
的实例中按Enter键选择对话框中的下一个控件(关于制表顺序属性),那么您可能在TForm2
中做了一些特殊操作。您是否覆盖了TForm2
的{{1}}或WndProc
程序?如果是这样,请看看那里!或者CreateParams
中有什么奇怪的东西吗?
<强>更新强>
既然你说TForm2
中没有任何有趣的东西,我的通灵能力告诉我你已经在你的主要形式上添加了TForm2.OnCreate
,而你在回答时做了一些奇怪的事情到TForm2
事件。
答案 1 :(得分:2)
根据这些信息无法说出问题所在。
我通过将Debug DCU设置为True来调试它,在TWinControl.SelectNext
上设置一个断点并尝试解决当按下ENTER时它落在那里的原因。
答案 2 :(得分:1)
错误(可能)不在Form2中,因为Form2在一个干净的项目中正常工作。
留下 mainform 和项目文件(带.dpr的文件)。
在你的问题中发布dpr文件(program1.dpr)的代码,我们将看看它。
接下来是主体。显然要粘贴很多代码,所以让我们在代码中包含所有对“Enter”或“Return”的引用。
使用Delphi搜索mainform
在Delphi中打开mainform(通常是Form1),
右键单击表单,然后从菜单中选择View as text
有时Delphi会拒绝这个(当使用框架等时),如果是这样的话,请跳到使用下面的wordpad 搜索mainform部分。
使用Wordpad搜索mainform
在 wordpad 中打开mainform (通常名为unit1.dfm)的.DFM文件。
在表单中查找“输入”
搜索单词“Enter”和“Return”,然后将您找到的行复制并粘贴到您的问题中,以及上面第一行包含单词object
的行。
在mainform.pas (unit1.pas) 中查找“enter” 使用VK_Enter和VK_Return以及#13和#10搜索所有行,然后将它们粘贴到您的问题中以及一些上下文代码中。
其他可能性
如果你正在使用TMS组件(TAdvEdit等),其中很多都有一个名为ReturnIsTab
的属性,也要搜索它,并将它们全部设置为false
。
希望我们能帮到你。