Witam
Problem jest następujący:
Piszę tekst za pomocą
canvas.textout(...)
Znam x początku tekstu w linii i długość tekstu poprzez
canvas.textwidth(...)
Jak go wyjustować do lewego i prawego marginesu?
Witam
Problem jest następujący:
Piszę tekst za pomocą
canvas.textout(...)
Znam x początku tekstu w linii i długość tekstu poprzez
canvas.textwidth(...)
Jak go wyjustować do lewego i prawego marginesu?
Chodzi mi prawie o coś takiego co jest w tym drugim przykładzie w tym linku.
Jednakże nie mogę sobie poradzić z pewną kwestią.
Otóż mój canvas to jest canvas drukarki.
I ja drukuję w orientacji poziomej 2 dokumenty obok siebie (po przecięciu A5).
Czyli normalnie robię textout(x,y) w lewej połowie strony i textout w prawej połowie strony.
Więc chodzi mi jak przerobić ten kod aby justował mi od danego X do danego X?
Pokombinuj z drugim argumentem w funkcji SetTextJustification oraz z ostatnim w funkcji SetTextAlign.
Nie mogę sobie z tym poradzić. Postanowiłem napisać własny algorytm justowania do lewego i prawego marginesu. Wygląda on tak:
function Justify(DC:HDC;text:string;AreaWidth:integer):string;
var
Canvas : TCanvas;
i,j : integer;
Len : integer;
SpaceLen : integer;
tmp : string;
begin
Canvas:=TCanvas.Create;
Canvas.Handle:=DC;
Len:=Canvas.TextWidth(text);
SpaceLen:=Canvas.TextWidth(#32);
i:=1;
while (Len<AreaWidth) do begin
while(i<Length(text)) do begin
if text[i]=#32 then begin
for j:=i+1 to Length(text) do
if text[j]=#32 then inc(i) else break;
tmp:='';
for j:=1 to i do tmp:=tmp+text[j];
tmp:=tmp+#32;
for j:=i+1 to length(text) do tmp:=tmp+text[j];
text:=tmp;
i:=i+2;
Len:=Len+SpaceLen;
end else
inc(i);
end;
i:=1;
end;
Result:=text;
end;
Wywołuję to w następujący sposób:
procedure Print;
var
text : string;
begin
...
Printer.Canvas.Rectangle(10,10,500,50);
t:=Justify(Printer.Canvas.Handle,'A B C D E F G H I J',489);
Printer.Canvas.TextOut(11,11,t);
...
end;
I działa on nawet nieźle ale przy małej liczbie wyrazów. Przy większej liczbie(l<4) efekty zaczyna się troche rozjeżdżać.
Ma ktoś pomysł jak to zmodyfikować??
Sprawa bardzo pilna!!