timer1.Enabled:=true;
readdb();
timer1.Enabled:=false;程序一定要等到readdb()结束之后Edit1.text的内容才开始变化。
我知道用多线程可以解决问题,可是不会,能给个例子吗?
只要在readdb()的时候Edit1.text的内容会按要求变化就可以了。

解决方案 »

  1.   

    其实并不是说Edit的内容没有被改变,只不过因为处于忙状态,Edit没有刷新机会,而使用得用户界面上看不出改变,如果想要设置了Edit的内容之后马上有所显示,则在后面紧跟一个Application.ProcessMessage;
    当然,通常情况这样子可以解决问题,但是有时候却不可以使用。具体的问题具体分析吧。
      

  2.   

    我设了edit1.Refresh;可是没用,试试看你的
      

  3.   

    timer1.Enabled:=true;
    Application.ProcessMessage;
    readdb();
    timer1.Enabled:=false;
      

  4.   

    楼主,你在使用Timer前和后都用一个
      self.refresh;
    试试,如果可以的话,请楼主至少给我80分!
    记得!
      

  5.   

    估计你在readdb中循环操作数据库,如果是这样的话当然是执行不到Timer.OnTime了,所以不管你在ontime中怎么更新Edit的值,根本没有执行到怎么会去更新呢!建议:在readdb的循环中加入Application.ProcessMessages;
    如:
    while ... do
    begin
      ...
      ...
      Application.ProcessMessages;
    end;
    保证可以!!!
      

  6.   

    是说要在Edit.Text改变之后马上执行Application.ProcessMessage,而不是说Timer代码的执行前后,如果没判断错的话,楼主应该是在readdb这个过程当中执行对Edit.Text进行修改的,那么当然Application.ProcessMessage就应当写入该过程当中去。
    不知道楼主是要用来具体做一个什么功能,如果是用来显示进度状态,TStatusBar或者TStaticText。
      

  7.   

    self.refresh;不管用
    readdb();就是一个单个的存储过程,执行时间大概要6秒这样子
      

  8.   

    就是一抽奖程序,Edit.Text就是翻滚的卡号
      

  9.   

    你将timer的周期时间设置长于6秒试试,!给你一段我的简单线程例子!
    unit ThreadData;interfaceuses
      Windows,Classes, SysUtils;type
      TReadThread = class(TThread)
      private
        { Private declarations }
        procedure ReadPort;   //读取串行端口数据
      protected
        procedure Execute; override;
      end;implementation
    uses mainform; // 声明引用mainform,必须放在implementation区段procedure TReadThread.Execute;
    begin
      { Place thread code here }
      While not Terminated do
      begin
        Synchronize(ReadPort);//刚才所定义的读取数据函数
      end;
    end;//读取串行端口的程序放在这里
    procedure TReadThread.ReadPort;
    var
      Temp : string;
      inbuff: array[0..2047] of Char;
      nBytesRead, dwEvent, dwError:LongWORD ;
      cs:TCOMSTAT;
    begin
       if (fm_main.Comm1.Hcomm=0) then exit;//先判断是否已打开通信端口
       ClearCommError(fm_main.Comm1.Hcomm,dwError,@CS);  //取得状态
       ReadFile(fm_main.Comm1.Hcomm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
       //串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉
       if cs.cbInQue =0 then exit;
       // 数据是否大于我们所准备的Buffer
       if cs.cbInQue > sizeof(inbuff) then begin
         PurgeComm(fm_main.Comm1.Hcomm, PURGE_RXCLEAR);  // 清除COM 数据
         exit;
       end;
       //Temp:=Copy(inbuff,1,cs.cbInQue);//取出数据
       temp:=fm_main.Comm1.GetCommData;
       fm_main.BarCode01.Caption:=temp;
    end;
    end.
      

  10.   

    哪位老大给个开两线程显示的程序吧,另开贴给200分,决不食言
    Program Files\Borland\Delphi7\Demos\Threads 这个没看懂
      

  11.   

    那Timer是解决不了这个问题的,因为这回使得数据覆盖的问题出现,或者未完成中断!
    //线程函数
    function ThreadFunc(P:Pointer):LongInt;Stdcall;
    var
      i:integer;
      DC:HDC;
      S:String;
    begin
      DC:=GetDC(Form1.Handle);
      For I:=0 to 100000 do begin
        S:=InttoStr(I);
        TextOut(DC,10,10,Pchar(S),Length(S));
      end;
      ReleaseDc(Form1.handle,DC);
    end;
    //声明使用
    var
      hThread:THandle;
      ThreadID:DWord;
    begin
      CreateThread(nil,0,@ThreadFunc,nil,0,ThreadID);
      //。
    end;
    关于CreateThread的参数
       第一个参数代表一系列安全属性,如果这个参数是nil,将会使用默认的安全属性,在98/95下使用这个属性是标准用法,如果你想让子进程继承这个线程的时候,可以改变这个属性,具体使用查看win32帮助文件中的SECURITY_ATTRIBUTES
       第二个参数是0的话,线程堆栈的大小和应用程序的堆栈大小是一样的,
       第三个参数是最重要的部分,它是你指定在线程开始运行时调用的线程函数的名称的地方,只要在这个域中输入函数名称,并且在前面加个@(表示函数地址)就可以了。
       第四个参数是向函数传递参数,使用方法大概是先创建一个结构,然后把地址传递到这个参数中。
       第五个参数是关于线程的标志,例如可挂起线程,Creates_USPENDED 
       第六个参数是表示系统分配给它的唯一的ID
      

  12.   

    用time控件不好说啊,你这个机子运行6秒,其它的就难说了,还是用多线程好点