Einzelnen Beitrag anzeigen

Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

TObjectList-Object da, aber beim Zugriff Stack-Overflow

  Alt 18. Jan 2016, 14:27
Hi,

ich habe eine TObjectList nach diesem Schema:
Delphi-Quellcode:
type
  TTemperatur=class
  private
    FTemp: Extended;
    FId: string;
    procedure SetId(const Value: string);
    procedure SetTemp(const Value: Extended);
  public
    constructor Create;
    procedure WriteToStream(st: TStream);
    procedure LoadFromStream(st: TStream);
  published
    property Id: string read FId write SetId;
    property Temp: Extended read FTemp write SetTemp;
  end;

type
  TTemperaturList=class(TObjectList)
    function getItem(index: Integer): TTemperatur; virtual;
    procedure setItem(index: Integer; Temperatur: TTemperatur); virtual;
  public
    property Items[index: Integer]: TTemperatur read getItem write setItem; default;
    procedure Insert(index: Integer; Temperatur: TTemperatur); virtual;
    function Add(Temperatur: TTemperatur): Integer; virtual;
    function Remove(Temperatur: TTemperatur): Integer; virtual;
    function IndexOf(Temperatur: TTemperatur): Integer; virtual;
    function First: TTemperatur; virtual;
    function Last: TTemperatur; virtual;
    procedure WriteToStream(st: TStream);
    procedure LoadFromStream(st: TStream);
    function IndexOfId(value: string): Integer; virtual;
  end;

type
  TRaspberry=class
  private
    FName: string;
    FTemp: TTemperaturList;
    FIP: string;
    procedure SetIP(const Value: string);
    procedure SetName(const Value: string);
    procedure SetTemp(const Value: TTemperaturList);
  public
    constructor Create;
    destructor Destroy;
    procedure WriteToStream(st: TStream);
    procedure LoadFromStream(st: TStream);
  published
    property Name: string read FName write SetName;
    property IP: string read FIP write SetIP;
    property Temp: TTemperaturList read FTemp write SetTemp;
  end;

type
  TRaspberryList=class(TObjectList)
    function getItem(index: Integer): TRaspberry; virtual;
    procedure setItem(index: Integer; Raspberry: TRaspberry); virtual;
  public
    property Items[index: Integer]: TRaspberry read getItem write setItem; default;
    procedure Insert(index: Integer; Raspberry: TRaspberry); virtual;
    function Add(Raspberry: TRaspberry): Integer; virtual;
    function Remove(Raspberry: TRaspberry): Integer; virtual;
    function IndexOf(Raspberry: TRaspberry): Integer; virtual;
    function First: TRaspberry; virtual;
    function Last: TRaspberry; virtual;
    procedure WriteToFile(Filename: string);
    procedure LoadFromFile(Filename: string);
    function IndexOfIP(value: string): Integer; virtual;
  end;
Explizit geht es um die Funktion:
Delphi-Quellcode:
function TTemperaturList.IndexOfId(value: string): Integer;
var
  I: Integer;
begin
  Result:=-1;
  for I := 0 to self.Count-1 do
    if self[I].Id=value then
    begin
      Result:=I;
      Exit;
    end;
end;
der TTemperaturList.

Jetzt sollen mit folgender Prozedur TTemperatur-Items hinzugefügt, bzw. wenn sie schon vorhanden sind, geändert werden:
Delphi-Quellcode:
procedure TfrmMain.btn1Click(Sender: TObject);
var
  r, t: integer;
  Raspberry: TRaspberry;
  Temp: TTemperatur;
  FIP, FId: string;
  FTemperatur: Extended;
begin
  FIP:='192.168.0.110';
  FId:='28-000444e3ba3ff';
  FTemperatur:=19.937;
  r:=FRaspberrys.IndexOfIP(FIP);
  if r>-1 then
  begin
    Raspberry:=FRaspberrys[r];
  end else begin
    Raspberry:=TRaspberry.Create;
    FRaspberrys.Add(Raspberry);
  end;
  if Raspberry<>nil then
  begin
    t:=Raspberry.Temp.IndexOfId(FId); //<---Hier tritt beim zweiten durchlauf dann die Exception auf.
    if t>-1 then
    begin
      Temp:=Raspberry.Temp[t];
    end else begin
      Temp:=TTemperatur.Create;
      Raspberry.Temp.Add(Temp);
    end;
    if Temp<>nil then
    begin
      Temp.Id:=FId;
      Temp.Temp:=FTemperatur;
    end;
  end;
end;
Ein TRaspberry wird manuell erzeugt, ist also vorhanden.

Beim TTemperaturList.IndexOfId(value: string) kommt es beim zweiten Aufruf der btn1Click zu einem Stackoverflow. Klar beim ersten mal wird das neue Objekt TTemperatur angelegt, weil eben noch keines vorhanden ist.
Beim zweiten Mal müsste er es ja finden, da die Id die gleich ist. Komischerweise wird in der IndexOfId als Count auch 1 ausgegeben, aber auf das Object kann ich nicht zugreifen. Also irgendwo hab ich einen Denkfehler, aber ich finde ich einfach nicht.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat