编了一个在image上画图的问题,编译时通过,但是run时提示:can not convert variant of type(NULL) into type(integer).
程序如下:unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, DB, ADODB;type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    Image1: TImage;
    Timer1: TTimer;
    Button1: TButton;
    ADOTable1: TADOTable;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;var
  Form1: TForm1;
   s:real;
   aa:real;
   ii:integer;
   xx:integer;
   yy:integer;
implementation{$R *.dfm}
procedure tform1.Button1Click(sender:tobject);
begin
  adotable1.Recordset.MoveFirst;
  timer1.Enabled:= not timer1.Enabled;
  s:=adotable1.Fields[2].asfloat;
  xx:= image1.Left;
  aa:=1-s/10.0;
  yy:=round(image1.Height/2*aa);
  image1.Canvas.Refresh;
  image1.Refresh;
  image1.Canvas.Pen.Color:= clred;
  image1.Canvas.Pen.Width:=2;
end;
procedure tform1.Timer1Timer(sender:tobject);
var
  i:integer;
begin
  image1.Canvas.MoveTo(xx,yy);
  ii:=adotable1.Recordset.RecordCount;
  for i:=1 to ii do
  begin
     adotable1.Recordset.MoveNext;
     s:=adotable1.Fields[2].asfloat;
     xx:=10+10*i;
     aa:=1-s/10.0;
     yy:=round(image1.Height/2 *aa);
     image1.Canvas.LineTo(xx,yy);
  end;
end;
end.

解决方案 »

  1.   

    procedure tform1.Timer1Timer(sender:tobject);
    var
      i:integer;
    begin
      if not showing then exit;//试试在这加上这句看看
      image1.Canvas.MoveTo(xx,yy);
      ii:=adotable1.Recordset.RecordCount;
      for i:=1 to ii do
      begin
         adotable1.Recordset.MoveNext;
         s:=adotable1.Fields[2].asfloat;
         xx:=10+10*i;
         aa:=1-s/10.0;
         yy:=round(image1.Height/2 *aa);
         image1.Canvas.LineTo(xx,yy);
      end;
    end;
    end.
      

  2.   

    程序作了调整,但还是出现了同样的错误。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, Buttons, DB, ADODB;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        Image1: TImage;
        Timer1: TTimer;
        Button1: TButton;
        ADOTable1: TADOTable;
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);  private
        { Private declarations }
      public
        { Public declarations }
    end;var
      Form1: TForm1;
       s:real;
       aa:real;
       ii:integer;
       xx:integer;
       yy:integer;
    implementation{$R *.dfm}
    procedure tform1.Button1Click(sender:tobject);
    var
      i:integer;
    begin
      adotable1.Recordset.MoveFirst;
      s:=adotable1.Fields[2].asfloat;
      xx:= image1.Left;
      aa:=1-s/10.0;
      yy:=round(image1.Height/2*aa);
      image1.Canvas.Refresh;
      image1.Refresh;
      image1.Canvas.Pen.Color:= clred;
      image1.Canvas.Pen.Width:=2;
      image1.Canvas.MoveTo(xx,yy);
      ii:=adotable1.Recordset.RecordCount;
      for i:=1 to ii do
      begin
        timer1.Enabled:=not timer1.Enabled;
        adotable1.Recordset.MoveNext;
        s:=adotable1.Fields[2].asfloat;
        xx:=10+10*i;
        aa:=1-s/10.0;
        yy:=round(image1.Height/2 *aa);
      end;
    end;
    procedure tform1.Timer1Timer(sender:tobject);begin
      if not showing then exit;
      image1.Canvas.LineTo(xx,yy);
      timer1.Enabled:=not timer1.Enabled;
    end;
    end.
      

  3.   

    can not convert variant of type(NULL) into type(integer).
    看起来好象是类型转化的问题。你检查一下数据库中存储的值是否为空?
      

  4.   


    不知道你用的是什么数据库?
    在sql里就用那个convert 或者 cast 显式转换.
    因为你定义的字段类型可能与程序中的不同.有的类型之间是隐式转换.
      

  5.   

    我没有用sql语句,类型是一致的(数据库中float,程序中real)
    到底是怎么回事?
    各位帮帮忙呀!
      

  6.   

    好像是:“s:=adotable1.Fields[2].asfloat;”是错的,
    但是应该怎么办,有人知道吗?
    知道的就回答吗,不要不好意思哟。
      

  7.   

    数据库中如果是Float,那么代码中就不用AsFloat了
      

  8.   

    好像delphi中实形对应SQL的double型?!
    找一下SQL联机帮助吧!
      

  9.   

    还是不行
    是不是别的地方错了
    我改用Table控件连接数据库,程序也做了相应的调整就可以了,
    那这个程序到底是哪里错了呢?
      

  10.   

    不能把Null值转换成integer
    可能是这句话错了
    s:=adotable1.Fields[2].asfloat;  我这里没有delphi
    如果不对的话。你要调试的时候看看这些值是不是为NULL
      

  11.   

    换成single也不行
    我知道是那句话错了,关键是怎么改
    谢谢大家的帮忙