procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if form1.openpicturedialog1.Execute then
loadbmpfile(openpicturedialog1.filename);
image1.picture.loadfromfile(openpicturedialog1.filename);---——*
end;
注:loadbmpfile(openpicturedialog1.filename);是我自定义的一个函数,主要作用是把一副图(bmp)的文件头、信息头,很像素值读到内存,可是程序运行到‘*’这个地方就不能往下运行了,各为高手,这是为什么呢(就是会执行到这个过程的最后一行)

解决方案 »

  1.   

    你的loadbmpfile函数出错了,他就跳出程序的运行,直接到end.
      

  2.   

    if form1.openpicturedialog1.Execute then
    begin
      loadbmpfile(openpicturedialog1.filename);
      image1.picture.loadfromfile(openpicturedialog1.filename);
    end;//通常是这样使用dialog函数的
      

  3.   

    cdkey 您好,谢谢您帮我,
    我把这个函数拷在下面,帮我看看好吗?
    function LoadBmpFile(BmpFile: String): Boolean;
    begin
      AssignFile(hf,BmpFile);
      Reset(hf,1);
      BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER));
      BlockRead(hf,bi,SizeOf(BitMapInfoHeader));  //计算一行象素中最少的Byte数
      widthBytes := trunc(((8-(bi.biWidth*bi.biBitCount mod 8)) mod 8 + bi.biWidth*bi.biBitCount)/8);  // 一行象素的Byte数应为4的整数倍
      LineBytes := (4-(widthbytes mod 4)) mod 4 + widthbytes;//修正字节数  NullCount := LineBytes - WidthBytes;  //每行字节数必须为4的倍数,不足补0
      ImgSize:= LineBytes*bi.biHeight;
      x:=LineBytes;
      y:=bi.biHeight;
      if bi.biClrUsed <>0 then
        NumColors := bi.biClrUsed
      else
       begin
        case bi.biBitCount of
         1:NumColors := 2;
         4:NumColors := 16;
         8:NumColors := 256;
         24:NumColors := 0;
        else
         begin
          ShowMessage('Invalid color numbers!');
          CloseFile(hf);
          Result := False;
          Exit;
         end;
        end;
      end;
      if bf.bfOffBits <> NumColors*SizeOf(RGBQUAD)+SizeOf(BitmapFileHeader)+SizeOf(BitmapInfoHeader)
    then
      begin
        ShowMessage('Invalid color numbers!');
        CloseFile(hf);
        Result := False;
        Exit;
      end;
      Setlength(hImgData,ImgSize);
      BlockRead(hf,hImgData[0],ImgSize,bytereaded);
      CloseFile(hf);
      Result := True;
    end;
      

  4.   

    yansea:您好:我也按您的方法调试了,但还是不行;
    谢谢您。
      

  5.   

    我对BMP文件格式没研究过,不是很了解。
    你可以在
    BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER),vsize1);
    BlockRead(hf,bi,SizeOf(BitMapInfoHeader),vsize2);
    中断调试一下,看返回的长度是否正常。
    要不将
    BlockRead(hf,hImgData[0],ImgSize,bytereaded);
    该为
    BlockRead(hf,hImgData,ImgSize,bytereaded);
    试一试。
      

  6.   

    那个
    if form1.openpicturedialog1.Execute then
       loadbmpfile(openpicturedialog1.filename);
       image1.picture.loadfromfile(openpicturedialog1.filename);---——*那就应该是你的loadbmpfile  函数可能有错
    你可以把那段代码贴出来啊~~~
    那样才好给你………………
      

  7.   

    cdkey:您好,谢谢您!我照您说的改了,返回的长度正常;BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER),vsize1);
    BlockRead(hf,bi,SizeOf(BitMapInfoHeader),vsize2);
    而且要是把BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER),vsize1);
    BlockRead(hf,bi,SizeOf(BitMapInfoHeader),vsize2);改为BlockRead(hf,hImgData,ImgSize,bytereaded);会出现一个异常类的错误,错误为“EInOutError with message I/O error 998'.
    小鱼儿:您好,谢谢您!我的loadbmpfile 函数已经贴在前面了。
      

  8.   

    这个问题好像看到过一次,不过我总是用流来处理文件的。
    这里:
    BlockRead(hf,bf,SizeOf(BITMAPFILEHEADER));
    BlockRead(hf,bi,SizeOf(BitMapInfoHeader));
    是不是都是从文件头开始读呢?或者把读出来的文件先保存起来看看内容,我觉得第二次读出的数据应该接着第一次的结尾。
    若用流会方便很多的。