Jens Köhler
2017-09-20 17:33:45 UTC
Hallo,
ich versuche, Text in einzelnen Rechtecken auszugeben.
Dazu wollte ich DrawTextEx verwenden, da dieses zurückgeben soll,
wieviel Text in das Rechteck paßt.
Das scheint nicht so richtig zu funktionieren.
Ohne DT_WordBreak wird der komplette Text ausgegeben? von dem man aber
nur das Stück im Rechteck sieht.
Mit DT_WordBreak wird nur das ausgegeben, was auch ins Rechteck paßt,
aber nur, wenn das Rechteck so niedrig ist, das die Unterlänge vom g
schon abgeschnitten wird. Ansonsten wird eine nicht sichtbare 2. Zeile
ausgegeben und vom nachfolgenden Text fehlt diese.
Ist das so eine "Lass es und machs lieber selbst"-Funktion oder was
mache ich falsch bzw. wie mach ich es Richtig?
D5 unter WinXP
ps: ich habe eine Funktion, die mir den Text zerschnipselt, aber ich
dachte, wenn es eine Funktion gibt, die das in einem Rutsch erledigt,
kann ich die auch nehmen.
procedure TForm1.Button1Click(Sender: TObject);
var
Text, s : String;
LineHeight,
TxLen,
x : integer;
R : TRect;
Dtp : TDrawTextParams;
Flags : DWord;
begin
Canvas.Font.Size := 12;
Canvas.Font.Name := {'Courier';//}'Arial'; // 'Dauphin';}
'CroissantD';
Canvas.Font.Color := clBlue;
Canvas.Brush.Style := bsClear;
LineHeight := Canvas.TextHeight('Äg');
// LineHeight := round(LineHeight * 1.2);
Text := 'Äg Das ist ein Text, der auf ein paar Rechtecke verteilt
werden soll.';
R := Rect(30, 30, 130, 30+LineHeight-1);
// Canvas.Rectangle(R);
FillChar(Dtp, SizeOf(Dtp), 0);
Dtp.cbSize := SizeOf(Dtp);
Flags := DT_Left or DT_NoPrefix{;// or DT_SINGLELINE;//} or
DT_WordBreak;
TxLen := length(Text);
x := DrawTextEx(Canvas.Handle, @Text[1], TxLen, R, Flags, @Dtp);
//PChar(Text)
// Rest und Daten ausgeben
s := trim(copy(Text, Dtp.uiLengthDrawn, MaxInt));
Canvas.TextOut(30, 60, s);
Label1.Caption := IntToStr(Dtp.uiLengthDrawn);
Label2.Caption := IntToStr(TxLen);
end;
ich versuche, Text in einzelnen Rechtecken auszugeben.
Dazu wollte ich DrawTextEx verwenden, da dieses zurückgeben soll,
wieviel Text in das Rechteck paßt.
Das scheint nicht so richtig zu funktionieren.
Ohne DT_WordBreak wird der komplette Text ausgegeben? von dem man aber
nur das Stück im Rechteck sieht.
Mit DT_WordBreak wird nur das ausgegeben, was auch ins Rechteck paßt,
aber nur, wenn das Rechteck so niedrig ist, das die Unterlänge vom g
schon abgeschnitten wird. Ansonsten wird eine nicht sichtbare 2. Zeile
ausgegeben und vom nachfolgenden Text fehlt diese.
Ist das so eine "Lass es und machs lieber selbst"-Funktion oder was
mache ich falsch bzw. wie mach ich es Richtig?
D5 unter WinXP
ps: ich habe eine Funktion, die mir den Text zerschnipselt, aber ich
dachte, wenn es eine Funktion gibt, die das in einem Rutsch erledigt,
kann ich die auch nehmen.
procedure TForm1.Button1Click(Sender: TObject);
var
Text, s : String;
LineHeight,
TxLen,
x : integer;
R : TRect;
Dtp : TDrawTextParams;
Flags : DWord;
begin
Canvas.Font.Size := 12;
Canvas.Font.Name := {'Courier';//}'Arial'; // 'Dauphin';}
'CroissantD';
Canvas.Font.Color := clBlue;
Canvas.Brush.Style := bsClear;
LineHeight := Canvas.TextHeight('Äg');
// LineHeight := round(LineHeight * 1.2);
Text := 'Äg Das ist ein Text, der auf ein paar Rechtecke verteilt
werden soll.';
R := Rect(30, 30, 130, 30+LineHeight-1);
// Canvas.Rectangle(R);
FillChar(Dtp, SizeOf(Dtp), 0);
Dtp.cbSize := SizeOf(Dtp);
Flags := DT_Left or DT_NoPrefix{;// or DT_SINGLELINE;//} or
DT_WordBreak;
TxLen := length(Text);
x := DrawTextEx(Canvas.Handle, @Text[1], TxLen, R, Flags, @Dtp);
//PChar(Text)
// Rest und Daten ausgeben
s := trim(copy(Text, Dtp.uiLengthDrawn, MaxInt));
Canvas.TextOut(30, 60, s);
Label1.Caption := IntToStr(Dtp.uiLengthDrawn);
Label2.Caption := IntToStr(TxLen);
end;