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