Frage zu Stringlisten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Frage zu Stringlisten

Beitrag von Aliobaba »

Hallo,

bitte erlaubt mir eine kurze Frage:
Ich möchte einen Text "ein_Text.txt" in eine Stringlist einlesen.
Wenn ich das mit einem "Memo" mache, dann funktioniert dies, mache ich das mit einer StringList, dann kommt diese Fehlermeldung:

"Projekt MyMemoryDB hat Exception-Klasse »External: SIGSEGV« ausgelöst."

Ich verstehe das nicht, denn ein "Memo" arbeitet intern doch auch mit einer Stringlist??

Dabei ist es egal ob ich die Stringlist so:
SL__neu : TStringlist ;
oder so:
SL__neu : TStrings;
initiiere.
Die Funktion "DateiInStringEinlesen" arbeitet mit einem Stream.
"Mm_Steps_Hinweise" ist eine Memo.

// funktioniert:
Mm_Steps_Hinweise.Lines.LoadFromFile('/home/ein_Pfad/ein_Text.txt'); // geht
// funktioniert:
Mm_Steps_Hinweise.Text := DateiInStringEinlesen('/home/ein_Pfad/ein_Text.txt'); // geht!!
// funktioniert nicht:
SL__neu.LoadFromFile('/home/ein_Pfad/ein_Text.txt'); // geht nicht
// funktioniert nicht:
SL__neu.Text := DateiInStringEinlesen('/home/ein_Pfad/ein_Text.txt'); // geht nicht!!
und wenn man dann so weiter macht, dann funktionieren auch die beiden letzten Code-Zeilen nicht mehr:
var
sss : string;
Mm_Steps_Hinweise.Lines.LoadFromFile('/home/ein_Pfad/ein_Text.txt'); // geht
// funktioniert nicht:
SL__neu.text := Mm_Steps_Hinweise.Text;
Mm_Steps_Hinweise.Text := DateiInStringEinlesen('/home/ein_Pfad/ein_Text.txt'); // geht!!
// funktioniert nicht:
SL__neu.text := Mm_Steps_Hinweise.Text;
In den letzten beiden Code-Zeilen kommt die Fehlermeldung dann immer in dieser Zeile:
SL__neu.text := Mm_Steps_Hinweise.Text;

Gruß und schönes Wochenende!
Alfons
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Frage zu Stringlisten

Beitrag von six1 »

Also so ganz blicke ich nicht durch deine Code Zeilen...

Hast du das Objekt erstellt?

Code: Alles auswählen

var
 MyStringList:TStringlist;
begin
 MyStringList:=TStringlist.create;
 MyStringList.LoadfromFile([dein Pfad]);
...
 MyStringList.free;
end;
Dies wäre der Code, eine Stringlist zu erstellen und wieder frei zu geben.
Gruß, Michael

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Frage zu Stringlisten

Beitrag von Aliobaba »

... ja, diese Zeile funktioniert ja:
Mm_Steps_Hinweise.Text := DateiInStringEinlesen('/home/ein_Pfad/ein_Text.txt'); // geht!!
Ich habe nicht den ganzen Code kopiert, der ist ziemlich umfangreich.

Mir geht es nur um das unterschiedliche Verhalten einer Stringlist, wie sie in einem "Memo" ja arbeitet und einer selbst erstellten Stringliste, deshalb diese Frage:
Ich verstehe das nicht, denn ein "Memo" arbeitet intern doch auch mit einer Stringlist??
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Frage zu Stringlisten

Beitrag von charlytango »

möglicherweise gibt es da ein Verständnisproblem.

Wenn du ein Memo auf ein Formular klebst, dann kümmert sich Lazarus/FPC um das Erstellen, Initialisieren und ggfs auch das Zerstören des (im echten Code dann erzeugten) Objektes. Deswegen kannst du

Code: Alles auswählen

Mm_Steps_Hinweise.Lines.LoadFromFile('/home/ein_Pfad/ein_Text.txt'); // geht
das memo direkt ansprechen weil sich Lazarus drum kümmert.
Lazarus ist ja "nur" quasi das grafische Hilfskonstrukt um durch "Zeichnen" Code zu erzeugen.

Anders ist das mit einer TStringlist die du in deinem Code verwenden möchtest.
Davon "weiß" Lazarus ja nichts (weil nicht grafisch erstellt sondern direkt in den Code geschrieben).
Deswegen musst du dich um das Erstellen/Create (nur nachdem ein Objekt erstellt wurde kann man es benutzen) und dessen Zerstörung (Freigabe von benutztem Speicher) selber kümmern.

Nur weil du eine Stringlist definierst,

Code: Alles auswählen

procedure XY;
var
   SL__neu : TStringlist ;
begin
   SL__neu.LoadFromFile('/home/ein_Pfad/ein_Text.txt'); // geht nicht
end;
kannst du sei noch nicht verwenden, weil sie zur Laufzeit dann nicht existiert

siehe den Post von six1
oder auch hier https://programmindex.de/stringlisten/

Das würde funktionieren:

Code: Alles auswählen

procedure XY;
var
   SL__neu : TStringlist ;
begin
   SL__neu := TStringlist.Create;  //ab hier existert das Stringlistenobjekt zur Laufzeit
   try
      SL__neu.LoadFromFile('/home/ein_Pfad/ein_Text.txt'); // geht jetzt, sofern die Datei existiert!!!
   finally
      SL__neu.Free;
   end;   
end;
Zuletzt geändert von charlytango am Fr 26. Mär 2021, 10:41, insgesamt 1-mal geändert.

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Frage zu Stringlisten

Beitrag von Aliobaba »

Hallo,

bemüht Euch bitte erstmal nicht weiter, Ich muss da irgendwo anders einen Fehler haben, denn wenn ich diese Prozedur verwende, funktioniert das Einlesen in eine Stringlist problemlos.
Sorry! Trotzdem Danke!

Alfons

Code: Alles auswählen

procedure TFKey2.Bt_LoadfromfileClick(Sender: TObject);
var
  TempList: TStringList;
  sss : string;
  n : integer;
begin
  sss := '/home/der_pfad/Dance_ag_20210324_2331.tsv';
  TempList := TStringList.Create;
  TempList.LoadFromFile(sss);
  Templist.Sort;
  for n := 0 to ( Templist.Count - 1 )  do
  begin
     Showmessage(Templist[n]);
  end;
  Templist.Free;
end;           
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Frage zu Stringlisten

Beitrag von Aliobaba »

... und nun weiß ich auch, wie das passiert ist:
Ich habe zum Testen dieser Code-Zeilen, die am Ende einer längeren Prozedur sind, einfach vorübergehend ein Sprunglabel gesetzt, damit nicht die ganze Prozedur durchlaufen wird.
Und dabei habe ich die diesen Befehl übersprungen und nicht ausgeführt:
" SL__neu := TStringList.Create; "

Tja! Wieder was gelernt!!
Und danke, dass ihr bereit gewesen seid, Eure Gedanken dafür zu verschwenden.

Gruß
Alfons
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten