// Normalerweise
setzt man bei einem Label
WordWrap=True
und
AutoSize=False
// um Text mit Zeilenumbrüchen anzuzeigen. Dabei wird aber Text nicht
mehr
// angezeigt, wenn er zu lang ist, oder man muß ständig die Ausmaße des
Labels
// überwachen und ändern. Das alles ist im Folgenden nicht mehr nötig.
// Es wird ein
Text, welcher in einem Label mit begrenzter Breite angezeigt
// werden soll, mit Textumbrüchen
(ohne Silbentrennung) versehen.
Wörter,
// deren Anfang gerade noch in die Breite hineinpassen, deren Ende aber
über
// die vorgegebene Breite hinausragen, werden trotzdem angezeigt
(wird benötigt,
//
falls ein Wort allein bereits schon breiter ist als die Begrenzung).
Das kann
// man aber über einen Wert in
EndZone
steuern. Die Größe dieses Wertes sollte
// als Kompromiss etwa die Hälfte der Breite des längsten Wortes im Text
sein.
// Wenn absolut kein Platz vorhanden ist, muss
EndZone
der Breite des
// längsten Wortes im Text entsprechen. Das ergibt aber wegen der
fehlenden
// Silbentrennung bei sehr langen Wörtern einen sehr groben Flatterrand.
// In der Regel reichen Schätzwerte für den
EndZone.
Sollten sich im Text
// Steuerzeichen befinden, werden diese entfernt. Zeilenumbrüche oder
Tabs
// werden in Leerzeichen gewandelt. Damit kann man als Text für das
Label auch
// Memo.Text
oder
Richedit.Text
einsetzen, welcher dann neu formatiert wird.
// Getestet mit D4 unter WinME
function umbruch(c: TCanvas; txt: string; BreiteInPixel, EndZone: integer): string;
var
p, start, lg: integer;
teil, gesamt, zeile: string;
begin
gesamt := stringreplace(trim(txt), #13, #32, [rfreplaceall]);
gesamt := stringreplace(gesamt, #9, #32, [rfreplaceall]);
p := 1;
while p <= length(gesamt) do begin
if gesamt[p] < #32 then delete(gesamt, p, 1)
else inc(p);
end;
lg := length(gesamt);
result := '';
zeile := '';
start := 0;
repeat
p := pos(#32, copy(gesamt, start + 1, lg));
if p = 0 then p := lg + 1;
teil := copy(gesamt, start + 1, p);
if c.textwidth(zeile + teil) + EndZone > BreiteInPixel
then begin
zeile := '';
result := result + #13 + teil;
end else begin
zeile := zeile + teil;
result := result + teil;
end;
start := start + p;
until p = lg + 1;
end;
// Beispielaufruf
procedure TForm1.Button4Click(Sender: TObject);
var
s: string;
begin
s := 'Dieses ist ein reiner Test-Text, damit man den Zeilenumbruch' +
' in einem Label demonstrieren kann.';
label1.caption := umbruch(label1.canvas, s, 150, 0);
end;
// Im Folgenden wird der Wert für
EndZone
vor dem Umbruch errechnet.
// Für Trennung
sollte man 1 oder 2 einsetzen.
function FindEndZone(c: TCanvas; txt: string; Trennung: byte): integer;
var
sl: TStringlist;
x, y: integer;
begin
result := 0;
sl := TStringlist.create;
sl.commatext := txt;
for x := 0 to sl.count - 1 do begin
y := c.textwidth(sl[x]) div Trennung;
if y > result then result := y;
end;
end;
// Beispielaufruf
procedure TForm1.Button5Click(Sender: TObject);
var
s: string;
ez: integer;
Trennung: byte;
begin
s := 'Dieses ist ein neuer Text. Man kann mit ihm ebenfalls den ' +
'Zeilenumbruch in einem Label demonstrieren.';
Trennung := 2; // halbes Wort
{Trennung:=1; // ganzes Wort}
ez := FindEndZone(label1.canvas, s, Trennung);
label1.caption := umbruch(label1.canvas, s, 150, ez);
end;
|