Autor Beitrag
badstuberl
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 07.04.11 12:18 
hi beisammen. ich fülle aus einer textdatei mit key-value-paaren. ein dictionary<string, tstringlist>.

das füllen wird in einer prozedur erledigt. das dictionary ist eine globale variable. wenn ich über die values innerhalb der füll-prozedur iteriere, dann sehe ich meine values:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
        for ValueName in dict.Values do
        begin
          for i := 0 to Valuename.Count - 1 do
        write('Values are : '+ Valuename[i]);
        writeln;
        end;


wenn ich dies jedoch nach "begin" mache (also im main-teil), sind meine values futsch. was mache ich da falsch?
der code in main sieht so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
begin
  dict := TDictionary<String, TStringlist>.Create;
  parsefileandfilldict;
  for ValueName in dict.Values do
        begin
          for i := 0 to Valuename.Count - 1 do
        write('Values are : '+ Valuename[i]);
        writeln;
        end;
  .
  .
  .
end.


Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 07.04.11 12:43 
Hallo und :welcome:

Das sieht so korrekt aus. Ich glaube ich ahne aber was du machst:
Wahrscheinlich gibst du einfach die Stringlisten wieder frei, die du in das Dictionary packst...

Ansonsten wäre es sinnvoller ein komplettes kleines Demoprogramm zu posten.
badstuberl Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 07.04.11 13:26 
ja die gebe ich wieder frei :) also die stringlisten sind lokal in der füllprozedur. länger müssen sie ja nicht existieren, oder? die werden am ende der prozedur natürlich wieder ge-freet. oder ist das falsch?

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
if AnsiStartsStr('name', splitarray[0]) then
      begin
        split(' ', splitarray[0], subsplit1);
        splitarray[0]:=subsplit1[1];
        split(',', splitarray[1], subsplit2);
        dict.Add(splitarray[0], subsplit2);

...
splitarray.Free;
subsplit1.Free;
subsplit2.Free;
end;


splitarray und subsplit[1,2] sind lokale stringlisten, die am ende der prozedur wieder geleert werden. dort kann ich mir die values auch anzeigen lassen. gehen denn die werte in dem dictionary nachher wieder flöten? die keys existieren ja noch... ich dachte, ich fülle das dict (egal wo, da global) und kann dann immer darauf zugreifen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 07.04.11 14:34 
user profile iconbadstuberl hat folgendes geschrieben Zum zitierten Posting springen:
ja die gebe ich wieder frei :) also die stringlisten sind lokal in der füllprozedur. länger müssen sie ja nicht existieren, oder?
Wenn du danach die Werte nicht mehr brauchst, müssen sie danach nicht mehr existieren. Hier greifst du danach aber über das Dictionary auf die TStringList-Objekte zu, also brauchst du die ja noch...

Heißt: Die darfst du erst freigeben, wenn du den entsprechenden Wert im Dictionary entfernst bzw. dieses freigibst.
badstuberl Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 07.04.11 15:12 
ah, danke! dann werd ich den speicher später freigeben!