![]() |
Re: Eigene Klasse
Okay, nächste Frage:
Wenn ich das Array größer als 2000 Felder mache, dann bekomme ich sofort eine Zugriffsverletzung. Wenn ich unter 2000 Feldern bleibe, bekomme ich eine Zugriffsverletzung beim Schließen. WTF!?
Delphi-Quellcode:
procedure Tmp3list.newdirlist(pfad : String);
var fertigtemp : TStringlist; x : Integer; begin x := 0 ; fertigtemp := TStringlist.Create; { ... Befüllen der fertigtemp } setlength(items, fertigtemp.count); for x := 0 to fertigtemp.count-1 do begin items[x].pfad := fertigtemp.Strings[x]; items[x].listid := pfad; end; |
Re: Eigene Klasse
Was genau ist TDSatz? Ein Record? Eine Klasse? Das wäre recht interessant.
|
Re: Eigene Klasse
Für 2000+ Einträge empfehele ich dir eine ObjectList bzw. ne Collection...
Zu deinem Problem, zeig mal den Constructor und den Destructor von deiner Klasse... wo gibtst du den Speicher wieder frei bzw. reservierst ihn??? Bye |
Re: Eigene Klasse
hm, quasi gar nicht, arbeite das erste mal mit Klassen & dyn. Arrays
Delphi-Quellcode:
type
TDsatz = RECORD id, playcount : Integer; pfad: String[255]; Interpret, songname, listid : String[80]; END; Tmp3list = class private items: Array of TDsatz; function GetCount: Integer; public procedure newdirlist(pfad : String); procedure addlist(neu : Tmp3list); procedure listdircontent(Verzeichnis :string; var listenname:TStringlist); property count: Integer read GetCount; end; |
Re: Eigene Klasse
Zitat:
|
Re: AV bei array größer 2000
Hi jaschu,
auch wenn der von dir gezeigte Code etwas unorthodox ist - den von dir beschriebenen Fehler kann er eigentlich nicht auslösen. Nur mal ein Gedankenspiel: dein record hat eine Größe von 508 Bytes. Bei 2000 Einträgen im array schrammst du am upper stack limit von 1 MB vorbei. Vielleicht machst du ja irgendwo schlimme Sachen und wir sehen es nicht? Grüße vom marabu |
Re: AV bei array größer 2000
Hm, hier mal die komplette Unit:
Delphi-Quellcode:
unit USource;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TDsatz = RECORD id, playcount : Integer; pfad: String[255]; Interpret, songname, listid : String[80]; END; Tmp3list = class private items: Array of TDsatz; function GetCount: Integer; public procedure newdirlist(pfad : String); procedure addlist(neu : Tmp3list); procedure listdircontent(Verzeichnis :string; var listenname:TStringlist); property count: Integer read GetCount; end; var usertime, guesstime, maxpoints : Integer; sollid3tag : Boolean; kompletteliste : tmp3list; implementation procedure Tmp3list.newdirlist(pfad : String); var liste,tempdirlist, fertigtemp : TStringlist; akt : String; x : Integer; begin x := 0 ; fertigtemp := TStringlist.Create; liste := TStringlist.Create; listdircontent(pfad, liste); while liste.Count > 0 do begin akt := liste.strings[x]; if extractfileext(akt) = '.mp3' then fertigtemp.Add(akt) else if directoryexists(akt) then begin tempdirlist := TStringlist.Create; listdircontent(akt, tempdirlist); liste.AddStrings(tempdirlist); end; liste.delete(x); end; setlength(items, fertigtemp.count); for x := 0 to fertigtemp.count-1 do begin items[x].pfad := fertigtemp.Strings[x]; items[x].listid := pfad; end; end; function tmp3list.getcount : Integer; begin result := length(items); end; procedure Tmp3list.listdircontent(Verzeichnis :string; var listenname:TStringlist); var SR: TSearchRec; begin if Verzeichnis[length(Verzeichnis)]<>'\' then Verzeichnis:=Verzeichnis+'\'; if FindFirst(Verzeichnis+'*.*',$3F,SR)=0 then begin repeat if (SR.Name<>'.') and (SR.Name<>'..') then listenname.Add(Verzeichnis+SR.Name); until FindNext(SR)<>0; FindClose(SR); end; end; procedure tmp3list.addlist(neu : Tmp3list); var tmp, tmp2,x : Integer; begin x := 0; tmp := getcount; tmp2 := neu.count; setlength(items, tmp + tmp2); for tmp := tmp to tmp + tmp2 do begin items[tmp] := neu.items[x]; inc(x); end; end; end. |
Re: AV bei array größer 2000
Hallo,
nur mal so als kleiner Tip. Wenn du ein Objekt erzeugst, dann solltest du es auch wieder freigeben, wenn du es nicht mehr brauchst. Hab ich bei deinen StringListen gesehen die Du zum Beispiel erzeugst. Mit freundlichen Grüßen Christian18 |
Re: AV bei array größer 2000
Ja, das hatte ich vergessen - es löst nur leider net mein Problem =/
Trotzdem danke für den Hinweis :zwinker: |
Re: AV bei array größer 2000
Weiß keiner weiter? =/
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz