为什么,每次单击dbgrid后,输入法就会变为英文输入法,而不是中文了?

解决方案 »

  1.   

    设置DBGRID的IMENAME = 某种中文输入法 了吗?
      

  2.   

    静态设置:
      在设计时,选择DBGrid的IMENAME属性动态设置:
    在DBGRIDE的ENTER事件中加入下列代码
    1、先获取当前屏幕上的输入法
    2、设置DBGRID.IMENAME = 当前屏幕上的输入法具体代码如下:function GetCurrentIME: TImeName;
    var
      IMEHandle: THandle;
      Idx: Integer;
    begin
      Result := '';
      ImeHandle := GetKeyBoardLayOut(0);
      for Idx := 0 to Pred(Screen.Imes.Count) do
        if HKL(Screen.Imes.Objects[Idx]) = ImeHandle then
          Result := Screen.Imes[Idx];
    end;procedure TForm1.DBGridEnter(Sender: TObject);
    begin
      DBGrid.ImeName := GetCurrentIME;
    end;
      

  3.   

    我用了一下,好象没有发挥作用,是不是因为我的Dbgrid是只读不允许编辑的原因呢?
      

  4.   

    主要是对DBgrid不起作用,对于TEdit还是可以的,为什么呢?
      

  5.   

    我测试了你说的情况,将DBGRID.READONLY := TRUE. 没有问题的,一直保持目前系统的输入法,不会消失的。
      

  6.   

    不然的话,你重新做一个新的测试界面,上面添加一个DBGRID和其他一些编辑控件,再看看。我这里有很多输入法,系统切换到任意一种,进入DBGRID时都会保持的。一定要把代码加在DBGRID的ENTER事件中。
      

  7.   

    是的,进入dbgrid的时候界面上的输入法会保持,但是当你把光标定位到另一个文本框Edit1时,输入法就消失了,变为英文输入法了,为什么?
      

  8.   

    我不知道你的DELPHI版本是多少,我原来用DELPHI5的时候,DBGrid是有一个输入法的BUG的,在DBGrid单元内,现在因为不用这个控件了,所以不知道DELPHI7有没有修正。
    好像是在什么KILL事件内的,具体的我忘记了,你只有自己找一下了。
      

  9.   

    我现在用的是Delphi6,谁用过Delphi7,有没有输入法的类似问题?
      

  10.   

    是的,您说的很正确,需要这样修改(要谢谢你了)procedure TForm1.OnEnter(Sender: TObject);
    begin
      if Sender is TEdit then
      begin
        TEdit(Sender).ImeName := Screen.DefaultIme;
        Exit;
      end;
      if Sender is TMemo then
      begin
        TMemo(Sender).ImeName := Screen.DefaultIme;
        Exit;
      end;
      if Sender is TDBGrid then
      begin
        TDBGrid(Sender).ImeName := Screen.DefaultIme;
        Exit;
      end;
      ......根据你的需要照上面代码加入更多的控件设置
    end;procedure TForm1.FormCreate(Sender: TObject);
    var
      Idx: Integer;
    begin
      for Idx := 0 to Pred(ComponentCount) do
      begin
        if Components[Idx] is TEdit then
          TEdit(Components[Idx]).OnEnter:= OnEnterExit;
        if Sender is TMemo then
          TDBGrid(Components[Idx]).OnEnter:= OnEnterExit;
        if Sender is TDBGrid then
          TDBGrid(Components[Idx]).OnEnter:= OnEnterExit;
        ......根据你的需要照上面代码加入更多的控件设置
      end;
    end;对于dbgrid的BUG要特别修改
    你打开DBGrid单元
    procedure TCustomDBGrid.WMKillFocus(var Message: TMessage);
    begin
      //if not SysLocale.FarEast then inherited 修改之前
      if SysLocale.FarEast then inherited 修改之后
      else
      begin
        ImeName := Screen.DefaultIme;
        ImeMode := imDontCare;
        inherited;
        if not ((InplaceEditor <> nil) and
          (HWND(Message.WParam) = InplaceEditor.Handle)) then
          ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
      end;
    end;重新编译DBGRID单元--》
    生成新的DBGRID.dcu--》
    复制到--》C:\Program Files\Borland\Delphi7\Lib 和
              C:\Program Files\Borland\Delphi7\Lib\Debug
    覆盖原来的。重新建一个测试界面。应该能达到你的要求了。 
    end;
      

  11.   

    对不起,上面有几句OnEnterExit要改为OnEnter
      

  12.   

    sanmaotuo(老冯)说得不错,但只需要改DBGrid单元就行了,不需要在新生成的form内做特别设置,至少我原来就是这样的。
      

  13.   

    我遇到同样的问题,请教下怎么修改DBGrid单元,我没找到这个单元,因该如何打开呢?只找到DCU