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