線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:703
推到 Plurk!
推到 Facebook!

請教 IdBytes 使用問題

答題得分者是:tick228
blue
中階會員


發表:170
回覆:136
積分:81
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2018-08-28 08:59:54 IP:125.227.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2018-08-28 13:25:49 IP:49.218.xxx.xxx 未訂閱
這是固定陣列和動態陣列的差異.

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);
會更好.

系統時間:2024-12-04 1:31:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!