(Gast)
n/a Beiträge
|
AW: WordBreak innerhalb eines Wortes
14. Nov 2012, 17:01
Ich hab mal was geschrieben, ist aber schon lange her, so dass ich es dir nicht erklären kann. Gedacht ist es so, dass ein beliebiger Text einer StringList so umbrochen wird, dass er von der Breite in eine von der Breite vordefinierte Bitmap passt. Die Höhe der Bitmap sollte dann auch noch neu definiert werden bevor gezeichnet wird:
Delphi-Quellcode:
//Bricht die Textzeilen eines Textes in StringList so, dass sie in einer
//Bitmap passen. Diese Prozedur bricht nur die Zeilen, zeichnet nicht.
//Der Bitmap-Parameter dient nur zur Größenbestimmungen: Font, Width, usw.
//List enthällt den Text der umbrochen werden soll.
procedure TextToBitmap2(AList: TStrings; ATarget: TBitmap);
var
i, k, LastSpace: Integer;
Line, s: String;
begin
if AList.Count = 0 then Exit;
if ATarget.Width = 0 then Exit;
i := 0;
repeat
LastSpace := 0;
for k := 1 to Length(AList[i]) do
begin
Line := AList[i];
if (ATarget.Canvas.TextWidth(Copy(Line, 1, k))) <= (ATarget.Width) then
begin
if {Line[k]} Copy(Line, k, 1) = ' ' then LastSpace := k;
end
else
begin
if LastSpace = 0 then
begin
if k > 0 then
begin
s := Copy(Line, k, Length(Line));
//Schneidet ab letzten gültigen Zeichen ab
System.Delete(Line, k, Length(Line));
end;
end
else
begin
//Mit +1 wird das Leerzeichen nicht übernommen, da es sonst als
//erstes Zeichen in der Zeile vorkommt
s := Copy(Line, LastSpace+1, Length(Line));
//Mit +1 bleibt das Leerzeichen an der aktuellen Zeile,
//was bei Übertragung in Grafik nicht wichtig ist.
//Mit +0 (oder Nichts) wird auch das Leerzeichen gelöscht
System.Delete(Line, LastSpace+1, Length(Line));
end;
AList[i] := Line;
AList.Insert(i + 1, s);
end;
end;
Inc(i);
until i > (AList.Count - 1);
end;
|
|
Zitat
|