Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem beim Hinzufügen zu einer TList
Oliver Marx - Mo 22.08.11 23:22
Titel: Problem beim Hinzufügen zu einer TList
Hi,
ich bin momentan dabei ein Tool zu schreiben, welches mir aktuelle Daten zu einem Spiel anzeigt. Dazu lese ich die Daten aus einer HTML-Datei aus und speicher die Daten in einer dazu definierten Klasse TTicker. Um Listen mit verschiedenen Elementtypen zu nutzen, hab ich mir eine Klasse TListe mit generics geschrieben. Wenn ich allerdings ein Element hinzufügen möchte, erhalte ich immer die Exception:
Zugriffsverletzung bei Adresse ...
Allerdings leide ich anscheinend an einer vorrübergehenden Blindheit, denn irgendwie finde ich nicht den Fehler.
Als ich einmal ein ShowMessage() eingefügt hatte, funktionierte es plötzlich. :shock: :gruebel:
Daher hoffe ich, dass jemand von euch mir helfen kann, den Fehler zu finden. :flehan:
Aber jetzt mal zu einem kleinen Codeausschnitt mit dem Wichtigsten. Den ganzen Quellcode gibt es im Anhang. Ich habe dort auch die problematische Stelle markiert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| type TListe<ListType> = class type PListType = ^ListType; private mListe: TList; function Get(Index: Integer): ListType; procedure Put(Index: Integer; Item: ListType); public constructor Create(); destructor Free(); procedure Add(t: ListType); procedure Delete(id: integer); function Count(): integer; property Items[Index: Integer]: ListType read Get write Put; default; end;
procedure TListe<ListType>.Add(t: ListType); var knoten: PListType; begin new(knoten); knoten^:=t; mListe.Add(knoten); end;
constructor TListe<ListType>.Create; begin inherited Create; mListe:=TList.Create; end;
constructor TTicker.Create; begin inherited Create; mZeit:=''; mZuschauer:=''; mSchiedsrichter:=''; mHeimMannschaft:=''; mAuswaertsMannschaft:=''; mHeimAufstellung:=TListe<TSpieler>.Create(); mAuswaertsAufstellung:=TListe<TSpieler>.Create(); end;
procedure TTicker.Update(); var Spieler: TSpieler; begin ... mHeimAufstellung.Add(Spieler); ... end; |
Viele Grüße
Oliver Marx
BenBE - Di 23.08.11 01:01
Der Destructor heißt Destroy und nicht Free.
Zudem solltest Du Create virtual und reintroduce machen. Bei Destroy reicht nur Override.
Bergmann89 - Di 23.08.11 02:40
Hey,
wenn du die generics so nutzen kannst, dann sollte doch die Standart-TList auch schon damit arbeiten, oder irre ich mich da? Welche Delphi Version hast du? Wenn die, die in deinem Profil stehen richtig sind, dann kann DelphiXE 100%-tig die generische TList, also musst du's nich selber schreiben.
MfG Bergmann
jaenicke - Di 23.08.11 04:51
Delphi XE kennt standardmäßig zum Beispiel TList<T> und TObjectList<T> für Listen sowie TDictionary<T,K> und TObjectDictionary<T,K> für Zugriffe auf Elemente z.B. über deren Namen. Dafür muss die Unit Generics.Collections eingebunden werden.
Oliver Marx - Di 23.08.11 13:22
Hi,
schon mal vielen Dank an alle, mit der generischen TList scheint es zu funktionieren!
Hab das mit der generischen TList nicht in der Delphi-Hilfe gefunden.
Allerdings frag ich mich immernoch, woran es genau gelegen hat, dass ich die Exception erhalten hatte. Denn der Debugger hat mir angezeigt, dass die Listen korrekt initialisiert wurden. Der Fehler war ja auch teilweise nicht aufgetreten als ich ShowMessage('Blub') einfach mal irgendwo reingeschrieben hatte.
Viele Grüße
Oliver
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!