AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Innere Struktur von TStrings / TMemo

Ein Thema von p80286 · begonnen am 27. Mär 2015 · letzter Beitrag vom 28. Mär 2015
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.325 Beiträge
 
Delphi 7 Personal
 
#1

Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 13:30
Delphi-Version: 7
Hallo zusammen,
es ist Freitag und vllt. Zeit für eine Frage neben dem täglichen Stress.
In der letzten Woche bin ich über einen der nicht auszurottenden Fehler gestoßen, eine Vis. Komponente als Datenspeicher mißbrauchen. Und zwar war folgendes:

Delphi-Quellcode:
procedure procc(const l1:tstrings);
var
  ll : tstrings;
begin
  ll:=tstringlist.Create;
  {fülle ll}
  for i:=0 to ll.count-1 do
    if pos('irgendwas',ll[i])>0 then l1.add(ll[i]); {!BP!}
  ll.free;
end;
Ist natürlich nicht der Originalcode, aber es reicht.

Irgendwo im programm gab es dann ein procc(memo1.lines); und ein for i:=0 to l2.count-1 do .. wobei l2 natürlich auch einen Bezug zu Memo1.Lines hat. Hier waren die Ergebnisse nun überhaupt nicht so wie ich es erwartet hatte, mit ein wenig Debuggerbenutzung bin ich dann auf folgendes gestoßen:

nach BP habe ich folgende Dateninhalte:

ll[0] = 'ganz schön langer string mehr als 255 Zeichen'
ll[1] = 'ganz schön langer string1 mehr als 255 Zeichen'
ll.Text = 'ganz schön langer string mehr als 255 Zeichen'x0Dx0A'ganz schön langer string1 mehr als 255 Zeichen'x0Dx0A

l1.Text = 'ganz schön langer string mehr als 255 Zeichen'x0Dx0A'ganz schön langer string1 mehr als 255 Zeichen'x0Dx0A
l1[0] = 'ganz schön langer'
l1[1] = 'string mit mehr als'
l1[2] = '255 Zeichen'
l1[3] = 'ganz schön langer' ... usw

Klar ist mir daß der "Zeilenumbruch" der Darstellung des TMemo geschuldet ist, doch müßte es doch dann korrekter Weise auch in .Text zu finden sein:
Code:
'ganz schön langer'x0Dx0A'string mit mehr als'x0Dx0A'255 Zeichen'
und eben das ist nicht der Fall.

habt Ihr dafür eine schlüssige Erklärung?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 13:35
Nur TStringList kann innerhalb eines "Strings" Zeilenumbrüche verwalten, aber nur solange man die Strings dort drin belässt.
> Text, SaveTo... usw. lössen das auf

Grundsätzlich ist es also nicht möglich, außer du kodierst dir "diese" Zeilenumbrücke in etwas anderes (z.B. StringReplase in '<br>' oder sonstwas)

Anstonsten sollte man bei Zeilenlängen ab 255 1024 oder 4048 aufpassen, da einige Editoren damit nicht klar kommen. (z.B. der Codeeditor im Delphi ab 4047).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (27. Mär 2015 um 13:37 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#3

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 14:00
Delphi-Quellcode:
procedure procc(const l1:tstrings);
var
  ll : tstrings;
begin
  ll:=tstringlist.Create;
  {fülle ll}
  for i:=0 to ll.count-1 do
    if pos('irgendwas',ll[i])>0 then l1.add(ll[i]); {!BP!}
  ll.free;
end;
Ist natürlich nicht der Originalcode, aber es reicht.
Wenn schon nicht OriginalCode, dann doch bitte einen Code, der dem originalen entsprechen könnte.

Deine übergebene Strings (Memo.Lines) im Parameter l1 wird in dieser Prozedure niemals irgendetwas hinzugefügt werden, da die For-Schleife niemals durchlaufen wird.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.824 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 14:12
Deine übergebene Strings (Memo.Lines) im Parameter l1 wird in dieser Prozedure niemals irgendetwas hinzugefügt werden, da die For-Schleife niemals durchlaufen wird.
Jetzt könnte man raten, was
Zitat:
{fülle ll}
wohl zu bedeuten hat
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#5

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 14:22
Jetzt könnte man raten, was
Zitat:
{fülle ll}
wohl zu bedeuten hat
Wir wollen ja ein Problem lösen und nicht raten, wie sein PseudoCode aussehen SOLLTE.

Da steht {fülle ll} aber seine Anweisungen danach sagen "Füge zu l1 etwas hinzu" und zwar aus ll.

Ja was will er denn jetzt wirklich?
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.824 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 14:53
ll wird lokal erzeugt und irgendwie (interessiert hier auch nicht wirklich, wie genau) befüllt, anschließend zeilenweise durchlaufen und nach bestimmten Kriterien wird die aktuelle Zeile der übergebenen Liste hinzugefügt. Ich verstehe gar nicht, wieso Du nun hier die Welle machst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#7

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 15:12
Ich verstehe gar nicht, wieso Du nun hier die Welle machst.
Ich mache ja keine Welle, sondern will nur EINDEUTIG verstehen, was er tun möchte.

Den Kommentar hast Du so verstanden, dass dort ll befüllt wird. Aslo statt des Kommentars die Füllanweisung steht.

Ich jedoch war mir nicht sicher, denn der Kommentar kann auch aussagen, dass jetzt das Befüllen ll in der For-Schleife stattfinden soll. Es könnte ja ein verbleibendes Kommentarreststück aus dem OriginalCode sein.

Und dann wäre schon der Code falsch.

Und wenn für Dich alles so einleuchtend ist, dann hätte er auch eine globale Variable i.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
26.824 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 15:19
Ich kenne K-H nun schon lange genug, um zu wissen, dass er so blöd nicht ist. Einerseits wird immer darauf gepocht, nur den relevanten Code zu posten, andererseits wird sich dann darüber echauffiert, wenn man ihn entsprechend eindampft. Aber gut, wenn das hier wieder so ein 40-Seiten-Thread werden soll, weil man sich an Niggeligkeiten hochzieht, dann bitteschön, ich bin hiermit raus, zumal himitsu ja wohl den entscheidenden Hinweis bereits gegeben hat.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 15:28
Ach ja, nur um nochmal den Grund zu erklären, warum das nicht so geht, mit Zeilenumbrüchen in Zeilen.
  • TMemoStrings (die Komponente in TMemo.Lines) ist ein Wrapper auf die Zeilen des Memos
  • eine Zeile ist eine Zeile
  • eine Zeile mit Zeilenumbrüchen drin ist mehrere Zeilen
  • TStringList dagegen verwaltet jede "Zeile" als einen eigenen "String" und da kann alles rein, was es so gibt, ohne daß es auswirkungen auf Nachbar-Strings hat, jedenfalls solange man die Strings als String belässt und es nicht zwischenzeitlich zusammengemanscht als "gemeinsamen" Text behandelt.


[edit]
Noch ein Post hat Platz, bis die Seite voll ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#10

AW: Innere Struktur von TStrings / TMemo

  Alt 27. Mär 2015, 20:11
Wir füllen ja sie Stringliste mit der Funktion Add.

Diese hängt offensichtlich den WagenrücklaufUndZeilenvorschub x0d0a automatisch an. Nicht das Tmemo ist dafür zuständig, sondern das TStringlist Objekt.
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf