编译通过就是运行的时候提示内存出错 帮我解决下啊  已经好几天了

                            
unit   mythreadunit;   
   
  interface  
   
  uses  
      Classes,Contnrs,DBGrids,   DB,ADODB,dmunit,Windows,   Messages,   SysUtils,   Variants,     Graphics,   Controls,   Forms,  
  Dialogs,   ExtCtrls,   ImgList,   ComCtrls,   mainunit,RzGrids,RzEdit,StdCtrls;  
   
   
  type  
      mythread   =   class(TThread)  
      private  
          {   Private   declarations   }  
          //动态创建显示窗口包括edit   dbgrid  
            procedure       createedtsg(var   edt:TRzedit;sg:Tdbgrid;ds:Tdatasource;adq:Tadoquery;x:integer;y:integer);  
      protected  
          procedure   Execute;   override;  
      public  
            groupNo:integer;  
            x,y:integer;  
            edt:TRzedit;  
            sg:Trzstringgrid;  
            adq:Tadoquery;  
            ds:Tdatasource;  
            procedure   runedtsg;  
            constructor   create(var     a:integer;b:integer);  
   
      end;  
  type  
        pedtsg=^Tedtsg;  
        Tedtsg=record  
        edt:TRzedit;  
   
        adq:Tadoquery;  
        ds:Tdatasource;  
        sg:tdbgrid;  
  end;  
   
  implementation  
   
  {   Important:   Methods   and   properties   of   objects   in   visual   components   can   only   be  
      used   in   a   method   called   using   Synchronize,   for   example,  
   
              Synchronize(UpdateCaption);  
   
      and   UpdateCaption   could   look   like,  
   
          procedure   mythread.UpdateCaption;  
          begin  
              Form1.Caption   :=   'Updated   in   a   thread';  
          end;   }  
   
  {   mythread   }  
  constructor   myThread.create(var     a:integer;b:integer);//初始化只要定位就可以了  
  begin  
      x:=a;  
      y:=b;  
      inherited   Create(false);  
      freeonterminate:=true;  
  end;  
  procedure       mythread.createedtsg(var   edt:TRzedit;sg:Tdbgrid;ds:Tdatasource;adq:Tadoquery;x:integer;y:integer);  
  var  
  u:integer;  
  begin  
            ds:=Tdatasource.create(mainform.Rzpanel2);  
            adq:=Tadoquery.create(mainform.Rzpanel2);  
            edt:=TRzedit.Create(mainform.Rzpanel2);  
            edt.Left:=x;  
            edt.Top:=y;  
            edt.Width:=mainform.Rzpanel2.Width   div   3   ;  
            edt.Height:=20;  
            edt.Name:='edt'+mainform.adoquery2.fieldbyname('CureGroupNo').AsString;  
            edt.Parent:=mainform.Rzpanel2;  
            sg:=Tdbgrid.Create(mainform.rzpanel2);  
            sg.Left:=x;  
            sg.Top:=y+20;  
            sg.Height:=105;  
            sg.Width:=mainform.Rzpanel2.Width   div   3   ;  
            sg.Name:='sg'+   mainform.adoquery2.fieldbyname('CureGroupNo').AsString;  
            sg.Parent:=mainform.Rzpanel2;  
            for   u:=0   to   5   do   sg.Columns.Add;  
            sg.Columns.Items[0].Title.caption:='序号';  
            sg.Columns.Items[1].title.caption:='姓名';  
            sg.Columns.Items[2].title.caption:='号码';  
            sg.Columns.Items[3].title.caption:=   '时间';  
            sg.Columns.Items[4].title.caption:=   '医生'   ;  
            sg.Columns.Items[5].title.caption:=   '优先名称';  
            sg.Columns.Items[0].FieldName:='SerialID';  
            sg.Columns.Items[1].FieldName:='CustName';  
            sg.Columns.Items[2].FieldName:='Qno';  
            sg.Columns.Items[3].FieldName:=   'RegDateTime';  
            //sg.Columns.Items[4].FieldName:=   'UserName'   ;  
            sg.FixedColor:=clSkyBlue;  
            sg.Columns.Items[5].FieldName:=   'Specail';  
            sg.DataSource:=ds;  
            ds.DataSet:=adq;  
            adq.Connection:=dmform.ADOConn;  
            with   adq   do  
            begin  
                  if   active   then   close;  
                  sql.Clear;  
                  sql.Add('select   GroupName,SerialID,CustName,waitQue.Qno,RegDateTime,Specail   from   Waitque,GroupSet   where   cureGroupNo=GroupSet.groupNo   and   CureGroupNo='+inttostr(groupNo)+'   and   status=''1''   ');  
                  open;  
                  edt.Text:=fieldbyname('Groupname').AsString;  
            end;  
   
  end;  
  procedure   myThread.runedtSg;   //创建组件  
  var  
   
      p:pedtsg;  
   
      j,i:integer;  
   
  begin  
            if   (mainform.adqqueue.Count<>0)and   (mainform.adq2queue.count=0)   then  
          begin  
              for   i:=1   to   mainform.adqqueue.Count   do  
              begin  
                    mainform.adqp:=mainform.adqqueue.Pop;  
                    //刷新  
                    mainform.adqp.Close;  
                    mainform.adqp.open;  
                    mainform.adq2queue.Push(mainform.adqp);  
              end;  
          end;  
          if   (mainform.adqqueue.Count=0)and   (mainform.adq2queue.count<>0)   then  
          begin  
              for   i:=1   to   mainform.adq2queue.Count   do  
              begin  
                    mainform.adqp:=mainform.adq2queue.Pop;  
                    mainform.adqp.Close;  
                    mainform.adqp.Open;  
                    mainform.adqqueue.Push(mainform.adqp);  
              end;  
          end;  
            mainform.adoquery2.Connection:=dmform.ADOConn;  
            with   mainform.adoquery2   do  
            begin  
                  close;  
                  sql.Clear;  
                  sql.Add('select   distinct   CureGroupNo   from   WaitQue   where   Status=''1''');  
                  open;  
                  while   not   eof   do   //比较与是否已经创建  
                  begin  
   
                      j:=0;  
                      for   i:=0   to   mainform.arytag   do  
                      begin  
                            if     fieldbyname('cureGroupNo').AsInteger<>mainform.ary[i]   then   continue  
                            else  
                            begin  
                                  j:=i;   //用j记录相等的情况  
                                  break;  
                            end;  
                      end;  
                      //以上循环判断的结果有两个1   fieldbyname('cureGroupNo').AsInteger与ary中的都不相等  
                      //2   fieldbyname('cureGroupNo').AsInteger与其中的一个即   ary[j]相等     因此要进行以下判断  
                      if   (fieldbyname('CureGroupNo').AsInteger=mainform.ary[j])and   (mainform.ary[j]<>0)   then  
                      next   else  
                      begin  
                            GroupNo:=fieldbyname('cureGroupNo').AsInteger;  
                            mainform.ary[mainform.arytag]:=fieldbyname('CureGroupNo').AsInteger;  
                            mainform.arytag:=mainform.arytag+1;  
                            new(p);  
                                if   x<=(mainform.Rzpanel2.Width*2   div   3)     then  
                                begin  
                                      createedtsg(p^.edt,p^.sg,p^.ds,p^.adq,x,y);  
   
                                      x:=x+mainform.Rzpanel2.Width   div   3;  
                                end  
                                else  
                                begin  
                                      y:=y+135;  
                                      createedtsg(p^.edt,p^.sg,p^.ds,p^.adq,0,y);  
   
                                      x:=mainform.Rzpanel2.width   div   3;  
   
                                end;  
   
                            //让adq,edt,sg入队列  
                          mainform.adqp:=   @p^.adq;  
                            if   mainform.adq2queue.Count=0   then  
                                mainform.adqqueue.Push(mainform.adqp)  
                            else  
                                mainform.adq2queue.Push(mainform.adqp);  
                            mainform.edtp:=@p^.edt;  
                            if   mainform.edt2queue.Count=0   then  
                                mainform.edtqueue.Push(mainform.adqp)  
                            else  
                                mainform.edt2queue.Push(mainform.adqp);  
                            mainform.sgp:=@p^.sg;  
                            if   mainform.sg2queue.Count=0   then  
                                mainform.sgqueue.Push(mainform.adqp)  
                            else  
                                mainform.sgqueue.Push(mainform.adqp);  
                            next;  
                      end;  
   
                  end;  
   
            end;  
            mainform.postA:=x;  
            mainform.postB:=y;  
   
  end;  
   
   
   
  procedure   mythread.Execute;  
  begin  
      {   Place   thread   code   here   }  
        Synchronize(runedtSg);   //控制线程同步   避免在创建组件的时候或者之前   在组件中操作  
  end;  
   
  end.  
 

查看回复

相关问题