unit main;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, StdCtrls, jpeg, ComCtrls,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, DB,
  ADODB, XPMenu;
type
  Tmainfrm = class(TForm)
...........................
 end;
   IpThread=class(TThread)
   private
   n,row:integer;
   st,ipaddr:string;
   ADOQ: TADOQuery;
  protected
    procedure Execute; override;
  public
   constructor create(ip_addr:string);
  end;
var
  mainfrm: Tmainfrm;
  IPping: IpThread;implementationuses yhdl;
var s,t,logout:string;{$R *.dfm}
 constructor IpThread.create(ip_addr:string);
 begin
   FreeOnTerminate:=true;
   inherited create(false);
 end;
procedure IpThread.Execute;
var i:integer;
 begin
  st:='select ip from zdip';
  AdoQ.Close;
  AdoQ.SQL.CLEAR;
  AdoQ.SQL.Add(st);
  AdoQ.open;
  row:=adoq.recordcount;
  adoq.first;   AdoQ.Close;
   AdoQ.SQL.CLEAR;
   ADOQ.SQL.Add('select ip from zdip');
   ADOQ.Open;
  for i:=0 to row-1 do
    begin
     ipaddr:=adoq.FieldByName('ip').asstring;
     adoq.Next;
     sleep(1000);
    end;
end;
上面的程序有什么问题?如何在BUTTONCLICK里调用?
本人急着要用,刚开始学,有点迷失方向了

解决方案 »

  1.   

    1,thread里的ADOQUERY必须要CREATE才可以使用;注意CREATE的时候需要COINI
    2,ADOQUERY必须要进行TRY等异常处理;其他地方也需要,自己找找看;
    3,调用的时候比较简单;
    IPping:=IpThread.create('yourip');这样就创建并运行了你的THREAD
      

  2.   

    注意CREATE的时候需要COINI是什么意思?能否写完整点?
      

  3.   

    constructor create(XX);XX处该写什么?
      

  4.   

    create(ip_addr:string);
    这里你创建的时候要输入的参数啊;
    COINI要分配COM空间;具体要USE ACTIVEX,然后调用COINI。。后面部分不记得了,是个函数;
      

  5.   

    我这个程序里应该在create();里写什么啊.都迷糊了
      

  6.   

    你现在定义的是线程类,并没有生成一个线程类的实例.所以你如果要用的话,可以在BUTTONCLICK添加
    YourThread:=ipThread.Create(ipstr);
    其中YourThread是你的线程实例的名字,随便起,ipstr是你要传递给线程的参数.没有必要分配空间.ADOQUERY也没有必要创建.如果你想保险的话,可以先ADOQUERY.free,然后ADOQUERY.create;如果你要把ipstr传递给线程实例的话,可以这样写:
     constructor IpThread.create(ipstr);
     begin
       ipaddr:=ipstr;
       FreeOnTerminate:=true;
       inherited create(false);
     end;
    ipaddr是你在线程里定义的公共成员.你在private里写的
    n,row:integer;
       st,ipaddr:string;
       ADOQ: TADOQuery;
    在外面是没有办法访问的,如果要访问,你需要把他们都放到public里面.