Avatar billede lanstorp Nybegynder
29. august 2002 - 08:54 Der er 6 kommentarer og
2 løsninger

StringList.Free - crash

Når jeg vælger en 250kb fil er alt ok. Men når der vælges en 5mb stor fil, crasher følgende kode ved StringList.Free men en fejl: 'Invalid pointer operation'. Nogen forklaring. Hvis jeg helt fjerner StringList.Free funker koden fint, men er det ikke snavs.

procedure TForm1.Button1Click(Sender: TObject);
var
  StringList: TStringList;
begin
  StringList := TStringList.Create;

  OpenDialog1.Filter := 'Text files (*.txt)|*.TXT';
  if OpenDialog1.Execute then
  begin
    StringList.LoadFromFile(OpenDialog1.FileName);
    //StringListen kværnes ...
 
  StringList.Free;

end;
Avatar billede stoney Nybegynder
29. august 2002 - 09:19 #1
Jeg har lige prøvet din kode på en 72 MB fil.
Det virker uden problemer.
Jeg bruger D6.

Stoney
Avatar billede lanstorp Nybegynder
29. august 2002 - 09:33 #2
Koden som den står her funker også for mig i D6, jeg bruger også i kværnen:
StringList.Clear, StringList.Add, StringList.Sorted og StringList.Count
Et eller andet giver en 'Invalid pointer operation' når StringList.Free nåes i koden.
Avatar billede stoney Nybegynder
29. august 2002 - 09:57 #3
Du husker at bruge stringlist.count - 1 ????

Stoney
Avatar billede lanstorp Nybegynder
29. august 2002 - 11:20 #4
stringlist.count - 1, skal vel kun bruges når der loopes igennem stringen. Hvis stringen skal over i et array er det vel SetLength(EtArray, StringList.Count); Fejlen ligger måske i at jeg prøver at genbruge stringListen med clear. Grubler lidt mere ...
Avatar billede dkn Nybegynder
29. august 2002 - 13:31 #5
procedure TForm1.Button1Click(Sender: TObject);
var
  StringList: TStringList;
begin
  StringList := TStringList.Create;
try
  OpenDialog1.Filter := 'Text files (*.txt)|*.TXT';

  if OpenDialog1.Execute then
  begin
    StringList.LoadFromFile(OpenDialog1.FileName);
    //StringListen kværnes ...
  end;

except
end;
StringList.Free;
end;

jeg ved ikke om det hjælper, men jeg vil tro at problmmet måske ligger i at computeren måske arbejder forlangsom. Altså er stringlisten ved at blive fyldt da den for besked på at den ikke skal existere længere.
Avatar billede hermandsen Juniormester
29. august 2002 - 13:33 #6
>>lanstorp
Hvis alt slår fejl, så læs brug TextFile-variablen...

var
  F: TextFile;
  S: String;
begin
  AssignFile('MinFil.txt');
  Reset(F);
  while not Eof(F) do
  begin
    Readln(F, S);
    //Gør noget ved din streng...
  end;
  CloseFile(F);
end;
Avatar billede lanstorp Nybegynder
29. august 2002 - 13:53 #7
>>dkn
I stedet for:

except
end;
StringList.Free;
end;

så funker linierne,
except
StringList.Free;
end;  //try
end;

Det funker i hvertfald nu hvor StringList springes over med try.

Sker der forøvrigt noget snavs ved ikke at anvende StringList.Free

Takker alle :)
Avatar billede hermandsen Juniormester
29. august 2002 - 14:27 #8
>>lanstorp
Om der sker noget ved ikke at Free'e din StringList... Tjaaa... Hvis du ikke gør det, så frigiver du bare ikke hukommelsen til andre programmer! That's all! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester