設置整個 程序的輸入法,請各位大俠幫幫偶,散分了。

luntanwujianhua 2009-06-30 03:01:47
我現在在一個form1的Combobox上加了運行此程序電腦安裝的輸入法。
我希望我整個系統的輸入法,是我在form1的ComboBox選擇的輸入法。
注:是這個系統的輸入法,不是僅僅form1上的輸入法。
怎樣實現呢??
幫忙~~
...全文
33 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yktd26 2009-06-30
  • 打赏
  • 举报
回复

function CheckIfKeyboardInstalled(aId_Langage:integer):boolean;
var Id_KbLayout,Hkl:integer;
begin
if GetOSVersion<>'NT4.0' then begin
Result:=false;
Id_KbLayout:=(SORT_DEFAULT shl 16) or aId_Langage;
Hkl:=LoadKeyboardLayout(PChar(IntToHex(Id_KbLayout,8)),KLF_ACTIVATE);
if Hkl>0 then begin
Result:=true;
UnloadKeyboardLayout(Hkl);
end;
end
else Result:=true;

end;
弘石 2009-06-30
  • 打赏
  • 举报
回复
我猜测你的意思是在程序中子窗口的输入法初始为父窗口的输入法,在任意一个窗口中改变输入法,全体窗口的输入法都变
这样的话,比较麻烦,每个窗口都要在事件里进行处理,我想到的是在创建子窗口时设置子窗口的输入法为父窗口的输入法
在释放子窗口时,设置父窗口的输入法为子窗口的输入法
jing12 2009-06-30
  • 打赏
  • 举报
回复
配置文件就是设一个ini文件,程序起动时从里面读取基本参数设置。

你应该有公用单元吧,就是放公用函数的单元,如果没有放在数据模块里也行,设一个公用变量,
gImeName: string;
在基类创建代码里加上:
if sImeName <> '' then
begin
for i := 0 to self.ComponentCount -1 do begin
if getPropInfo(self.Components[i],'imeName') <> nil then begin
SetPropValue(self.Components[i],'imeName',sImeName );
end;

在设置输入法的后面再加上一句:
procedure TForm1.Button1Click(Sender: TObject);
var
i ,j: integer;
vForm : TForm;
begin
for j := 0 to Screen.FormCount -1 do
begin
vForm := Screen.Forms[j];
for i := 0 to vForm.ComponentCount -1 do begin
if getPropInfo(vForm.Components[i],'imeName') <> nil then begin
SetPropValue(vForm.Components[i],'imeName',cbbUserLangauge.Text);
end;
end;
end;
upublic.gImeName := cbbUserLangauge.Text;

end;

下班啦!!
starluck 2009-06-30
  • 打赏
  • 举报
回复
rocedure TForm1.Button1Click(Sender: TObject);
var
i ,j: integer;
vForm : TForm;
begin
for j := 0 to Screen.FormCount -1 do
begin
vForm := Screen.Forms[j];
for i := 0 to vForm.ComponentCount -1 do begin
if getPropInfo(vForm.Components[i],'imeName') <> nil then begin
SetPropValue(vForm.Components[i],'imeName',cbbUserLangauge.Text);
end;
end;
end;

end;



這個只針對已經建立的窗體,你已經有基類了。為什麼不在窗體建立的時候從一個配置文件中讀取出來這個。

如果一個已經存在的窗體,肯定是可以的,如果你這個代碼還是不懂,就好好學下DELPHI吧。
luntanwujianhua 2009-06-30
  • 打赏
  • 举报
回复
不知道怎麼實現你所說的方法,我是初學著。
jing12 2009-06-30
  • 打赏
  • 举报
回复
跟父窗口、子窗口没关,方法就在上面,或许别人有更好的方法。
luntanwujianhua 2009-06-30
  • 打赏
  • 举报
回复
我的整個工程用的是 一個父窗口,多個子窗口,通過父窗口下的菜單能打開子窗口。
顯示的時候,子窗口嵌入在父窗口裏面。而所有的子窗口又是繼承一個預先設定的窗口。
程序form是這樣設計的。
jing12 2009-06-30
  • 打赏
  • 举报
回复
starluck的方法可以设置整个程序已创建窗体的输入法,
对于设置之后创建的窗体是无法同时变更的,
楼主的所谓没有变的,可能是手动创建的窗体。
如果楼主希望一下可以设置整个程序所有窗体的输入法,
要么让所有窗体都自动创建,
要么在一个公用单元设置一个变量,在基类窗体创建时如此变量有值,则修改窗体输入法,
在设置输入法时在上述角本的基础上再加上设置该变量。
starluck,你说呢!
luntanwujianhua 2009-06-30
  • 打赏
  • 举报
回复
for i := 0 to vForm.ComponentCount -1 do begin
if getPropInfo(vForm.Components[i],'imeName') <> nil then begin
SetPropValue(vForm.Components[i],'imeName',cbbUserLangauge.Text);
end;
end;
事實是不能的嘛。上面這段代碼。我看這個只循環了3次。雖然vForm.ComponentCount=32.
但進入到 SetPropValue(vForm.Components[i],'imeName',cbbUserLangauge.Text)裏面的
這一句只執行了3次,而這3次就是我form1上有的3個可視控件。
不信你在多建一個form2.在form2上放幾個Edit。
在form1裏面設置輸入法,你看form2裏面的edit是不是你設置的輸入法?
starluck 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 luntanwujianhua 的回复:]
if getPropInfo(vForm.Components[i],'imeName') <> nil then begin
SetPropValue(vForm.Components[i],'imeName',cbbUserLangauge.Text);
end;
就上面這段代碼
就能讓整個程序那麼多的form都變成我設置的輸入法啊??
[/Quote]

這個程序唯一的一個問題就是存在的窗體才行,如果還沒有創建的是不成立的,我想除了這個就沒有別的可能性了。

如果是這樣的話,你可以將設置好的輸入法用INI保存起來,每個窗體在CREATE後都自動設置下,這個窗體基類裏面做是很簡單的事情了。
starluck 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 luntanwujianhua 的回复:]
if getPropInfo(vForm.Components[i],'imeName') <> nil then begin
SetPropValue(vForm.Components[i],'imeName',cbbUserLangauge.Text);
end;
就上面這段代碼
就能讓整個程序那麼多的form都變成我設置的輸入法啊??
[/Quote]


為什麼不能呢??
luntanwujianhua 2009-06-30
  • 打赏
  • 举报
回复
if getPropInfo(vForm.Components[i],'imeName') <> nil then begin
SetPropValue(vForm.Components[i],'imeName',cbbUserLangauge.Text);
end;
就上面這段代碼
就能讓整個程序那麼多的form都變成我設置的輸入法啊??
starluck 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 luntanwujianhua 的回复:]
沒用啊,老大。整個程序的form不是我設置的那個輸入法。
[/Quote]

FORM是沒輸入法的。只有有IME這個屬性的才可以設置的。我不知道你的具體意思了。
starluck 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 luntanwujianhua 的回复:]
沒用啊,老大。整個程序的form不是我設置的那個輸入法。
[/Quote]

如果不是,只能求上帝了,因為我這個我這邊的確是通過的。
而且這段代碼我的確沒發現哪裏有什麼不對的。
luntanwujianhua 2009-06-30
  • 打赏
  • 举报
回复
沒用啊,老大。整個程序的form不是我設置的那個輸入法。
starluck 2009-06-30
  • 打赏
  • 举报
回复



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,TypInfo;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
cbbUserLangauge: TComboBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i ,j: integer;
vForm : TForm;
begin
for j := 0 to Screen.FormCount -1 do
begin
vForm := Screen.Forms[j];
for i := 0 to vForm.ComponentCount -1 do begin
if getPropInfo(vForm.Components[i],'imeName') <> nil then begin
SetPropValue(vForm.Components[i],'imeName',cbbUserLangauge.Text);
end;
end;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
j: integer;
begin
with cbbUserLangauge do
begin
Clear;
for j := 0 to screen.imes.count - 1 do
begin
Items.Add(screen.Imes.strings[j]);
end;
end;
end;

end.





ALL Source , It's ok
luntanwujianhua 2009-06-30
  • 打赏
  • 举报
回复
這個是獲得 輸入法的方法
var
j: integer;
begin
with cbbUserLangauge do
begin
Clear;
for j := 0 to screen.imes.count - 1 do
begin
Items.Add(screen.Imes.strings[j]);
end;
end;
end;
luntanwujianhua 2009-06-30
  • 打赏
  • 举报
回复
var
i ,j: integer;
vForm : TForm;
begin
for j := 0 to Screen.FormCount -1 do
begin
vForm := Screen.Forms[j];
for i := 0 to vForm.ComponentCount -1 do begin
if getPropInfo(vForm.Components[i],'ImeName') <> nil then
begin
SetPropValue(vForm.Components[i],'ImeName',cbbUserLangauge.Text);
end;
end;
end;
end;
starluck 2009-06-30
  • 打赏
  • 举报
回复
把你代碼貼出來
luntanwujianhua 2009-06-30
  • 打赏
  • 举报
回复
不知道怎麼回事 這句
if getPropInfo(vForm.Components[i],'ImeName') <> nil
是true啊?
設置不到啊
加载更多回复(7)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧