2011-08-25 48 views
2

爲什麼此代碼不起作用?使用TFileStream流對象到文件

我正在寫一個應用程序,可以保存和加載自己的文件,並需要知道如何使用FileStream將對象流式傳輸到文件。

procedure TForm1.btnSaveClick(Sender: TObject); 
var 
    fs: TFileStream; 
begin 
    fs := TFileStream.Create('c:\temp\a.my', fmCreate); 
    try 
    fs.WriteBuffer(Image1.Picture.Graphic, SizeOf(TGraphic)); 
    finally 
    fs.Free; 
    end; 

    ShowMessage('ok'); 

    Image1.Picture.Graphic := nil; 
end; 

procedure TForm1.btnLoadClick(Sender: TObject); 
var 
    fs: TFileStream; 
    g: TGraphic; 
begin 
    fs := TFileStream.Create('c:\temp\a.my', fmOpenRead); 
    try 
    fs.ReadBuffer(g, SizeOf(TGraphic)); 

    Image1.Picture.Graphic := g; 
    finally 
    fs.Free; 
    end; 

    ShowMessage('ok'); 

end; 

編輯1: 發現做到這一點,但需要更多的幫助方式:

procedure TForm1.btnSaveClick(Sender: TObject); 
var 
    fs: TFileStream; 
    s: TMemoryStream; 
    buf: TBytes; 
begin 
    fs := TFileStream.Create('c:\temp\a.my', fmCreate); 
    s := TMemoryStream.Create; 
    try 
    Image1.Picture.Graphic.SaveToStream(s); 

    SetLength(buf, s.Size); 
    s.Position := 0; 
    s.ReadBuffer(buf[0], s.Size); 

    //fs.WriteBuffer(, SizeOf(Integer)); <-here how do I save an integer which represents the size of the buffer? (so that when reading back i read this first.) 

    fs.WriteBuffer(buf[0], s.Size); 
    finally 
    s.Free; 
    fs.Free; 
    end; 

    ShowMessage('ok'); 

    Image1.Picture.Graphic := nil; 
end; 
+0

這與我用一個完整的代碼片段回答的其他問題有關:http://stackoverflow.com/questions/7190998/after-assigning-nil-to-timage-picture-graphic-to-clear-the -picture-how-can-i-use/ –

回答

3

你做了什麼有流的參考,即一個指針。你需要流的是內容。你可以使用SaveToFile和LoadFromFile。

關於您的更新,將s.Size分配給Integer類型的局部變量,然後使用WriteBuffer將其保存。相反,使用ReadBuffer讀入局部變量。

如果我是你,我會直接寫入文件並避免內存條紋。使用TStream的Position屬性來查找文件。所以寫長度爲0,寫入圖形,回溯到開始並寫入長度爲4字節的真實長度。

+0

感謝您的回覆。除了TGraphic之外,我還有其他對象,所以我必須使用TFileStream的WriteBuffer和ReadBuffer來保存和加載文件。我將編輯我的帖子以顯示我當前的代碼,其中我有一個相關的問題。 –

+1

一般最好一次問一個問題。我已經回答了這個問題。 –

+0

需要了解如何:「如何保存一個表示緩衝區大小的整數?」在編輯1 –