Thema: Delphi Zeilen umbrechen

Einzelnen Beitrag anzeigen

Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#3

Re: Zeilen umbrechen

  Alt 4. Mär 2009, 20:25
Hi,

mir fiel vorhin auf, dass SynEdit alle Zeichen jeder Schriftart auf die gleiche Breite streckt. Daher fällt die Näherung sogar weg. Dennoch muss ich einen Zeilenumbruch manuell programmieren. Vorhin kam ich auf die Idee, es über Tokens zu lösen: Man erzeugt sich eine Liste aus Tokens und schaut dann, wie viele Tokens in eine Zeile passen und fügt, falls keins mehr passt, genau das in die nächste Zeile ein. Grundlegend funktionierte es auch, aber nicht schnell genug mit großen Dateien. Gestern programmierte mimi eine Funktion, die genau das erledigen sollte. Sie ist schneller und ich habe sie daher genommen. An der Stelle auch nochmal hier ein großes Danke! Ich habe den Code noch leicht optimiert und kommentiert. Daher brauche ich zu dem Code an sich nichts mehr zu sagen.
Delphi-Quellcode:
{ Zeilenumbrüche falls notwendig erzeugen
  Dies geschieht mithilfe von Tokens, die falls ein Satzzeichen kommt abgeschlossen sind. }

procedure LineBreak(sl : TStrings; w : Integer; var Result : TStrings); // sl=Input; w=Zulässige Breite in Buchstaben
var i, j, c : Integer; // c=Länge des aktuellen Strings
    sWord : String; // sWord=Aktuelles Wort
begin
  for i := 0 to Pred(sl.Count) do
  begin
    // Um Speicher zu sparen wird die Länge des aktuellen Strings gespeichert
    c := Length(sl[i]);
    sWord := '';
    // Ist c >= w, muss umgebrochen werden
    if c >= w then
    begin
      // String-Schleife
      for j := 1 to c do
      begin
        // Ist der aktuelle Char kein Satzzeichen, kann er zu sWord hinzugefügt werden
        if (not (sl[i][j] in WordDelimiters)) and (j < c) then
          sWord := sWord+sl[i][j]
        else
        begin
          // Ansonsten wird noch das letzte Zeichen hinzugefügt
          sWord := sWord+sl[i][j];
          // und...
          if Length(Result[Pred(Result.Count)])+Length(sWord) < w then
            // ...falls möglich noch an den letzten hinzugefügten String angefügt
            Result[Pred(Result.Count)] := Result[Pred(Result.Count)]+sWord
          else
            // ...als String an Result angehängt
            Result.Add(sWord);
          // Für den nächsten Durchlauf Variable zurücksetzen
          sWord := '';
        end;
      end;
    end else
      // Andernfalls kann der String direkt in Result wandern
      Result.Add(sl[i]);
  end;
end;
  Mit Zitat antworten Zitat