对于一个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.
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.
应该这样写:
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;
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.
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;
见笑
方法比较傻;
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;