我在form的onshow事件里写了如下语句:
   begin
        adoquery1.Close;
        adoquery1.SQL.Clear;
        adoquery1.sql.text := 'select max(id) as a from lr';
        adoquery1.Prepared;
        adoquery1.open;
        a := adoquery1.FieldByName('a').asinteger;
        a:=a+1;
也就是每次显示form时先在lr库查找ID的最大值,然后将a+1。在确定按钮的click事件里写了
    begin
  ADOTable1.Append;
  ADOTable1.FieldByName('ID').asinteger:=a;
  ADOTable1.FieldByName('bh').asstring:=maskedit1.Text;
   .
   .
   .
   .
    end;我想在执行了上面的代码后又能再次实现onshow事件里所执行的程序。既再次查找出ID的最大值并使之+1。我试了在上面的代码后再复制onshow的代码,在执行后程序并没有实现我的想法。但是在click事件后加一时间延迟几秒却可以实现,或者将窗口关闭一次再打开也可以实现。这样很不方便也耗时间,请问要实现我的这个功能还有别的好的方法没有???

解决方案 »

  1.   

    你直接定义一个过程,例如
    procedure Hello;
    begin
     adoquery1.Close;
            adoquery1.SQL.Clear;
            adoquery1.sql.text := 'select max(id) as a from lr';
            adoquery1.Prepared;
            adoquery1.open;
            a := adoquery1.FieldByName('a').asinteger;
            a:=a+1;
    end;
    以后直接调用这过程不就行了.
      

  2.   

    可以定义一个变量存储该值,afterpost时加1。
    或者干脆定义成自增加字段(PK的话不是很好)
    或者根据时间产生一个不重复的随机数如果一定要这样写的话,也不要写在Onshow里面,写在DataSet.OnNewRecord里。
      

  3.   

    function getmaxid();integer;
    begin
     adoquery1.Close;
     adoquery1.SQL.Clear;
     adoquery1.sql.text := 'select max(id)+1 as a from lr';
     adoquery1.Prepared;
     adoquery1.open;
     result:= adoquery1.FieldByName('a').asinteger;end;
      

  4.   

    调用时这样写:
       begin
      ADOTable1.Append;
      ADOTable1.FieldByName('ID').asinteger:=getmaxid();
      ADOTable1.FieldByName('bh').asstring:=maskedit1.Text;
       .
       .
       .
       .
        end;
      

  5.   

    >>>同意 hsmserver(撒哈拉之雨的悲伤) 如此簡單的問題,只需要將重復的代碼封裝在一個函數內不就可以了!~!!! 哎function GetNextID:integer
    begin
            adoquery1.Close;
            adoquery1.SQL.Clear;
            adoquery1.sql.text := 'select max(id) as a from lr';
            adoquery1.Prepared;
            adoquery1.open;
            Result := adoquery1.FieldByName('a').asinteger;
            Inc(Result)
    end;
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>begin
      ADOTable1.Append;
      ADOTable1.FieldByName('ID').asinteger:=GetNextID(); //不就行了嗎!!!!!!!!!!!!!!!!
      ADOTable1.FieldByName('bh').asstring:=maskedit1.Text;
       .
       .
       .
       .
    end;總之, 上面代碼還有大量的地方需要優化.
      

  6.   

    我定义了JonnySun() 所说的函数后,在adoquery1.Close行为什么会出下列的错误提示????
    [Error] add.pas(97): Method identifier expected
      

  7.   

    begin
      ADOTable1.Append;
      ADOTable1.FieldByName('ID').asinteger:=a;
      ADOTable1.FieldByName('bh').asstring:=maskedit1.Text;
       .
       .
       .
       .
        form.onshow(application)  //加上这一句
        end;