3

私は 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;

私の質問は次のとおりです。

  1. StringList 内の TStream オブジェクトを追加および削除 (解放) する方法は正しいですか? たぶん、最初にストリームを解放してからオブジェクトを解放する必要がありますか??

  2. FormDestroy イベントですべてのオブジェクトを解放する方法は正しいですか?

  3. ストリームを Memo (Memo.Lines.LoadFromStream(TStream(List.Objects[Idx]))) にロードしようとすると、Stream.Size が 0 より大きいにもかかわらずロードされません。私が間違っていることは何ですか?

4

2 に答える 2