本人初学delphi,在开发一个小软件,但碰到一个从access中读取图片的问题。在access中我设置了一个‘照片’的字段,保存的是图片的路径,并根据传入的不同的变量名来显示照片.. 部分代码如下:
 adoquery1.Close;
 adoquery1.SQL.Clear;
 adoquery1.sql.add('select * from main where 姓名='''+name'''');
 adoquery1.open;
 Image1.Picture.LoadFromFile(ADOQuery3.fieldbyname('照片').AsString); 提示错误  class EInvalidGraphic with message 'Unkown picture file extension(.)'
但如果我将 adoquery1.sql.add('select * from main where 姓名='''+name''''); 
修改为      adoquery1.sql.add('select * from main where 姓名=''tom''');时又一切正常,也就是说如果是写入具体的值就没问题,传入变量就不行,请问这是怎么回事,已经研究好多天了,一直无法解决,请大家帮帮忙,非常感谢!!!!

解决方案 »

  1.   

    应该不会啊,你name值指定了吗
    两个是相等的,测试如下
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str:string;
      str1:string;
      str2:string;
    begin
      str := 'select * from main where 姓名=''tom''';
      showmessage(str);
      str1 := 'tom';
      str2 := 'select * from main where 姓名='''+str1+'''';
      showmessage(str2);
      if str=str2 then
      showmessage('相等');
    end;你测试下,如果相等,就是其它问题了
    showmessage下ADOQuery3.fieldbyname('照片').AsString的内容,再看看
      

  2.   

    是不是tom的这个对应的照片内容是可以的,其它的有的不可以,你都先
    showmessage(ADOQuery3.fieldbyname('照片').AsString);
    看看,是不是这个内容没有后缀名或者这个文件不存在
    但如下两个结果应该是一致的
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str:string;
      str1:string;
      str2:string;
    begin
      str1 := 'tom';  adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.sql.add('select * from main where 姓名=''tom''');
      adoquery1.open;
      Image1.Picture.LoadFromFile(ADOQuery3.fieldbyname('照片').AsString);  adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.sql.add('select * from main where 姓名='''+str1+'''');
      adoquery1.open;
      Image2.Picture.LoadFromFile(ADOQuery3.fieldbyname('照片').AsString);end;
      

  3.   

    感谢yqdragon的回复.. 为了做测试 照片 字段里的内容 我都是直接写入的...肯有内容 而且是bmp和jpg两种格式的我都试了.... 我这个程序是双击一个dbgrid里的一个人员记录,然后就弹出一个窗口关于这个人员的详细信息,比如姓名,姓名,照片等等, 所以我的 select 语句都是在 FormCreate里的,就是说窗口一创建就把数据库里关于这个人员的信息读出来..部分代码如下:
    procedure Tmoreform.FormCreate(Sender: TObject);
    begin
    adoquery1.close;
    adoquery1.SQL.Clear;
    adoquery1.SQL.add('select * from main where 姓名=:xm');
    adoquery1.Parameters.ParamByName('xm').Value:=morename;//morename是传过来的变量
    adoquery1.open;
     xm.text:=adoquery1.fieldbyname('姓名').asstring;
     ch.text:=adoquery1.fieldbyname('绰号').asstring;
     combobox1.text:=adoquery1.fieldbyname('性别').asstring;
    ..............
     image1.Picture.LoadFromFile(adoquery1.fieldbyname('照片').asstring);
    但总是提示 class EInvalidGraphic with message 'Unkown picture file extension(.)'但如果我新建一个 button  把 image1.Picture.LoadFromFile(adoquery1.fieldbyname('照片').asstring); 这条语句放到 button的 click 事件中 又不会有错误....就是说要点击下按钮显示图片就不会有错误发生..... 这是啥问题啊... 
      

  4.   

    morename是撒时,怎么传如的
    把FormCreate里的代码读取图片的代码放到FormShow试试
      

  5.   

    你有没有加上
    Uses   jpeg
    没有加上
      

  6.   

    这么晚了还没休息呢..  morename是通过下述方式传值的,在另一个窗口中通过点击dbgrid的某条记录来传递记录的 姓名 字段给moreform 窗体.. 也就是显示详细记录的窗体... 另外  use jpeg 已经加上了,formShow也试过了不行...貌似硬要点下button才不会出错...
    procedure Tselform.DBGrid1DblClick(Sender: TObject);
    begin
    if  adoquery1.Fields[0].Value<>null then
    morename:=adoquery1.Fields[0].Value;
    application.CreateForm(Tmoreform,moreform);
    moreform.ShowModal;
    end;
      

  7.   

    那就奇了怪了,首先你不用的你的程序,新建一个
    以下这个是肯定没有问题的
    uses
      jpeg;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      str:string;
    begin
      str:=extractfilepath(application.exename)+ 'a.jpg';
      image1.Picture.LoadFromFile(str);
    end;
    然后在你的程序中
    showmessage(adoquery1.fieldbyname('照片').asstring);
    看看是什么,拷贝这个路径到上例的str中,试试,应该也没问题才对,如果有问题就是
    adoquery1.fieldbyname('照片').asstring的问题如果都没问题就是你的程序其它问题
    你再查查吧
      

  8.   

    终于找到问题所在了.... 因为我的代码是放在formcreate里的...而我的变量是要在dbgrid里双击记录才能传值... 这个时候窗体才初始化,传值的窗体都还没显示出来,哪里有值 传过来啊,所以就一直显示那个错误了...卖糕的...所以把那段代码放在formactive里就可以了......感谢你的回复..