Delphi 为什么DrawText只打印字符串的前四个字符?

Delphi 为什么DrawText只打印字符串的前四个字符?,delphi,Delphi,我对Canvas DrawText有问题,我只从要显示的文本中获得了前4个字符 例如,我有文本“offline”,它将显示“offl” 这段代码有什么问题 代码 procedure TStatusCombo.Paint ; var DrawRect : TRect ; StatusColor : TColor ; iTextWidth : Integer ; r : TRect ; begin DrawRect := ClientRect ; //colors Canv

我对Canvas DrawText有问题,我只从要显示的文本中获得了前4个字符

例如,我有文本“offline”,它将显示“offl”

这段代码有什么问题

代码

procedure TStatusCombo.Paint ;
var DrawRect : TRect ;
    StatusColor : TColor ;
    iTextWidth : Integer ;
    r : TRect ;
begin
DrawRect := ClientRect ;

//colors
Canvas.Brush.Style := bsClear ; //transparent background
Canvas.Brush.Color := Tcolor($4D4D4D) ;
Canvas.Pen.Color :=  Tcolor($4D4D4D)   ;

Canvas.RoundRect(DrawRect.Left , DrawRect.Top ,
            DrawRect.Right , DrawRect.Bottom , 15, 15);

//Drawing
//SetRect(DrawRect, DrawRect.Left+3, DrawRect.Top+3, DrawRect.Right-3, DrawRect.Bottom-3);

case ChatStatus of
  sNormal: StatusColor  :=   TColor($00FF78) ;
  sOnline: StatusColor  :=   TColor($00FF78) ;
  sBusy: StatusColor  :=   TColor($00FF78) ;
  sAway: StatusColor  :=   TColor($00FF78) ;
  sOffline:StatusColor  :=   TColor($00FF78) ;
end;
Canvas.Brush.Color := StatusColor ;

Canvas.RoundRect(DrawRect.Right - 20 , DrawRect.Top +4 ,
            DrawRect.Right -10  , DrawRect.Bottom -4  , 5, 5);


FCaption := FStatusText[ChatStatus];
Canvas.Brush.Style := bsClear ;
Canvas.Font.Color := clWhite ;


DrawText(Canvas.Handle,pchar(FCaption) ,sizeof(FCaption),DrawRect ,DT_VCENTER  or DT_CENTER or DT_SINGLELINE);




end;

您必须使用
Length(FCaption)
而不是
SizeOf(FCaption)


实际上,
Length(FCaption)
是字符串
FCaption
的长度,而
SizeOf(FCaption)
是变量
FCaption
的大小。由于
FCaption
是一个字符串,因此(从技术上讲)它是一个指针(指向实际字符),指针长度为四个字节(在32位应用程序中)。因此,您只得到前四个字符。

最简单的方法是通过-1而不是长度()