Keyboard layout changes to default when exiting dbgrid

چند روز پيش يکي از دوستان با من تماس گرفت و سوالي از من کرد.
سوال ايشون اين بود: يک برنامه را مي خواهيم با دلفي 2010 کامپايل کنيم. اين برنامه شامل يک DBGrid و يک کنترل ديگه مثل Edit هستش. حال اگر در زمان اجرا، Layout کيبورد رو عوض کنيم، مثلا به فارسي تغيير بديم و از DBGrid خارج بشيم، Layout کيبورد، هنگام خارج شدن به حالت اولش برمي گرده. حالا چطور ميشه جلوي اين کار رو گرفت.
حالا خود من به اين مشکل برخوردم و به روش زير حلش کردم:
اول به "source\Win32\db" در مسير نصب دلفي بريد، به عنوان مثال
C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\source\Win32\db
فايل DBGrids.pas رو پيدا کنيد و به مسير ديگري کپي کنيد.
در فايلي که کپي کرديد، دنبال پروسيجر "TCustomDBGrid.WMKillFocus" بگرديد. که به صورت زير نوشته شده
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;
حالا پروسيجر رو به شکل زير تغيير بديد

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

حالا بايد اين فايل رو کامپايل کنيد. براي اين کار اين فايل رو در پوشه پروژتون قرار بديد و کل برنامه را Build کنيد.
شاد باشيد.

جستجو