我使用Delphi 7並使用StringStream和TStream作爲對象。TStream作爲StringList中的一個對象
我的測試項目有一個列表框,一個備忘錄和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;
當我雙擊列表框,我想選擇的項目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的內部的T流對象?也許我需要先釋放流,然後釋放對象?
正確的方式我釋放FormDestroy事件上的所有對象?
當我嘗試將流加載回備註(Memo.Lines.LoadFromStream(TStream(List.Objects [Idx])))時,儘管Stream.Size高於零,但它不會加載。我做錯了什麼?
沒有必要投'Strm'到'TObject'在'List.AddObject(IntToStr(List.Count),TObject的(STRM)); 'line'Strm' ** IS ** a TObject –
@GerryColl,謝謝你的提示! – Guybrush
你的錯誤是試圖強制一個流到Objects []屬性中。創建一個持有你需要的類型。 –