2017-01-27 4 views
0

TIstruzioneという簡単なクラスを作成しました。私は実行時に4つのオブジェクトを作成し、それらを必要に応じてアクセスできるように配列に格納する必要があります。オブジェクトのDelphiコレクション

FList: TObjectList<TIstruzione>; 

私は、これはクラスに対するしっくり来るの汎用コンテナであることをDelphiのドキュメントで見てきたので、私はTForm1のパブリックセクションでこれを作成しました。それから私は、このように彼の生涯を管理するつもりです:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
FList.Create; 
FList.OwnsObjects := true; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
FList.Destroy; 
end; 

OwnsObjectは、オブジェクトがリストによって所有されていると私はリストを解放したときに、内部のオブジェクトも同様に解放されることが保証されます。私は正しいですか?あなたがここにコードを見れば

、私はリストを移入しようとしています:

procedure TForm1.Button1Click(Sender: TObject); 
var a: TIstruzione; 
begin 

a := TIstruzione.Create; 
try 
    a.tipo := Add; 
    a.rdest := 2; 
    a.dato1 := 7; 
    a.dato2 := 5; 
    FList.Add(a); 
finally 
    a.Free; 
end; 

    a := TIstruzione.Create; 
try 
    a.tipo := Load; 
    a.rdest := 1; 
    a.dato1 := 2; 
    a.dato2 := -1; 
    FList.Add(a); 
finally 
    a.Free; 
end; 

end; 

プログラムが起動するとき、私はエラーが発生しています。アクセス違反です。何か案が?ただ、完全であることを、クラスが単純にこのさ:

type 

TTipo = (RISC_Add, RISC_AddI, RISC_Sub, RISC_SubI, RISC_Load, RISC_Store); 
TPip = (MIPS_pipeline, PPC_pipeline); 

type 
TIstruzione = class 
    public 
    tipo: TTipo; 
    rdest: integer; 
    dato1: integer; 
    dato2: integer; 
end; 
+3

'TForm1.Button1Click'で' a'を解放するべきではないと思います。 –

+0

なぜですか?値はFListに保存されてから解放されます。 –

+0

FLIstが所有し、FListを解放すると破棄されるため、値を解放したくありません。 –

答えて

5

ことを行います。

FList := TObjectList<TIstruzione>.Create; 

あなたは、常に上記のように、適切なコンストラクタ構文を使用し、変数にCreateを呼び出してはなりません。

はまた、あなただけのリストに追加された項目はないFreeん:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    a: TIstruzione; 
begin 
    a := TIstruzione.Create; 
    a.tipo := Add; 
    a.rdest := 2; 
    a.dato1 := 7; 
    a.dato2 := 5; 
    FList.Add(a); 

    a := TIstruzione.Create; 
    a.tipo := Load; 
    a.rdest := 1; 
    a.dato1 := 2; 
    a.dato2 := -1; 
    FList.Add(a); 
end; 

TObjectListは現在の所有者であるので、オブジェクトがTObjectListによって解放されます、そしてないで解放するべきではありませんもうあなた。つまり、OwnsObjects := True;の意味です。

+0

待ち時間なし、TObjectListです​​ –

+0

また、TButton1のクリックでプログラムがクラッシュします –

+0

ありがとうRudy。ただのこと:あなたはTIstruzioneを呼び出しています.2回作成してください!既に作成されていないのですか? –

関連する問題