delphidelphi-xe2keyboard-layout

Disable automatic changing of keyboard layout in DbGrids.pas in VCL


I use ActivateKeyboardLayout(HKL_NEXT, KLF_ACTIVATE); to load a Persian keyboard layout using Delphi XE2, but sometimes when I click on a TextBox or DbGrid control, the keyboard automatically is changed to English layout.

How can I disable automatic changing of keyboard layout?


Solution

  • We have the same issues. This bug appeared after the upgrade from D2006 to D2010.

    The issue is in file DBGrids.pas:

    procedure TCustomDBGrid.WMKillFocus(var Message: TMessage);
    begin
      ImeName := Screen.DefaultIme;
      ImeMode := imDontCare;
      inherited;
      if not ((InplaceEditor <> nil) and
        (HWND(Message.WParam) = InplaceEditor.Handle)) then
        ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
    end;
    

    I don't have any idea why Borland/Embarcadero added the "if block" after inherited. The change causes switching keyboard layout back to the default. We had to copy DBGrids to our projects and remove the "if block".