开发者

Passing Arrow and Tab keys to Delphi Form in a DLL

开发者 https://www.devze.com 2023-04-08 10:20 出处:网络
When a Delphi Form is declared and instantiated inside a DLL and the DLL loaded by the host application, Arrow and Tab keys are not passed across the Host/DLL boundary. 开发者_JAVA技巧This means that

When a Delphi Form is declared and instantiated inside a DLL and the DLL loaded by the host application, Arrow and Tab keys are not passed across the Host/DLL boundary. 开发者_JAVA技巧This means that TEdit boxes and TMemo controls that may be used on the form will not respond to these key strokes. Is there anyway to ensure that these key strokes are passed from the main application form to the form in the dll? Note there may be multiple DLLs, each containing a form. KeyPreview makes no difference.


Looking at this question, and your previous one, I would say that your basic problem is that you are not using runtime packages.

If you were using runtime packages then you would have a single instance of the VCL and module boundaries would not matter.

Without runtime packages you have separate VCL instances. For the VCL form navigation to work correctly you need each control to be recognised as a VCL control. This is not possible when you have multiple VCL instances.


Forms in DLL's miss this support, as well as support of menu shortcuts (actions). You can write some code to simulate this behaviour.

////////////////////////////////////////////////////////////////
// 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;
0

精彩评论

暂无评论...
验证码 换一张
取 消