私は Delphi 7 を使用しており、TStream をオブジェクトとして StringList で遊んでいます。
私のテスト プロジェクトには、ListBox、メモ、および 2 つのボタン (追加と削除) があります。
これが私がこれまでに得たものです:
var
List: TStringList;
procedure TForm1.FormCreate(Sender: TObject);
begin
List := TStringList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
I: Integer;
begin
if (List.Count > 0) then
for I := 0 to Pred(List.Count) do
begin
List.Objects[I].Free;
List.Objects[I] := nil;
end;
FreeAndNil(List);
end;
procedure TForm1.btnAddClick(Sender: TObject);
var
Strm: TStream;
begin
Strm := TMemoryStream.Create;
try
Memo.Lines.SaveToStream(Strm);
List.AddObject(IntToStr(List.Count), TObject(Strm));
Memo.Clear;
ListBox.Items.Assign(List);
finally
// Strm.Free; (line removed)
end;
end;
procedure TForm1.btnDelFirstClick(Sender: TObject);
begin
if (List.Count > 0) then
begin
List.Objects[0].Free;
List.Objects[0] := nil;
List.Delete(0);
ListBox.Items.Assign(List);
end;
end;
ListBox をダブルクリックすると、選択した項目の Stream オブジェクトを Memo にロードしたいと思います。これが私がやろうとしたことです:
procedure TForm1.ListBoxDblClick(Sender: TObject);
var
Idx: Integer;
begin
Memo.Clear;
Idx := ListBox.ItemIndex;
if (Idx >= 0) and (TStream(List.Objects[Idx]).Size > 0) then
Memo.Lines.LoadFromStream(TStream(List.Objects[Idx]));
end;
私の質問は次のとおりです。
StringList 内の TStream オブジェクトを追加および削除 (解放) する方法は正しいですか? たぶん、最初にストリームを解放してからオブジェクトを解放する必要がありますか??
FormDestroy イベントですべてのオブジェクトを解放する方法は正しいですか?
ストリームを Memo (Memo.Lines.LoadFromStream(TStream(List.Objects[Idx]))) にロードしようとすると、Stream.Size が 0 より大きいにもかかわらずロードされません。私が間違っていることは何ですか?