这是DELPHI帮助中的例子,原样复制下来:
procedure TForm1.Button1Click(Sender: TObject);var
  iFileHandle: Integer;
  iFileLength: Integer;
  iBytesRead: Integer;
  Buffer: PChar;
  i: Integer
begin
  if OpenDialog1.Execute then
  begin
    try
      iFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);
      iFileLength := FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      Buffer := PChar(AllocMem(iFileLength + 1));
      iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
      FileClose(iFileHandle);      for i := 0 to iBytesRead-1 do
      begin
        StringGrid1.RowCount := StringGrid1.RowCount + 1;
        StringGrid1.Cells[1,i+1] := Buffer[i];
        StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));
      end;
    finally
      FreeMem(Buffer);
    end;
  end;
end;当招待完这条语句后,即iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
Buffer突然是空了.
正常应该Buffer里面是从文件中读取的数据,但是它里面什么也没有,而当执行
FreeMem(Buffer)时,程序就出错了,出错提示大概是引用了一个空的变量.请问大家,这倒底是什么原因,如何解决?

解决方案 »

  1.   

    你看一看用OpenDialog打开的文件他能读取吗?
      

  2.   

    和文件没关系,如果 把变量buf改成(var buf[0..1024] array of char)就可以正常执行.
      

  3.   

    iBytesRead := FileRead(iFileHandle, Buffer^, iFileLength);
                                              ^这里加个指针符号就可以了,要传的是指针,不能用地址.
      

  4.   

    function FileRead(Handle: Integer; var Buffer; Count: Integer): Integer;定义中第二个参数是传址参数,所以要将变量做为地二个参数,传递的就是地址;所以是buffer^;如果是buffer则传递的是这个指针变量的地址而不是在文件中读到的字符穿的地址。