// 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;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke