lazarus在实际使用中还存在一些问题,特别是在linux下lazarus代码编辑时不能输入中文/combobox/lazarus Object Inspector下拉时不显示文字/日期分隔符乱码(还会引起pas文件中的中文乱码等严重的问题),如果不对fpc/lazarus进行修复,会影响开发效率和使用,经以下修改后的lazarus已能比较顺利开发应用.
这个链接已包含以下修复内容,用解压后的文件替换原文件,重新编译fpc、lazarus就可以:https://pan.baidu.com/s/1oeozSMa3-WLZ_pM5haxc1w?pwd=rcfu
提取码:rcfu
一.修复lazarus中文输入
修改方法很简单,这4个文件开始位置添加:
lazarus/components/synedit/lazsyngtk2imm.pas
lazarus/lcl/interfaces/gtk2/gtk2globals.pp
lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
lazarus/lcl/interfaces/gtk2/gtk2proc.inc
{$ifdef linux} {$define WITH_GTK2_IM} {$endif}
lazarus/components/synedit/synedit.inc添加
{$ifdef linux} {$define Gtk2IME} {$endif}
二.FPC/lazrus支持中文变量/过程和函数
fpcsrc/compiler/scanner.pas
修改scanner.pas以下4个位置:
1、第4054行:
将 'A'..'Z': 修改为: 'A'..'Z',#$80..#255 :
2、第4729行:
将
if c in ['A'..'Z','a'..'z','_'] then
改为:
if (c in ['A'..'Z','a'..'z','_',#$80..#255]) then
3、第4822行:
将
if not (c in ['_','A'..'Z','a'..'z']) then message2(scan_f_syn_expected,tokeninfo^[_ID].str,c);
改为:
if not ((c in ['_','A'..'Z','a'..'z',#$80..#255])) then message2(scan_f_syn_expected,tokeninfo^[_ID].str,c);
4、第5456行:
将
'a'..'z' :
改为:
'a'..'z' , #$80..#255:
修改后重新编译fpcsrc
修改lazarus\components\codetools\keywordfunclists.pas
将第852行:
IsIdentChar[c]:=c in ['a'..'z','A'..'Z','_','0'..'9'];
改为:
IsIdentChar[c]:=c in ['a'..'z','A'..'Z','_','0'..'9',#$80..#255];
重新编译lazarus
三.lazarus/lcl/interfaces/gtk2:
1.lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc:
文件开始添加以下代码:
{$ifdef linux} {$define WITH_GTK2_IM} {$endif}
将第1386~-1393行注释
{ //2022.07.11 LBZ 防止打开frx报表设计器出错 else if ALogLevel and G_LOG_LEVEL_CRITICAL <> 0 then begin Level := 'CRITICAL'; Ex := EInterfaceCritical; end }
2.lazarus/lcl/interfaces/gtk2/gtk2winapi.inc:
在第9601行添加:
gtk_widget_realize(PGtkWidget(GtkWindow));
在第9610行添加:
if Aflags and GDK_WINDOW_STATE_MAXIMIZED = 0 then//2022.10.18 LBZ
3.lazarus/lcl/interfaces/gtk2/gtk2wsforms.pp
在第409添加以下代码
case ACustomForm.WindowState of wsMaximized: gtk_window_maximize(PGtkWindow(P)); wsMinimized: gtk_window_iconify(PGtkWindow(P)); wsFullscreen: gtk_window_fullscreen(PGtkWindow(P)); else end;
4.lazarus/lcl/interfaces/gtk2/gtk2devicecontext.inc
在第736行添加:
Self.BkMode:=ASource.BkMode;//2022.12.05 LBZ
四.lazarus/lcl/include/
1.修复combobox类item列表背景颜色和文字颜色相同的问题
lazarus/lcl/include/customcombobox.inc
第113行加上以下5行:
//2022.05.28 LBZ 修复combobox类item列表背景颜色和文字颜色相同的问题
{$ifdef linux}// LCLgtk2} FCanvas.FillRect(ARect); {$endif} //2022.05.28 LBZ
五.修复linux lazarus Object Inspector下拉列表文字颜色和背景颜色相同导致不显示的问题(2022.12.06 已验证lazarus 2.2.4已修复此Bug,无需按以下方法修复)
修复lazarus在linux(ubuntu、银河麒麟等) Object Inspector下拉文字不显示的问题。
打开lazarus\components\ideintf\objectinspector.pp(3489行开始),按红字的修改后重新编译lazarus就可以。
第3517行添加以下代码:
{$ifdef windows}
ValueComboBox.Canvas.Font.Color := clWindowText;
{$else}
ValueComboBox.Canvas.Font.Color := clHighlightText;//2022.5.24 LBZ 字体颜色与背景颜色相同的Bug
{$endif}
六.lazarus/components
1.汉化打印对话框
lazarus/components/printers/printer4lazstrconst.pas
{ ***************************************************************************** This file is part of the Printer4Lazarus package See the file COPYING.modifiedLGPL.txt, included in this distribution, for details about the license. ***************************************************************************** Abstract: Resourcestrings. } unit Printer4LazStrConst; {$mode objfpc}{$H+} interface resourcestring p4lrsCancel = '取消'; p4lrsPrinterProperties = '打印机属性'; p4lrsOk = '确定'; p4lrsGeneral = '常规'; p4lrsPaperSize = '纸张尺寸'; p4lrsPaperType = '纸张类型'; p4lrsPaperSource = '纸张来源'; p4lrsResolution = '分辨率'; p4lrsOrientation = '方向'; p4lrsPortrait = '纵向'; p4lrsLandscape = '横向'; p4lrsReverseLandscape = '横向反转'; p4lrsReversePortrait = '纵向反转'; p4lrsBanners = '横幅(Banners)'; p4lrsStart = '开始'; p4lrsEnd = '结束'; p4lrsPagesPerSheet = '每页页数'; p4lrsMargins = '边距'; p4lrsAdvanced = '高级'; p4lrsNoDefaultPrinter = '未找到默认打印机.'; p4lrsShortUnitsMm = '(mm)'; p4lrsShortUnitsInches = '(英寸)'; p4lrsButtonMoreArrow = '更多 >>'; p4lrsButtonLessArrow = '<< 较少'; p4lrsJobStateReady = '已准备好'; p4lrsJobStatePrinting = '打印'; p4lrsJobStateStopped = '停止'; p4lrsJobStateAccepting = '(接受作业)'; p4lrsJobStateRejecting = '(拒绝作业)'; p4lrsAllPages = '全部'; p4lrsPageOdd = '奇数'; p4lrsPageEven = '偶数'; p4lrsNotAvailable = '不可用'; p4lrsAbbrevUnitsMm = 'mm'; p4lrsAbbrevUnitsInches = '"'; implementation end.
七.lazarus调整界面
1.lazarus/components/ide/projectwizarddlg.pas
2.lazarus/components/ide/projectinspector.pas