Autor Beitrag
Oliver Marx
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 80
Erhaltene Danke: 18

Win 7 Prof.
Delphi XE Prof.
BeitragVerfasst: Di 23.08.11 00:22 
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.

ausblenden volle Höhe 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
Einloggen, um Attachments anzusehen!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 23.08.11 02:01 
Der Destructor heißt Destroy und nicht Free.

Zudem solltest Du Create virtual und reintroduce machen. Bei Destroy reicht nur Override.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 23.08.11 03: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

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^

Für diesen Beitrag haben gedankt: Oliver Marx
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 23.08.11 05: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.

Für diesen Beitrag haben gedankt: Oliver Marx
Oliver Marx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 80
Erhaltene Danke: 18

Win 7 Prof.
Delphi XE Prof.
BeitragVerfasst: Di 23.08.11 14: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