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.