我正在使用 Delphi 7 并使用 StringList,以 TStream 作为对象。
我的测试项目有一个 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 对象加载到备忘录。这是我试图做的:
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.Lines.LoadFromStream(TStream(List.Objects[Idx]))) 时,它不会加载,尽管 Stream.Size 大于零。我做错了什么?