将箭头和Tab键传递给DLL中的Delphi表单

时间:2011-09-27 05:50:20

标签: delphi

当在DLL内部声明并实例化Delphi表单并且主机应用程序加载DLL时,箭头和Tab键不会跨主机/ DLL边界传递。这意味着可以在表单上使用的TEdit框和TMemo控件不会响应这些击键。反正是否确保将这些关键笔划从主应用程序表单传递到dll中的表单?请注意,可能有多个DLL,每个DLL都包含一个表单。 KeyPreview没有区别。

2 个答案:

答案 0 :(得分:2)

看看这个问题和你之前的问题,我会说你的基本问题是你没有使用运行时包。

如果您使用的是运行时包,那么您将拥有VCL的单个实例,并且模块边界无关紧要。

如果没有运行时包,则会有单独的VCL实例。要使VCL表单导航正常工作,您需要将每个控件识别为VCL控件。当您有多个VCL实例时,这是不可能的。

答案 1 :(得分:1)

DLL中的表单错过了这种支持,以及对菜单快捷方式(操作)的支持。您可以编写一些代码来模拟此行为。

////////////////////////////////////////////////////////////////
// If you display a form from inside a DLL/COM server, you will miss
// the automatic navigation between the controls with the "TAB" key.
// The "KeyPreview" property of the form has to be set to "True".
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
  bShift: Boolean;
begin
  // Check for tab key and switch focus to next or previous control.
  // Handle this in the KeyPress event, to avoid a messagebeep.
  if (Ord(Key) = VK_TAB) then
  begin
    bShift := Hi(GetKeyState(VK_SHIFT)) <> 0;
    SelectNext(ActiveControl, not(bShift), True);
    Key := #0; // mark as handled
  end;
end;