[原创]lazarus汉字输入相对完美解决方案

软件和网站开发以及相关技术探讨
回复
头像
ljj_jjl2008
论坛版主
帖子: 14255
注册时间: 2007-09-16 8:29

[原创]lazarus汉字输入相对完美解决方案

#1

帖子 ljj_jjl2008 » 2009-08-03 14:02

(请看4楼相对完美的方案)

lazarus汉字输入临时解决方案
现在lazarus(类似delphi的pascal ide)不支持汉字输入,特别是Source Editor窗口,根本打不开输入法。
现在有一个临时解决方案:
1,用lazarus打开“SourceEditor.pp”(在/usr/share/lazarus/ide下,也可能因为安装版本不同有所差异)。
2, 在界面下方放下一个memo,顶端放下两个button(自己取名和加caption),适当安排界面(比如把memo1.align设置成 albottom等,和调整按钮位置,还可以放下一个splitter,align也设置成albottom等,用于调整memo的高度)
3,分别双击两个button,分别输入以下语句:

代码: 全选

  SourceNotebook.Memo1.Lines.Clear;
   SourceNotebook.Memo1.Lines.Assign(SourceNotebook.GetActiveEditor.Lines);

代码: 全选

 if application.MessageBox('将要覆盖源代码!按“确定”继续。','请确定',mb_okcancel)=idok then
  begin
    SourceNotebook.GetActiveEditor.Lines.Clear;    
   SourceNotebook.GetActiveEditor.Lines.Assign(SourceNotebook.Memo1.Lines);
  end;

还可以再加上一个字体选择对话框,和第三个按钮,加上以下语句:

代码: 全选

  if SourceNotebook.FD.Execute then
       SourceNotebook.Memo1.Font.Assign(SourceNotebook.FD.Font);
作用是调整memo的字体和字号。
4,重新编译lazarus。
这样,SourceEditor窗口多出来两个按钮和一个memo,这个memo里面可以输入汉字。

开发时先不输入汉字,只写指令部分,需要输入汉字的地方先空着。写完指令部分,点击第一个按钮把程序代码从上面全部拷贝到下面,然后补充进汉字部分,再点击第二个按钮,把指令从下面拷贝回上面去,即可。

有个缺陷:因为lazarus整体还不支持输入法,我用的fictx输入法,直接ctrl-空格切换输入状态的话,按下一个字母,输入法里面跳出几个字母来这个问题比较严重,如果用鼠标点输入法切换到汉字输入状态则基本正常。

(今天编程误按了第二个按钮,结果把上面的代码覆盖乱了,所以我改进了一下,加了一个提示。)
附件
2.png
killea
帖子: 17
注册时间: 2008-01-28 18:05

Re: [原创]lazarus汉字输入临时解决方案

#2

帖子 killea » 2009-08-04 16:00

我是来支持你的。我的9。04也装了lazarus。 :em09
头像
ljj_jjl2008
论坛版主
帖子: 14255
注册时间: 2007-09-16 8:29

Re: [原创]lazarus汉字输入临时解决方案

#3

帖子 ljj_jjl2008 » 2009-08-06 8:34

昨天又研究了一个新方案:按钮对应语句写成:

代码: 全选

procedure TSourceNotebook.Button4Click(Sender: TObject);
var ss,ss1,ss2:ansistring;
    i,i1,i2:integer;
begin
  for i:=1 to SourceNotebook.Memo1.Lines.Count do
  begin
    ss:=SourceNotebook.Memo1.Lines[i-1];
    ss1:=ss[1]+ss[2]+ss[3]+ss[4]+ss[5];
    i2:=strtoint(ss1)-1;
    ss2:='';
    for i1:=6 to length(ss) do
       ss2:=ss2+ss[i1];
    SourceNotebook.GetActiveEditor.Lines[i2]:=SourceNotebook.GetActiveEditor.Lines[i2]+ss2
  end;
end;    
实际用时,memo1内写成类似“00001测试”这样的内容,前五位是上面的行号,后面的汉字是内容。可以写多行。
点击按钮以后,汉字会自动添加到源代码指定行的末尾。
头像
ljj_jjl2008
论坛版主
帖子: 14255
注册时间: 2007-09-16 8:29

Re: [原创]lazarus汉字输入临时解决方案

#4

帖子 ljj_jjl2008 » 2009-08-09 10:26

更完美的方案:
1,用lazarus打开“SourceEditor.pp”(在/usr/share/lazarus/ide下,也可能因为安装版本不同有所差异)。
2, 在界面下方放下一个panel(面板,.align设置成 albottom),面板里面放下一个memo,一个button(自己取名和加caption),适当安排界面(比如把memo1.align设置成 alclient等,按钮设置成alright)
3,源码里面ctrl-home,然后ctrl-f(查找),查找“InsertCVSKeyword”,会先找到这么一行:
procedure InsertCVSKeyword(const AKeyWord: string);
在这一行下面加上一行:

代码: 全选

procedure InsertKeyword(const AKeyWord: string);
f3继续找,会找到这么一个procedure:
procedure TSourceEditor.InsertCVSKeyword(const AKeyWord: string);
begin
if ReadOnly then Exit;
FEditor.InsertTextAtCaret('$'+AKeyWord+'$'+LineEnding);
end;
复制他们,在下面粘贴,改成:

代码: 全选

procedure TSourceEditor.InsertKeyword(const AKeyWord: string);
begin
  if ReadOnly then Exit;
  FEditor.InsertTextAtCaret(AKeyWord);
end;
这样,就给TSourceEditor增加了一个叫“InsertKeyword”的过程,作用是可以通过编程语句在光标所在位置添加指定字符串。

4,双击界面上新加的button,输入以下语句:

代码: 全选

procedure TSourceNotebook.Button1Click(Sender: TObject);
var i:integer;
begin
  if SourceNotebook.Memo1.Lines.Count<=1 then
    SourceNotebook.GetActiveSE.InsertKeyword(SourceNotebook.Memo1.Lines[0])
  else
  begin
    for i := 1 to SourceNotebook.Memo1.Lines.Count do
      SourceNotebook.GetActiveSE.InsertKeyword(SourceNotebook.Memo1.Lines[i-1]+LineEnding);
  end;
  SourceNotebook.Memo1.Lines.Clear;
  SourceNotebook.FocusEditor;
end;
这样,需要输入汉字时转到下面输入,然后点一下按钮,就自动添到上面源程序光标所在位置,并且将输入焦点转到上面源程序里面。
终于相对圆满的解决了lazarus中文输入问题。
头像
anick
帖子: 125
注册时间: 2006-06-06 11:14
来自: 四川成都
联系:

Re: [原创]lazarus汉字输入相对完美解决方案

#5

帖子 anick » 2009-08-15 11:58

真的不错,顶一下楼主

以前从来没想到过增加代码的方式来修改编辑框(忘了开源的优势),这使我想到了编辑框编码的问题

有空了我也看看lazarus编辑框的代码,看能不能有所改变
回复