Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#3

AW: WordBreak innerhalb eines Wortes

  Alt 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;
  Mit Zitat antworten Zitat