source:tfilestream;
sa:array of byte;begin
Source:=TFileStream.Create('d:\test.dat',fmOpenRead or fmShareExclusive);
Source.Seek(0,soFromBeginning);
setlength(sa,4);
Source.Read(sa,sizeof(sa));
source.Free;

解决方案 »

  1.   

    为什么这样就没错,而上面的代码就报错!
    source:tfilestream;
    sa:array[0..3] of byte;begin
    Source:=TFileStream.Create('d:\test.dat',fmOpenRead or fmShareExclusive);
    Source.Seek(0,soFromBeginning);
    Source.Read(sa,sizeof(sa));
    source.Free;
      

  2.   

    sa:array of byte;
    改为sa:array of string;
      

  3.   


    procedure TForm1.Button2Click(Sender: TObject);
    var
    source:tfilestream;
    sa:array of byte;
    i:integer;
    begin
    Source:=TFileStream.Create('c:\a.txt',fmOpenRead or fmShareExclusive);
    // Source.Seek(0, soFromBeginning);
    Source.Seek(soFromBeginning, 0);
    setlength(sa, 5);
    //Source.Read(sa, sizeof(sa));
    ShowMessage(inttostr(length(sa)));
    Source.Read(pbyte(sa)^, length(sa));
    for i := 0 to 4 do
      showmessage(inttostr(sa[i]));
    source.Free;
    end;
      

  4.   

    sa:array of byte;   
    创建一个动态的数组,该数组内的数据并没有分配内存。。
    setlength(sa,4);
    只是设置动态的数组长度为4。sa:array[0..3] of byte;
    创建一个静态数组。该数组内的数据已分配空间。。前面的没有出错,是因为变量没有初始化,没有分配内存空间。。懂了吗?
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      source:tfilestream;
      sa:array of byte;
      i, iLen:integer;
    begin
      iLen := 10;
      Source:=TFileStream.Create('c:\a.txt',fmOpenRead or fmShareExclusive);
      // Source.Seek(0, soFromBeginning);
      Source.Seek(soFromBeginning, 0);  setlength(sa, iLen);
      ZeroMemory(pbyte(sa), length(sa));
      for  i := 0 to iLen - 1 do
        memo1.Lines.Add(inttostr((sa[i])));  //Source.Read(sa, sizeof(sa));
      Source.Read(pbyte(sa)^, length(sa));
      for  i := 0 to iLen - 1 do
        memo1.Lines.Add(inttostr((sa[i]))); // 结果正确。
      source.Free;
    end;
    {
    动态数组 <<object pascal>>动态数组没有固定的尺寸或长度。取而代之的是,向动态数组赋值或把动态数组传递给SetLength过程时,动态数组的内存被重新分配。表示动态数组的结构具有如下形式
    array of baseType
    例如,
    var MyFlexibleArray: array of Real;
    这里声明了一个一维的实数动态数组。声明并不为MyFlexibleArray变量分配内存。要为数组创建内存,则需要调用SetLength标准过程。例如,对于上面给出的声明,
    SetLength(MyFlexibleArray, 20);
    这里分配了一个20个实数的数组,索引从0到19。动态数组总是以整数作为索引,而且索引总是以0开始。}