输入键是不是在子表单上做了什么,想法?

时间:2011-04-18 18:46:18

标签: delphi

我使用以下命令调用子窗体:

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

谢谢大家的支持。

3 个答案:

答案 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可能不是这种情况。但是,如果TRichEditTRichEdit,则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

希望我们能帮到你。