怎样在程序中动态的改变输入法?(150分)

  • 主题发起人 主题发起人 belphi
  • 开始时间 开始时间
B

belphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中动态的改变输入法,用了n个Tedit组件
,edit1,edit2,edit3,...editn当edit1获得焦点时,
由用户切换自己习惯的中文输入法输入中文,
当edit2获得焦点时,自动换成英文输入法输入英文,
当edit3获得焦点时,自动切换为该用户前面选择的
中文输入法输入中文,以后凡是需要输入中文的
Tedit都自动切换为该用户前面选择的中文输入法
输入中文(包括edit1再次获得焦点时也是如此)。

如何实现?请各位大侠帮忙!
 
TEdit有一个输入法属性,改一个就可
 
楼上的大侠,我这样试过,可能方法不对,能不能说清楚一些。
 
(转)
procedure TForm1.Edit1Enter(Sender: TObject);
var
myhkl: hkl;
i: integer;
begin
if screen.Imes.Count <> 0 then
begin
i:= screen.Imes.IndexOf('全拼输入法');
if i >= 0 then
begin
myhkl:= hkl(screen.Imes.Objects);
activatekeyboardlayout(myhkl,KLF_ACTIVATE);
end;
end;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
var
myhkl: hkl;
begin
myhkl:= getkeyboardlayout(0);
if ImmIsIME(myhkl) then
immsimulatehotkey(handle,IME_CHOTKEY_IME_NONIME_TOGGLE);
end;
注:两个Tedit的onEnter和OnExit事件共用。
即设置edit2的onenter为edit1的onenter;onexit为edit1的onexit.
 
好像是imemode和imename(记不清了)
 
imemode:=open;
imename:=你的输入法;
就行了,可以创建或打开窗体时指定的.肯定没错.
 
楼上的2位大侠,你们的方法把中文输入法在设计期就定死了,实现不了我说的功能。
如果一个用户用王码五笔 ,另一个用户用全拼,我希望这两个用户所选择的输入法在该用
户录入中文期间,始终是该用户所选择的中文输入法,而不是设计期指定的输入法。
我的要求是
设计期可以不用指定中文输入法,第一次输入中文时,由用户自己切换到自己需要的
中文输入法,以后凡是输入中文的tedit,都调出用户第一次输入中文时的中文输入法。
如果我说的不清楚,还请各位见谅!我再补充。

 
那你在他输入完毕后存储起来就可以了,可以放到inf文件里,在调用出来就可以!
 
//摘录我程序中的一些段落您看看
//列出机器中所有的输入法
procedure TFm_ImeSet.FormCreate(Sender: TObject);
var
i,Loop:Integer;
ListItem: TListItem;
begin
Loop:=Screen.Imes.Count;
for i:=1 to Loop do
begin
ListItem := ListView1.Items.Add;
ListItem.Caption := Screen.Imes.Strings[i-1];
end;
end;
//保存用户设定的输入法
procedure TFm_ImeSet.SpeedButton2Click(Sender: TObject);
var
AppINI:TIniFile;
begin
try
try
AppINI:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'AppSys/login.dll');
AppINI.WriteString('UserIme', 'UserIme', ListView1.Selected.Caption);
Form1.User_IME:= ListView1.Selected.Caption;
except
Application.MessageBox('保存设置时发生了一个错误,您的改动无法保存下来。','保存失败',Mb_Ok+Mb_Iconinformation);
end;
finally
AppINI.Free;
Close;
end;
end;

//调用设置的输入法
Procedure TFm_Cable_Experiment.Set_Ime;
var
i:integer;
begin
for i:=ComponentCount-1 DownTo 0 do
begin
if Components.Tag=2 then
if (Components is TEdit) then
(Components as TEdit).ImeName:=Form1.User_Ime;
if (Components is TCombobox) then
(Components as TCombobox).ImeName:=Form1.User_Ime;
end;
end;
 
来迟了,不过你的确可以通过修改输入法属性来做.
 
多人接受答案了。
 
后退
顶部