ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

lazarus在linux使用含mask的控件如果mask中包含/或:时在form设计阶段会出现乱码的情况。

2022-06-04 15:01:25  阅读:167  来源: 互联网

标签:DefaultFormatSettings 控件 mask 乱码 lazarus Result Position


lazarus在linux(树莓派、银河麒麟、Ubuntu 20.04.4 LTS、LMDE 5 Elsie等)使用含mask的控件如果mask中包含/或:时在form设计阶段会出现乱码,但编译后运行显示正常。这个Bug还会造成form控件保存后再打开时中文全部变为乱码的严重问题。

  运行时:

由于是设计时的Bug,我不会对IDE debug,不过发现是lcl/MaskEdit.pp的function TCustomMaskEdit.ClearChar(Position : Integer) : TUtf8Char;
lazarus运行时DefaultFormatSettings.DateSeparator和DefaultFormatSettings.TimeSeparator像没设为初始值,能力有限,暂时直接赋值的方式来解决这Bug.

function TCustomMaskEdit.ClearChar(Position : Integer) : TUtf8Char;
var s,s1:TUtf8Char;
begin
  //For Delphi compatibilty, only literals remain, all others will be blanked
   case GetMask(Position).MaskType Of
    {Char_Space               : Result := #32; //FSpaceChar?; //not Delphi compatible, see notes above}
    Char_HourSeparator        : Result := ':';//DefaultFormatSettings.TimeSeparator;
    Char_DateSeparator        : Result := '/';//DefaultFormatSettings.DateSeparator;
    Char_IsLiteral            : Result := FMask[Position].Literal; //No need to use GetMask, FMask[Position] already has been validated
    otherwise
      Result := FSpaceChar;
  end;
end;

还有另一种方法,就在lazarus增加初始值(打开/ide/lazarus.pp,定位88行,在begin下面增加红字4行 )

{$I revision.inc}
{$R lazarus.res}
{$R ../images/laz_images.res}

begin
  Max_Frame_Dump:=32; // the default 8 is not enough
  {$ifdef linux}
  DefaultFormatSettings.DateSeparator:='-';//2022.6.1 LBZ 修复mask字符串包含/:时乱码的Bug
  DefaultFormatSettings.TimeSeparator:=':';//2022.6.1 LBZ 修复mask字符串包含/:时乱码的Bug
  {$endif}

第3种终极方法:
经多日debug,最终发现问题的根源是 fpc的fpcsrc/packages/rtl-extra/src/unix/clocale.pp引起的,按以下方法修改就可以返回正确的分隔字符(将修改后的clocale.pp拷贝到lazarus/ide文件夹),重新编译就可以。

  function FindSeparator(const s: string; Def: char): utf8char;
  var
    i: integer;
    ss:string;
  begin
    FindSeparator := Def;
    i := Pos('%', s);
    if i=0 then
      Exit;
    inc(i);
    SkipModifiers(s, i);
    inc(i);
    if i<=Length(s) then
    //  FindSeparator:=s[i];
      ss:=UTF8Copy(s,i,1);
    if (ss='年') or (ss='月') or (ss='日') then
      FindSeparator := Def
    else
      if (ss='时') or (ss='分') or (ss='秒') then
        FindSeparator := Def
    else
      FindSeparator:=s[i];
  end;

然后重新编译lazarus,设计时显示就正常了,推荐使用第3种方法。


 

标签:DefaultFormatSettings,控件,mask,乱码,lazarus,Result,Position
来源: https://www.cnblogs.com/qiufeng2014/p/16329567.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有