Linux 在拉斯宾语中使用拉扎勒斯滚动文本
我正在尝试用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机器当然比我的覆盆子有更多的处理能力 下面是我负责滚动文本的组件的过程 我做错了什么 我希望你已经发布了关于这个问题的所有信息 此过程由计时器触发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”。 它太快了,但我可以在屏幕上看到 我相信这不是编码问题,否则文本总是
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