Hi,
When writing text to the canvas using Canvas.TextRec(), using layout tlTop and/or alignment? taLeftJustify, the text is aligned to the canvas left and top edges instead of those edges of the text rectangle. The other layout and alignment cases work correctly.
The sample code below illustrates this for all 9 possible combinations of layout and alignment.
Changing lines 1302 and 1304 of canvas.inc fixes this problem:
?? 1302:?? fRect.Left := X; --> fRect.Left := fRect.Left + X;
?? 1304:?? fRect.Top := Y;? --> fRect.Top := fRect.Top + Y;canvas.inc in Lazarus 2.2.4 and trunk are the same.
Regards
Russ
<code>
?? unit Unit1;?? {$mode objfpc}{$H+}
?? interface
?? uses
???? Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
?? type
???? TForm1 = class(TForm)
?????? procedure FormCreate(Sender: TObject);
?????? procedure FormPaint(Sender: TObject);
???? end;
?? var
???? Form1: TForm1;?? implementation
?? {$R *.lfm}
?? procedure TForm1.FormCreate(Sender: TObject);
?? begin
???? Width := 300;
???? Height := 300;
???? Position := poDesktopCenter;
?? end;
?? procedure TForm1.FormPaint(Sender: TObject);
?? const
???? Txt ='%s'+LineEnding+'%s';
???? Spacing = 75;
???? LeftMargin = 50;
???? TopMargin = 50;
???? VAlign: array[0..2] of TTextLayout = (tlTop, tlCenter, tlBottom);
???? HAlign: array[0..2] of TAlignment = (taLeftJustify, taCenter,
taRightJustify);
?? var
???? TxtRect: TRect;??? // Rectangle used for text.
???? Outline: TRect;??? // Enclosing outline rectangle.
???? TxtStyle: TTextStyle;
???? Col, Row: integer;
???? X, Y: Integer;
???? VStr, HStr: string;
?? begin
???? TxtStyle := Default(TTextStyle);
???? TxtStyle.Wordbreak := true;
???? TxtStyle.SystemFont := true;
???? TxtRect := TRect.Create(0, 0, 55, 50);
???? Outline := TRect.Create(0, 0, 59, 52);
???? for Row := 0 to 2 do begin
?????? TxtStyle.Layout := VAlign[Row];
?????? WriteStr(VStr, VAlign[Row]);
?????? VStr := VStr.Replace('tl', '');
?????? Y := TopMargin + Row * Spacing;
?????? for Col := 0 to 2 do begin
???????? WriteStr(HStr, HAlign[Col]);
???????? HStr := HStr.Replace('Justify','').Replace('ta','');
???????? X := LeftMargin + Col * Spacing;
???????? Outline.SetLocation(X, Y);
???????? TxtRect.SetLocation(X, Y);
???????? TxtStyle.Alignment := HAlign[Col];
???????? Canvas.Rectangle(Outline);
???????? Canvas.TextRect(TxtRect, 2, 2, Txt.Format(Txt, [VStr, HStr]),
TxtStyle);
?????? end;
???? end;
?? end;?? end.
</code>
<form>
?? object Form1: TForm1
???? Left = 728
???? Height = 529
???? Top = 176
???? Width = 545
???? Caption = 'Form1'
???? OnCreate = FormCreate
???? OnPaint = FormPaint
???? LCLVersion = '2.2.4.0'
?? end
</form>
