AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStringList erzeugt Zeilenumbruch am Ende?

Ein Thema von NoGAD · begonnen am 19. Jan 2022 · letzter Beitrag vom 27. Jun 2022
Antwort Antwort
Seite 2 von 2     12   
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: TStringList erzeugt Zeilenumbruch am Ende?

  Alt 24. Jun 2022, 18:28
Random(n) liefert einen Wert von 0 bis n-1, deine Array beginnen aber bei 1.

Vorschläge als Anregung:

Am Ende eines Absatzes sollte vor dem Zeilenumbruch kein Leerzeichen stehn.
Nach Ende des gesamten Textes sollte kein Leerzeichen oder Zeilenumbruch folgen.
Wenn Punktierung aktiv ist, sollte der Text in jedem Fall mit einem Punkt enden
und das erste Wort des gesamten Textes sollte auch mit einem Grossbuchstaben beginnen.
Innerhalb eines Teilsatzes(Komma) sollten nicht zwei gleiche Worte aufeinander folgen.

Wie die Bedingung für ein Satzende bzw. Komma wirken soll, ist mir nicht ganz verständlich.
Vieleicht sollte doch eher die Länge des Satzes bzw. des Teilsatzes in die Entscheidung einfließen.

Wenn ein Text mit nur nur einem Wort erzeugt werden soll und (Absatz > 0), wird vor dem Wort immer ein Zeilenumbruch eingefügt.
Egal ob ein Pre-Wort davor steht. Bei einem Text aus mehreren Worten steht dort niemals ein Zeilenumbruch.
Vieleicht besser: Wenn (Absatz > 0) sollte nach dem Pre-Wort immer ein Zeilenumbruch folgen, ohne Pre-Wort vor dem erste Wort in beiden Fällen nicht.
Damit könnte die Sonderbehandlung von einem Text mit nur einem Wort ganz entfallen.

Derzeit werden die statischen Variablen für die Formatierung einmal per Parameter gesetzt und dann einfach weiter zu verwendet, wenn der Parameter nicht angegeben wurde.
Die Varianten Standard und Bavaria an mehreren Stellen über case zu unterscheiden ist nicht gut gelöst.
Wenn mal eine weitere Variante hinzukommt, muss der vorhandene Quelltext erweitert werden und wird noch unübersichtlicher.
Das spricht für eine Klassenstruktur.
Man muss sich nur entscheiden ob direkt mit den Klassen gearbeitet wird oder Instanzen erzeugt werden müssen (jede mit eigenen Einstellungen für die Formatierung).

Delphi-Quellcode:
unit Unit_LoremIpsum;

interface

uses
  SysUtils, Classes, Types;

type
  TLoremIpsumCustom = class(TObject)
  protected
    class function GetPreText: string; virtual; abstract;
    class function GetRandomWord: string; virtual; abstract;
  public
    class var Absatz: Integer;
    class var UsePre: Boolean;
    class var Punktierung: Boolean;
    class var Kommata: Boolean;
    class function Generate(ACount: Integer): string;
  end;

  TLoremIpsum = class(TLoremIpsumCustom)
  protected
    class function GetPreText: string; override;
    class function GetRandomWord: string; override;
  end;

  TLoremIpsumBavaria = class(TLoremIpsumCustom)
  protected
    class function GetPreText: string; override;
    class function GetRandomWord: string; override;
  end;

implementation

const
  LoremIpsum_Pre = 'Lorem ipsum';
  LoremIpsum: Array [0 .. 116] of string = ('dolor', 'sit', 'amet', 'consetetur', 'sadipscing', 'elitr', 'sed', 'diam', 'nonumy', 'eirmod', 'tempor', 'invidunt', 'ut', 'labore', 'et', 'dolore', 'magna', 'aliquyam', 'erat',
    'voluptua', 'at', 'vero', 'eos', 'accusam', 'justo', 'duo', 'dolores', 'ea', 'rebum', 'stet', 'clita', 'kasd', 'gubergren', 'no', 'sea', 'takimata', 'sanctus', 'est', 'lorem', 'ipsum', 'duis', 'autem', 'vel', 'eum',
    'iriure', 'in', 'hendrerit', 'vulputate', 'velit', 'esse', 'molestie', 'consequat', 'illum', 'eu', 'feugiat', 'nulla', 'facilisis', 'eros', 'accumsan', 'iusto', 'odio', 'dignissim', 'qui', 'blandit', 'praesent',
    'luptatum', 'zzril', 'delenit', 'augue', 'te', 'feugait', 'facilisi', 'consectetuer', 'adipiscing', 'elit', 'nonummy', 'nibh', 'euismod', 'tincidunt', 'laoreet', 'aliquam', 'volutpat', 'wisi', 'enim', 'ad', 'minim',
    'veniam', 'quis', 'nostrud', 'exerci', 'tation', 'ullamcorper', 'suscipit', 'lobortis', 'nisl', 'aliquip', 'ex', 'commodo', 'nam', 'liber', 'cum', 'soluta', 'nobis', 'eleifend', 'option', 'congue', 'nihil', 'imperdiet',
    'doming', 'id', 'quod', 'mazim', 'placerat', 'facer', 'possim', 'assum', 'amet');

  LoremIpsum_Bavaria_Pre = 'Bavaria ipsum';
  LoremIpsum_Bavaria: Array [0 .. 388] of string = ('ghupft', 'wia', 'gsprunga', 'pfiad', 'de', 'guad', 'freibia', 'eam', 'oa', 'meidromml', 'a', 'bissal', 'aba', 'fei', 'moand', 'deandlgwand', 'da', 'buachbinda',
    'wanninger', 'schneid', 'milli', 'maßkruag', 'wos', 'des', 'muas', 'ma', 'hoid', 'kenna', 'nix', 'gwiass', 'woass', 'ned', 'af', 'etza', 'kimmt', 'vergeltsgott', 'wann', 'griagd', 'nacha', 'z', 'dringa', 'leonhardifahrt',
    'ham', 'radi', 'resch', 'xaver', 'haferl', 'greichats', 'is', 'liab', 'griasd', 'eich', 'midnand', 'weißwiaschd', 'mim', 'radl', 'foahn', 'hendl', 'schdeckalfisch', 'gscheit', 'unbandig', 'maibam', 'mechad', 'gschicht',
    'sauba', 'scheans', 'marterl', 'woar', 'hod', 'dringma', 'aweng', 'maß', 'und', 'no', 'landla', 'gaudi', 'foidweg', 'hi', 'schdarmbeaga', 'see', 'mongdratzal', 'ewig', 'drei', 'dog', 'geh', 'mi', 'maderln', 'fingahaggln',
    'anbandeln', 'schmankal', 'radler', 'weibaleid', 'namidog', 'marei', 'i', 'bin', 'woschechta', 'bayer', 'ebba', 'klampfn', 'enzian', 'basd', 'scho', 'obazda', 'bitt', 'prosd', 'spernzaln', 'auffi', 'gidarn', 'auf',
    'gehds', 'beim', 'schichtl', 'allerweil', 'habedehre', 'ded', 'sog', 'schorsch', 'watschnpladdla', 'iabaroi', 'aasgem', 'pfenningguat', 'biakriagal', 'kummd', 'barfuaßat', 'umma', 'baamwach', 'ramasuri', 'wuascht',
    'liberalitas', 'bavariae', 'buam', 'jedza', 'ohrwaschl', 'om', 'n', 'gipfe', 'kirwa', 'sei', 'gehd', 'ollaweil', 'oans', 'zwoa', 'gsuffa', 'd', 'trihöleridi', 'dijidiholleri', 'schoo', 'gscheckate', 'edlweiss', 'nomoi',
    'zidern', 'woibbadinga', 'obacht', 'measi', 'liabs', 'deandl', 'goaßmaß', 'in', 'greana', 'au', 'diandldrahn', 'bradwurschtsemmal', 'daad', 'g', 'hupft', 'midanand', 'schüds', 'nei', 'noch', 'giasinga', 'heiwog',
    'breihaus', 'schuabladdla', 'fünferl', 'griasnoggalsubbm', 'do', 'bittschön', 'imma', 'mogsd', 'bussal', 'aso', 'nimma', 'hob', 'an', 'suri', 'wea', 'nia', 'ausgähd', 'kummt', 'hoam', 'ganze', 'hoiwe', 'haberertanz',
    'wiad', 'mordsgaudi', 'oba', 'schbozal', 'eana', 'hea', 'schee', 'fensdaln', 'hoggd', 'griaß', 'god', 'beinand', 'fias', 'sodala', 'hemad', 'glacht', 'helfgod', 'resi', 'fescha', 'bua', 'gstanzl', 'hog', 'di', 'singd',
    'kini', 'naa', 'kumm', 'sepp', 'abfieseln', 'schellnsau', 'charivari', 'zünftig', 'broadwurschtbudn', 'dahoam', 'samma', 'gamsbart', 'need', 'hallelujah', 'luja', 'koa', 'wuid', 'amoi', 'biagadn', 'von', 'gfreit', 'am',
    'acht', 'tag', 'schuf', 'gott', 'bia', 'hinter', 'm', 'berg', 'san', 'leit', 'hogg', 'uns', 'zamm', 'obandeln', 'hetschapfah', 'kloan', 'musi', 'so', 'schmarn', 'reiwadatschi', 'kuaschwanz', 'back', 'mas', 'gwihss',
    'wolln', 'ognudelt', 'moan', 'oiwei', 'jo', 'mei', 'gams', 'wo', 'großherzig', 'soi', 'biazelt', 'ledahosn', 'wolpern', 'semmlkneedl', 'servas', 'der', 'oim', 'gibt', 's', 'sünd', 'oachkatzlschwoaf', 'singan', 'legst',
    'nieda', 'es', 'zua', 'hab', 'heimatland', 'pfundig', 'biawambn', 'jodler', 'gwiss', 'schaugn', 'nimmds', 'vui', 'spezi', 'graudwiggal', 'kaiwe', 'spotzerl', 'zwedschgndadschi', 'ja', 'red', 'bloß', 'gmahde', 'wiesn',
    'sowos', 'weida', 'gelbe', 'rüam', 'schaung', 'kost', 'lem', 'lossn', 'umananda', 'denn', 'wiavui', 'gor', 'gar', 'narrisch', 'gean', 'wurscht', 'huift', 'auszutzeln', 'mehra', 'dee', 'schwoanshaxn', 'vasteh', 'waar',
    'soweid', 'sauakraud', 'trachtnhuat', 'baddscher', 'middn', 'guglhupf', 'steckerleis', 'schnacksln', 'weiznglasl', 'du', 'dadst', 'daugn', 'sammawiedaguad', 'heid', 'watschnbaam', 'mog', 'blärrd', 'kneedl', 'engelgwand',
    'sonn', 'spuiratz', 'owe', 'leck', 'oamoi', 'brezn', 'vo', 'heitzdog', 'greaßt', 'nachad', 'ozapfa', 'gfoids', 'sagrisch', 'almrausch', 'sauwedda', 'glei', 'brodzeid', 'gschmeidig', 'bladl', 'bravs', 'lewakaas', 'wui',
    'boarischer', 'hawadere', 'midananda', 'im', 'beidl', 'dei', 'mamalad', 'prosit', 'gmiadlichkeit', 'stubn', 'wirds', 'fui', 'lustiga', 'brotzeit', 'biaschlegl', 'oans');

class function TLoremIpsumCustom.Generate(ACount: Integer): string;

  function UpCaseFirst(const AValue: string; AUpCase: Boolean): string;
  begin
    Result := AValue;
    if AUpCase and (Length(Result) > 0) then
      Result[1] := UpCase(Result[1]);
  end;

var
  i, n: Integer;
  SatzBegin: Boolean;
  SatzKomma: Boolean;
begin
  Result := '';

  if ACount < 1 then
    Exit;

  if UsePre then
  begin
    Result := GetPreText;

    if Absatz > 0 then
      Result := Result + sLineBreak
    else
      Result := Result + SPACE;
  end;

  {erstes Word beginnt mit Grossbuchstabe}
  Satzbegin := Punktierung;

  for i := 1 to ACount do
  begin
    {kein zusätzliches Trennzeichen am Textanfang}
    if i > 1 then
    begin
      var Trennzeichen: string := SPACE;
      if (Absatz > 0) and (i > 1) then
      begin
        if Absatz > ACount then
          n := 3
        else
          n := Absatz;

        n := ACount div n;

        if (i mod n) = 0 then
          Trennzeichen := sLineBreak;
      end;
      Result := Result + Trennzeichen;
    end;

    Result := Result + UpCaseFirst(GetRandomWord, Satzbegin);

    SatzKomma := False;
    {nicht am Textende}
    if Kommata and (i < ACount) then
    begin
      if Random(i) mod 7 = Random(2) then
      begin
        Result := Result + ',';
        SatzKomma := True;
      end;
    end;

    Satzbegin := False;
    if Punktierung and (not SatzKomma) then
    begin
      {Auf jeden Fall am Textende}
      if (i = ACount) or (Random(i) mod 17 = Random(2)) then
      begin
        Result := Result + '.';
        Satzbegin := True;
      end;
    end;
  end;
end;

class function TLoremIpsum.GetPreText: string;
begin
  Result := LoremIpsum_Pre;
end;

class function TLoremIpsum.GetRandomWord: string;
begin
  Result := LoremIpsum[Random(High(LoremIpsum))];
end;

class function TLoremIpsumBavaria.GetPreText: string;
begin
  Result := LoremIpsum_Bavaria_Pre;
end;

class function TLoremIpsumBavaria.GetRandomWord: string;
begin
  Result := LoremIpsum_Bavaria[Random(High(LoremIpsum_Bavaria))];
end;

end.
Delphi-Quellcode:
program LoremIpsum;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Unit_LoremIpsum in 'Unit_LoremIpsum.pas';

begin
  try
    Randomize;

    TLoremIpsum.Absatz := 3;
    TLoremIpsum.Kommata := True;
    TLoremIpsum.UsePre := True;
    TLoremIpsum.Punktierung := True;

    writeln(TLoremIpsum.Generate(50));
    writeln;
    writeln(TLoremIpsumBavaria.Generate(50));
    readln;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

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

AW: TStringList erzeugt Zeilenumbruch am Ende?

  Alt 24. Jun 2022, 19:33
Hallo Blup,

vielen Dank für das Umschreiben in eine Klasse. Es ist somit tatsächlich übersichtlicher.

Ich muss das erst einmal verarbeiten

LG und ein schönes Wochenende.
Mathias
Ich vergesse einfach zu viel.
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

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

AW: TStringList erzeugt Zeilenumbruch am Ende?

  Alt 25. Jun 2022, 17:24
Neue Unit, eine erweiterte von Blup:


Neu:

1. Deutsch ist dabei
2. Bei einem Absatz ist bei Punktierung immer ein Punkt
3. Mit Absatz kein Komma mehr am Absatzende
4. Konjuktionen wurden hinzugefügt (Bindewörter) - dadurch wird z.B. ein deutscher Text 'ansehnlicher'
5. Kleinen Fehler behoben: { Keinen Absatz am Ende }

Für Anregungen und Kritik, auch gerne wieder Fehlerkorrekturen, bin ich sehr dankbar.


Die Unit ist jetzt als Anhang (zip), weil sie durch die dt. Wortliste zu lang geworden ist.


LG
Angehängte Dateien
Dateityp: zip Unit_LoremIpsum2.zip (41,6 KB, 1x aufgerufen)
Mathias
Ich vergesse einfach zu viel.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.384 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: TStringList erzeugt Zeilenumbruch am Ende?

  Alt 27. Jun 2022, 08:26
TODO:
1. Punktierung am Ende korrigieren
2. Bessere Absätze bilden
3. Andere Varianten
4. Unit Tests
5. Debuggen lernen.
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

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

AW: TStringList erzeugt Zeilenumbruch am Ende?

  Alt 27. Jun 2022, 10:58
4. Unit Tests
5. Debuggen lernen.

Hallo, leider wieß ich nicht, was Du meinst.

Bei mir funktioniert es, wie gewünscht.

LG
Mathias
Ich vergesse einfach zu viel.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz