对于一个Timer,如果我要在一个Memo中不停的写入数字,当到了某一个固定时间时候,比如说每三秒钟我在memo中插入当前时间,然后继续进行在Memo中不停的写入数字,应该怎么做呢?我有一个简单的程序,但是实现不了这个功能,请大家帮忙看一下!
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,unit2;
type
  Count = class(TThread)
  private
    { Private declarations }
    procedure Countnumner;
  protected
    procedure Execute; override;
  end;type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    C:Count;
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  cando: boolean = true;
  ii: integer = 0;implementation{$R *.dfm}procedure Count.Countnumner;
var i:integer;
begin
     for i:=0 to 3000 do
     begin
          form1.Memo1.Lines.Add(inttoStr(i)+' ');
          sleep(100);
     end;
end;procedure Count.Execute;
begin
     //Synchronize(Countnumner);
     Countnumner;
end;procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
     c.Execute;
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
     c.Suspend;
     self.Memo1.Lines.Add(DateTimeToStr(now));
     c.Resume;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     c.Free;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
     c:=count.Create(true);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
     timer1.Enabled:=false;
end;end.

解决方案 »

  1.   

    就是一直往memo中写入数字,每三秒钟插入一次时间,然后接着写入数字
      

  2.   

    你在线程里每执行一次时检查一下时间,如果是相隔三秒就写一条时间记录不就行了,为什么还要用TIMER?
      

  3.   

    你没有理解 Synchronize,它是在主线程中执行的,如果它调用的方法未返回,则不能再响应主线程的事件。
    应该这样写:
    procedure Count.Countnumner;
    begin
        form1.Memo1.Lines.Add(inttoStr(i)+' ');
    end;procedure Count.Execute;
    var i:integer;
    begin
       for i:=0 to 3000 do
       begin
         Synchronize(Countnumner);
         sleep(100);
       end;
    end;
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
    begin
         c.Resume; // 用Resume ,如果调用 Execute ,则没有线程的效果,只是一个方法而已
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
       //  c.Suspend;这里无需挂起线程
         self.Memo1.Lines.Add(DateTimeToStr(now));
       //  c.Resume;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
         c.Free;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
         c:=count.Create(true);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
         timer1.Enabled:=false;
    end;end.
      

  5.   

    procedure Count.Countnumner;
    var i:integer;
        uflag:integer;
    begin
         uflag := 0 ;
         for i:=0 to 3000 do
         begin
              // 不是3秒放个时间嘛?一秒==1000毫秒,SO
              //3秒==100*30 个毫秒 ;
              if uflag=30
              begin
                 Memo1.Lines.Add(DateTimeToStr(now));
                 uflag = 0 ;
              end;
              form1.Memo1.Lines.Add(inttoStr(i)+' ');
              sleep(100);
              uflag := uflag +1;
         end;
    end;
     见笑
     方法比较傻;
      

  6.   

    procedure TForm1.SetCaret(RTF: TMemo; var Row, Col: word);
    var
    i, iStopLine, iSelStart: integer;
    begin
      if (RTF = nil) then Exit;
      if Row = 0 then Row := 1;
      if Col = 0 then Col := 1;
     // 到第 Row 列, Col 行共几个字元
        iStopLine := Row - 1;
        iSelStart := 0;
        for i := 0 to RTF.Lines.Count - 1 do
        begin
          if i = iStopLine then
          begin
            if Length(RTF.Lines[i]) >= Col then
              Inc(iSelStart, Col)
            else Inc(iSelStart, Length(RTF.Lines[i]) + 2);
              Break;
          end;
          Inc(iSelStart, Length(RTF.Lines[i]) + 2);
        end;
        if iSelStart > 0 then Dec(iSelStart);
     // 以设定标记的方式指定游标位置
        SendMessage(RTF.Handle, EM_SETSEL, iSelStart, iSelStart);
     // 再次侦测游标位置
        Row := SendMessage(RTF.Handle, EM_LINEFROMCHAR, RTF.SelStart, 0);
        Col := RTF.SelStart - SendMessage(RTF.Handle, EM_LINEINDEX, Row, 0);
      // 卷到游标所在位置
        SendMessage(RTF.Handle, EM_SCROLLCARET, 0, 0);
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    var
      iRow, iCol: word;
    begin
      iRow := 5;
      iCol := 5;
      memo1.Text:=memo1.Text+'['+timetostr(time())+']';
      SetCaret(memo1, iRow, iCol);
      memo1.SetFocus;
    end;