【发布时间】:2011-09-27 05:50:20
【问题描述】:
当在 DLL 中声明和实例化 Delphi 表单并且 DLL 由宿主应用程序加载时,箭头键和 Tab 键不会越过宿主/DLL 边界。这意味着可能在表单上使用的 TEdit 框和 TMemo 控件将不会响应这些击键。有没有办法确保这些击键从主应用程序表单传递到 dll 中的表单?请注意,可能有多个 DLL,每个 DLL 都包含一个表单。 KeyPreview 没有区别。
【问题讨论】:
标签: delphi
当在 DLL 中声明和实例化 Delphi 表单并且 DLL 由宿主应用程序加载时,箭头键和 Tab 键不会越过宿主/DLL 边界。这意味着可能在表单上使用的 TEdit 框和 TMemo 控件将不会响应这些击键。有没有办法确保这些击键从主应用程序表单传递到 dll 中的表单?请注意,可能有多个 DLL,每个 DLL 都包含一个表单。 KeyPreview 没有区别。
【问题讨论】:
标签: delphi
看看这个问题和你之前的问题,我想说你的基本问题是你没有使用运行时包。
如果您使用的是运行时包,那么您将拥有一个 VCL 实例,并且模块边界无关紧要。
如果没有运行时包,您将拥有单独的 VCL 实例。要使 VCL 表单导航正常工作,您需要将每个控件识别为 VCL 控件。当您有多个 VCL 实例时,这是不可能的。
【讨论】:
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;
【讨论】: