Einzelnen Beitrag anzeigen

Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#1

TStringList erzeugt Zeilenumbruch am Ende?

  Alt 19. Jan 2022, 17:46
Hallo,

meine TStringList erzeugt einen Zeilenumbruch am Ende, obwohl ich diesen ausgeschlossen habe.

Hier ist der Code:

Delphi-Quellcode:
unit Unit_Funktionen_Strings;

interface

uses
  SysUtils, Classes, Graphics, Windows, Registry, ShellApi, TypInfo, Messages;

function CreateLoremipsum(var Stringlist: TStringList; Anzahl: Integer;
  Absatz: Integer = 1; DoppeltAbsatz: Boolean = True): Boolean;


const
  { Lorem Ipsum }
  LorenIpsum_Pre = 'Lorem ipsum ';
  LoremIspum: array [0 .. 177] of string = ('lorem', 'ipsum', 'dolor', 'sit',
    'amet', 'consectetur', 'adipiscing', 'elit', 'curabitur', 'vel',
    'hendrerit', 'libero', 'eleifend', 'blandit', 'nunc', 'ornare', 'odio',
    'ut', 'orci', 'gravida', 'imperdiet', 'nullam', 'purus', 'lacinia', 'a',
    'pretium', 'quis', 'congue', 'praesent', 'sagittis', 'laoreet', 'auctor',
    'mauris', 'non', 'velit', 'eros', 'dictum', 'proin', 'accumsan', 'sapien',
    'nec', 'massa', 'volutpat', 'venenatis', 'sed', 'eu', 'molestie', 'lacus',
    'quisque', 'porttitor', 'ligula', 'dui', 'mollis', 'tempus', 'at', 'magna',
    'vestibulum', 'turpis', 'ac', 'diam', 'tincidunt', 'id', 'condimentum',
    'enim', 'sodales', 'in', 'hac', 'habitasse', 'platea', 'dictumst', 'aenean',
    'neque', 'fusce', 'augue', 'leo', 'eget', 'semper', 'mattis', 'tortor',
    'scelerisque', 'nulla', 'interdum', 'tellus', 'malesuada', 'rhoncus',
    'porta', 'sem', 'aliquet', 'et', 'nam', 'suspendisse', 'potenti', 'vivamus',
    'luctus', 'fringilla', 'erat', 'donec', 'justo', 'vehicula', 'ultricies',
    'varius', 'ante', 'primis', 'faucibus', 'ultrices', 'posuere', 'cubilia',
    'curae', 'etiam', 'cursus', 'aliquam', 'quam', 'dapibus', 'nisl', 'feugiat',
    'egestas', 'class', 'aptent', 'taciti', 'sociosqu', 'ad', 'litora',
    'torquent', 'per', 'conubia', 'nostra', 'inceptos', 'himenaeos',
    'phasellus', 'nibh', 'pulvinar', 'vitae', 'urna', 'iaculis', 'lobortis',
    'nisi', 'viverra', 'arcu', 'morbi', 'pellentesque', 'metus', 'commodo',
    'ut', 'facilisis', 'felis', 'tristique', 'ullamcorper', 'placerat',
    'aenean', 'convallis', 'sollicitudin', 'integer', 'rutrum', 'duis', 'est',
    'etiam', 'bibendum', 'donec', 'pharetra', 'vulputate', 'maecenas', 'mi',
    'fermentum', 'consequat', 'suscipit', 'aliquam', 'habitant', 'senectus',
    'netus', 'fames', 'quisque', 'euismod', 'curabitur', 'lectus', 'elementum',
    'tempor', 'risus', 'cras');

implementation

function CreateLoremipsum(var Stringlist: TStringList; Anzahl: Integer;
  Absatz: Integer = 1; DoppeltAbsatz: Boolean = True): Boolean;
var
  x, y, z: Integer;
  s, t: string;
begin

  Randomize;
  z := 0;
  y := 0;

  if Absatz > 1 then
  begin
    y := Anzahl div Absatz;
    z := 1;
  end;

  Result := True;
  try
    s := LorenIpsum_Pre;
    Anzahl := Anzahl - 2;
    for x := 1 to Anzahl do
    begin
      t := LoremIspum[Random(High(LoremIspum))];
      if (Length(s) > 0) and (s[Length(Trim(s))] = '.') then
        t[1] := UpCase(t[1]);
      if x mod (Random(9) + (Random(2) + 1)) = 0 then
        case x mod (Random(9) + (Random(3) + 1)) of
          0:
            t := t + ',';
          3, 5:
            t := t + '.';
        end;
      if x mod (Random(9) + (Random(3) + 1)) = 0 then
        t[1] := UpCase(t[1]);
      s := s + t;

      case ((y > 0) and (z > 0)) and ((x) = (y * z)) of
        True:
          begin
            if s[Length(s)] = ',then
              s[Length(s)] := '.'
            else
              s := s + '.';
            inc(z, 1);
            s := Trim(s);
            s[1] := UpCase(s[1]);
            Stringlist.Add(s);
            if DoppeltAbsatz then
              Stringlist.Add(sLineBreak);
            s := '';
          end;
        False:
          s := s + #32;
      end;
    end;
    if Stringlist.Count > 0 then
      if (Stringlist.Strings[Stringlist.Count - 1] = sLineBreak )or (Stringlist.Strings[Stringlist.Count - 1] = '')then
        Stringlist.Delete(Stringlist.Count - 1);
  except
    Result := False;
  end;

end;

end.

Aufruf:

Delphi-Quellcode:
var
  DummySL: TStringList;
begin
  randomize;
  DummySL := TStringList.Create;
  CreateLoremipsum(DummySL, random(225) + 2, random(5) + 2);
  Label1.Caption := DummySL.Text;
  DummySL.Free;
Das Label hat:

Autosize := True
WordWrap := False;

Und trotz if Stringlist.Count > 0 then
if (Stringlist.Strings[Stringlist.Count - 1] = sLineBreak )or (Stringlist.Strings[Stringlist.Count - 1] = '')then
Stringlist.Delete(Stringlist.Count - 1);

wird im Label immer eine Leerzeile am Ende erzeugt. Wo liegt mein Denkfehler?

LG Mathias
Mathias
Ich vergesse einfach zu viel.
  Mit Zitat antworten Zitat