請教 IdBytes 使用問題 |
答題得分者是:tick228
|
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
Hi,各位先進大家好:
目前測試使用 IdBytes 去接 FileStream 讀取的資料,很怪, 如下程式,使用 Array of byte, 收比較大的資料都沒問題, 但使用 IdBytes 接收,超過 1200 就會顯示讀取 0 byte, 甚至會造成記憶體衝突,是我的用法錯了嗎? 謝謝! unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdGlobal, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) btnArray: TButton; btnIdBytes: TButton; lblArray: TLabel; lblIdBytes: TLabel; procedure btnArrayClick(Sender: TObject); procedure btnIdBytesClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.btnArrayClick(Sender: TObject); var FileStream: TFileStream; Buffer: Array[0..2047] of Byte; ReadCount: Integer; begin ReadCount := 0; FileStream := TFileStream.Create('c:\temp\123.jpg', fmOpenRead); ReadCount := FileStream.read(Buffer, 2048); lblArray.Text := IntToStr(ReadCount); FileStream.Free; end; procedure TForm1.btnIdBytesClick(Sender: TObject); var FileStream: TFileStream; BufferT: TIdBytes; ReadCount: Integer; begin SetLength(BufferT, 409600); ReadCount := 0; FileStream := TFileStream.Create('c:\temp\123.jpg', fmOpenRead); ReadCount := FileStream.read(BufferT, 2048); lblIdBytes.Text := IntToStr(ReadCount); FileStream.Free; end; end. |
tick228
高階會員 發表:1 回覆:47 積分:104 註冊:2003-11-03 發送簡訊給我 |
這是固定陣列和動態陣列的差異.
Buffer: Array[0..2047] of Byte; Buffer 指的是 array 本身. BufferT: TIdBytes; 但 BufferT 指的卻是 array 的 pointer, SizeOf(BufferT) = SizeOf(Pointer) = 4 所以遇到這種要傳陣列空間的, 儘量使用 FileStream.read(Buffer[0], 2048); FileStream.read(BufferT[0], 2048); 的方式, 就不會有問題. PS: 由於固定陣列的基底, 不一定一定是 0, 所以改用 FileStream.read(Buffer[Low(Buffer)], 2048); FileStream.read(BufferT[Low(BufferT)], 2048); 會更好. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |