ObjectList übergibt NIL ? [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

ObjectList übergibt NIL ? [gelöst]

Beitrag von Hartkern »

Hallo,

ich hab folgendes Problem:
Ich erzeuge immo 60 Instanzen vom Object TFeld und lade diese in eine Objectlist um sie später ordentlich verwalten zu können.
Die Objectlist gibt mir auch per Count die korrekte Anzahl der Instanzen von TFeld wieder.
Wenn ich aber per Index aus der Felderliste auf ein Object zugreifen will, übergibt die Liste ein NIL, was dann einen SigSev auslöst.

Hier der Code für TFeld

Code: Alles auswählen

type
 
   { TFeld }
 
   TFeld = class(TObject)
   type TFeldArr = Array[0..5] of TPoint;
   private
     FLand : boolean;
     FWasser : boolean;
     FFluss : boolean;
     FStrasse : boolean;
     FStadt : boolean;
     FWald : boolean;
     FSumpf : boolean;
 
   public
     P0, P1, P2, P3, P4, P5 : Tpoint;
     X0X, X0Y: Integer;
     constructor Create(MyArr:TFeldArr);
     Destructor Free;
     property Land: Boolean read FLand write FLand;
     property Wasser : Boolean read FWasser write FWasser;
     property Fluss : Boolean read FFluss write FFluss;
     property Strasse : Boolean read FStrasse write FStrasse;
     property Stadt : Boolean read FStadt write FStadt;
     property Wald : Boolean read FWald write FWald;
     property Sumpf : Boolean read FSumpf write FSumpf;
   end;
implementation
 
{ TFeld }
 
constructor TFeld.Create(MyArr:TFeldArr);
begin
 
   FLand := True;
   FWasser := False;
   FFluss := False;
   FStrasse := False;
   FStadt := False;
   FWald := False;
   FSumpf := False;
   //Werteübergabe
   P0 := MyArr[0];
   P1 := MyArr[1];
   P2 := MyArr[2];
   P3 := MyArr[3];
   P4 := MyArr[4];
   P5 := MyArr[5];
   X0X := P0.x;
end;
 
destructor TFeld.Free;
begin
 
end; 
Das Laden in die Objectliste

Code: Alles auswählen

Polygon(FHex);
              Feld.Create(FHex);
              TFelderListe.Add(Feld);

Code: Alles auswählen

 
var           
TempFeld : TFeld;
.
.
.
For I:= 0 To TFelderliste.count -1 do
                 begin
                   TempFeld := TFelderliste.Items[I] as TFeld;     //Mit Laufzeitprüfung;  <-----------------------hier gibts nur NIL!!!!!!!!!!
                      begin
                        TestMemo.Lines.Add(IntToStr(i));
                        If TempFeld.Land= True then TestMemo.Lines.Add('Land JA') ;
 
                       end;
                 end;   
ob ich vorher TempFeld create mit einem X beliebigen Array of Tpoint ist egal
Zuletzt geändert von Hartkern am Di 12. Jan 2016, 22:45, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6780
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ObjectList übergibt NIL ?

Beitrag von af0815 »

Hartkern hat geschrieben: Das Laden in die Objectliste

Code: Alles auswählen

Polygon(FHex);
              Feld.Create(FHex);
              TFelderListe.Add(Feld);
IMHO

Code: Alles auswählen

 
  MyFelderListe := TFelderListe.Create;
 
  Polygon(FHex);
  Feld := TFeld.Create(FHex);
  MyFelderliste.Add(Feld);
 
und TFelderListe ist dann immer MyFelderListe.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: ObjectList übergibt NIL ?

Beitrag von Hartkern »

Code: Alles auswählen

  //Felderliste erzeugen
       TFelderliste := TObjectlist.create(true); 
Das hatte ich natürlich unterschlagen hier mit zu posten. Also daran lags nicht. Die Liste wird ja erzeugt.

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: ObjectList übergibt NIL ?

Beitrag von Bitschubser »

Hartkern hat geschrieben:

Code: Alles auswählen

  //Felderliste erzeugen
       TFelderliste := TObjectlist.create(true); 
Das hatte ich natürlich unterschlagen hier mit zu posten. Also daran lags nicht. Die Liste wird ja erzeugt.
Lies die Anwort von Andreas noch mal genau.

Sowas:

Code: Alles auswählen

  Feld.Create(FHex);
ist eigentlich fast immer falsch.

Dass "TFelderliste" bei dir eine Instanz und kein Typ ist kann natürlich keiner wissen - IMHO ist das "T" da vorne ziemlich ungünstig für die Übersicht.

Antworten