2016-09-16 3 views
-1
TPoint = Class 
     private 
     FX: double; 
     FY: double; 
     public 
     constructor Create(X,Y:double); 
     destructor Destroy; override; 
     property X: double read FX write FX; 
     property Y: double read FY write FY; 
     end; 

     TLine= Class(TObjectList) 
     private 
     function GetItem(Index: Integer): TPoint; 
     procedure SetItem(Index: Integer; const Value: TPoint); 
     public 
     constructor Create; 
     destructor Destroy; override; 
     procedure Add(APoint:TPoint); 
     property Items[Index: Integer]: TPoint read GetItem write SetItem; default; 
     end; 

     TLineStorage= Class(TObjectList) 
     private 
     function GetItem(Index: Integer): TLine; 
     procedure SetItem(Index: Integer; const Value: TLine); 
     public 
     constructor Create; 
     destructor Destroy; override; 
     procedure Add(ALinie:TLine); 
     property Items[Index: Integer]: TLine read GetItem write SetItem; default; 
     end; 

     TStorage= Class(TObjectList) 
     private 
     function GetItem(Index: Integer): TLineStorage; 
     procedure SetItem(Index: Integer; const Value: TLineStorage); 
     public 
     constructor Create; 
     destructor Destroy; override; 
     procedure Add(ALinieStorage:TLineStorage); 
     property Items[Index: Integer]: TLineStorage read GetItem write SetItem; default; 
     end; 

     TMeasuring= Class 
     private 
     FLine: TLine; 
     FLineStorage: TLineStorage; 
     FStorage: TStorage; 
     public 
     constructor Create; 
     destructor Destroy; override; 
     procedure DoMeasuring; 
     end; 

{ TMeasuring } 

constructor TMeasuring.Create; 
begin 
    inherited; 
    FLineStorage:= TLineStorage.Create; 
    FLineStorage.OwnsObjects:= true; 
    FLine:= TLine.Create; 
    FLine.OwnsObjects:= true; 
    FStorage:= TStorage.Create; 
    FStorage.OwnsObjects:= true; 
end; 

destructor TMeasuring.Destroy; 
begin 
    FLineStorage.Free; 
    FLine.Free; 
    FStorage.Free; 
    inherited; 
end; 

procedure TMeasuring.DoMeasuring; 
var i,j: integer; X,Y: double; 
begin 
    for j:= 0 to 2 do // Lines 
    begin 
    for i:= 0 to 5 do // Points 
    begin 
     X:= 1+ random(100); 
     Y:= 1+ random(100); 
     FLine.Add(TPoint.Create(X,Y)); // 1... X Points 
    end; 
    FLineStorage.Add(FLine); // 3 x Linie 
    FLine.Clear; // for new measuring !!! if not-> it works !!! 
    end; 

    FStorage.Add(FLineStorage); // save 

    for i:= 0 to FStorage.Count-1 do 
    begin 
    X:= FStorage.Items[i].Items[i].Items[i].X; // it doesn't work... 
    ShowMessage(FloatToStr(X)); 
    end; 

end; 

Я работаю с Delphi 7, и я стараюсь хранить и отображать результаты измерения. Но если я попытаюсь прочитать точки X/Y, я получаю исключение диапазона. Если я прокомментирую FLine.Clear;, он работает. Как вы обошли эту проблему?Сохранить и прочитать Объекты в/из TObjectList

Кроме того, программа выводит сообщение, относящееся к хранилищу.

Все GetItem- функции выглядит следующим образом:

function TLine.GetItem(Index: Integer): TPoint; 
begin 
    result:= TPoint(inherited Items[Index]); 
end; 

Спасибо заранее.

+0

Это выглядит очень тяжелым. Почему вы не используете простую запись для своих координат? –

+0

@DavidHeffernan Спасибо за ваш совет. Я подумал и изменил класс TPoint на запись. – genakust

ответ

1

Вы должны создать свой FLine в DoMeasuring

procedure TMeasuring.DoMeasuring; 
var i,j: integer; X,Y: double; 
    FLine : TLine; 
begin 
    for j:= 0 to 2 do // Lines 
    begin 
    FLine := TLine.create; 
    for i:= 0 to 5 do // Points 
    begin 
     X:= 1+ random(100); 
     Y:= 1+ random(100); 
     FLine.Add(TPoint.Create(X,Y)); // 1... X Points 
    end; 
    FLineStorage.Add(FLine); // 3 x Linie 
    //FLine.Clear; // for new measuring !!! if not-> it works !!! 
    end; 

    FStorage.Add(FLineStorage); // save 

    for i:= 0 to FStorage.Count-1 do 
    begin 
    X:= FStorage.Items[i].Items[i].Items[i].X; // it doesn't work... 
    ShowMessage(FloatToStr(X)); 
    end; 

end; 
+0

Благодарим вас за ответ. Оно работает! Но я получаю сообщение StackOverflow. Где мне нужно позвонить «FLine.Free»? – genakust

+0

Линия будет освобождена при уничтожении FlineStorage. Поскольку TobjectList «владеет» данными – Fritzw