Linux 在拉斯宾语中使用拉扎勒斯滚动文本

Linux 在拉斯宾语中使用拉扎勒斯滚动文本,linux,raspberry-pi,lazarus,freepascal,Linux,Raspberry Pi,Lazarus,Freepascal,我正在尝试用Raspberry Pi2和raspbian(debian)-linux做一个滚动文本字幕组件。我正在使用FPC 3.0和Lazarus 1.6 我有下一个代码做滚动,所有的工作都很好,除了一个问题 如果我有一个带有重音的文本,比如:“Isto não estácerto”,我可以看到我的组件中显示的文本是“Isto não estécerto”,并且在它正确显示文本之后是:“Isto não estácerto”。 它太快了,但我可以在屏幕上看到 我相信这不是编码问题,否则文本总是

我正在尝试用Raspberry Pi2和raspbian(debian)-linux做一个滚动文本字幕组件。我正在使用FPC 3.0和Lazarus 1.6

我有下一个代码做滚动,所有的工作都很好,除了一个问题

如果我有一个带有重音的文本,比如:“Isto não estácerto”,我可以看到我的组件中显示的文本是“Isto não estécerto”,并且在它正确显示文本之后是:“Isto não estácerto”。 它太快了,但我可以在屏幕上看到

我相信这不是编码问题,否则文本总是会显示错误

在Windows机器中,使用Lazarus 1.6和FPC 3.0制作的相同程序(与Linux中使用的版本相同),没有显示此问题

我的windows机器当然比我的覆盆子有更多的处理能力

下面是我负责滚动文本的组件的过程

我做错了什么

我希望你已经发布了关于这个问题的所有信息

此过程由计时器触发

var FMemoryBitmap:TBitmap;
     FScrollScreenPos :Integer
     FScrollCurrentChar : Integer;
     FScrollPartString  : String; //partial text to render when I have long text
     FScrollText : String; //Text to scrolling. For sample: "Isto não está certo"
....
procedure TRioMarquee.DoScroll(Restart: Boolean);
var
  ARect : TRect;
  OutY  : Integer;
begin
   { Set colors }
    Canvas.Brush.Color := Color;
    FMemoryBitmap.Canvas.Brush.Color := Color;

   { When restarting, set default values }
    if Restart then begin
     Canvas.FillRect(ClientRect);
     FScrollScreenPos   := ClientWidth;
     FScrollCurrentChar := 1;
     FScrollPartString  := '';
    end;
    { Clear the bitmap }
    ARect := Rect(0,0,FMemoryBitmap.Width,FMemoryBitmap.Height);
    FMemoryBitmap.Canvas.FillRect(ARect);

    { Exit if there is no text to scroll }
    if Length(FScrollText) > 0 then begin
      { Decrease the current output position }
      Dec(FScrollScreenPos,FScrollAmount);

      { Remove text from the beginning until the scrolling position is around 0 }
      if (FScrollScreenPos < 0) then begin
        if Length(FScrollPartString) > 0 then while (FScrollScreenPos+TextWidth(FScrollPartString[1]) < 0) do begin
          Inc(FScrollScreenPos,TextWidth(FScrollPartString[1]));
          Delete(FScrollPartString,1,1);
        end;
      end;

      { Fill up text at the end until PartString is wider than the client rectangle }
      while FScrollScreenPos+TextWidth(FScrollPartString) < ClientWidth do begin
        FScrollPartString := FScrollPartString+FScrollText[FScrollCurrentChar];
        Inc(FScrollCurrentChar);
        if FScrollCurrentChar > Length(FScrollText) then begin
           FScrollCurrentChar := 1;
        end;
      end;

      { Output the Text to the memory bitmap }
      FMemoryBitmap.Canvas.TextOut(FScrollScreenPos,0,FScrollPartString);

      { Now draw the memory bitmap }
      Canvas.Draw(0,0,FMemoryBitmap);
    end;
end;    
var-FMemoryBitmap:TBitmap;
FScrollScreenPos:Integer
FScrollCurrentChar:整数;
FScrollPartString:字符串//当我有长文本时要渲染的部分文本
FScrollText:字符串//要滚动的文本。示例:“Isto não estácerto”
....
过程:marquee.DoScroll(重新启动:布尔值);
变量
ARect:TRect;
OutY:整数;
开始
{设置颜色}
Canvas.Brush.Color:=颜色;
FMemoryBitmap.Canvas.Brush.Color:=颜色;
{重新启动时,设置默认值}
如果重新启动,则开始
Canvas.FillRect(ClientRect);
FScrollScreenPos:=客户端宽度;
FScrollCurrentChar:=1;
FScrollPartString:='';
结束;
{清除位图}
ARect:=Rect(0,0,FMemoryBitmap.Width,FMemoryBitmap.Height);
FMemoryBitmap.Canvas.FillRect(ARect);
{如果没有要滚动的文本,请退出}
如果长度(FScrollText)>0,则开始
{减小当前输出位置}
Dec(FScrollScreenPos,FScrollAmount);
{从开头删除文本,直到滚动位置在0左右}
如果(FScrollScreenPos<0),则开始
如果长度(FScrollPartString)>0,那么while(FScrollScreenPos+TextWidth(FScrollPartString[1])<0开始
Inc(FScrollScreenPos,TextWidth(FScrollPartString[1]));
删除(FScrollPartString,1,1);
结束;
结束;
{在末尾填充文本,直到PartString比客户端矩形宽}
而FScrollScreenPos+TextWidth(FScrollPartString)Length(FScrollText),则开始
FScrollCurrentChar:=1;
结束;
结束;
{将文本输出到内存位图}
FMemoryBitmap.Canvas.TextOut(FScrollScreenPos,0,FScrollPartString);
{现在绘制内存位图}
Canvas.Draw(0,0,fmemory位图);
结束;
结束;

我解决了这个问题。我将所有变量字符串更改为widestring