不要跟我抢分,瓦咔咔: unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Label1: TLabel; procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormShow(Sender: TObject); procedure doloop; private { Private declarations } public { Public declarations } end;var Form1: TForm1; isloop:boolean; implementation{$R *.dfm}procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if key=' ' then begin isloop:= not isloop; doloop; end; end;procedure TForm1.FormShow(Sender: TObject); begin isloop:=false; end;procedure TForm1.doloop; var i:integer; begin for i:=1 to 100000 do begin Application.ProcessMessages; if isloop then label1.caption := inttostr(i) else break; end; end; end.
简单在窗口的onkeypress中写如下代码begin if keypress = #13 and Num = 0 then begin for i:=1 to 100000 do label1.caption := inttostr(i); Num = Num + 1; end else if keypress = #13 and Num = 1 then begin Self.update; Num = 0; Exit; end; end;
只说三个语法错误: 1:keypress应为key 2: num=num+1应为num=num+1 3: if keypress = #13 and Num = 0 then 应为if (keypress = #13) and (Num = 0) then 而且就算改过来好像也不行,不知二楼的发贴前试过没有
但是 如果 for i:=1 to 100000 do 没有执行完,程序根本不响应第二次按空格键, 也就是每次都在 100000处中止循环
这就是程序里加Application.ProcessMessages这句话的原因了
2: num = num+1 应为 num := num +1; Num = 0 应为 Num := 0 就算改过来,二楼也是错的
谢谢各位,我担心当正在访问bool变量的时候,该变量的值发生变化,会不会引起程序的异常
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Label1: TLabel; procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormShow(Sender: TObject); procedure doloop; private { Private declarations } public { Public declarations } end;var Form1: TForm1; isloop:boolean; implementation{$R *.dfm}procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if key=' ' then begin isloop:= not isloop; doloop; end; end;procedure TForm1.FormShow(Sender: TObject); begin isloop:=false; end;procedure TForm1.doloop; var i:integer; begin for i:=1 to 100000 do begin Application.ProcessMessages; if isloop then label1.caption := inttostr(i) else break; end; end; end.d7测试通过
unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;type TRunStatus = (rsRun, rsStop, rsExit); TForm1 = class(TForm) Panel1: TPanel; procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } FStatus: TRunStatus; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin case FStatus of rsRun: FStatus := rsStop; rsStop: FStatus := rsRun; end; Randomize; while True do begin Application.ProcessMessages; if FStatus = rsExit then Break; if FStatus = rsStop then Continue; Panel1.Caption := IntToStr(Random(100)); end; end;procedure TForm1.FormCreate(Sender: TObject); begin UpdateWindow(Self.Handle); FStatus := rsStop; end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FStatus := rsExit; end;end. 看看这个怎样?
这个其实很简单用:piao9wu(飘麟霄骥) 的这点代码就可以了。
兴趣来了,又改造了一下! unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons;type TRunStatus = (rsRun, rsStop, rsExit); TForm1 = class(TForm) pnlResult: TPanel; edtLength: TEdit; //用于得到随机数字的长度 btnStart: TSpeedButton; //用于发送开始信号 procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btnStartClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FStatus: TRunStatus; function RandomLuckyNO: String; public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #32 then //空格,开始和停止状态 case FStatus of rsRun: FStatus := rsStop; rsStop: FStatus := rsRun; end; if Key = #13 then //回车,退出循环 FStatus := rsExit; end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FStatus := rsExit; end;procedure TForm1.btnStartClick(Sender: TObject); begin btnStart.Visible := False; edtLength.Visible := False; try FStatus := rsStop; Randomize; while True do begin Application.ProcessMessages; if FStatus = rsExit then Break; if FStatus = rsStop then Continue; pnlResult.Caption := RandomLuckyNO; Sleep(10); //这个随便了 end; finally btnStart.Visible := True; edtLength.Visible := True; end; end;function TForm1.RandomLuckyNO: String; var i: Integer; iNOLen: Integer; begin iNOLen := StrToIntDef(edtLength.Text, 6); Result := ''; for i := 1 to iNOLen do begin Result := Result + IntToStr(Random(10)); end; end;procedure TForm1.FormCreate(Sender: TObject); begin //用于控制长度编辑框里只能输入数字 SetWindowLong(edtLength.Handle, GWL_STYLE, GetWindowLong(edtLength.Handle, GWL_STYLE) or ES_NUMBER); end;end.
var H: Handle = 0; procedure dosomething; begin for x to y do do........ end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if not (key in[#$20,#$13]) then exit; if H > 0 then SuspendThread(H); else CreateThread(nil,0,@dosomething,nil,H); end;
如果你要退出单层循环的话,加个Break;语句就行了,多层用goto 标签名;吧
多线程的来了,呵呵unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) btn_start: TButton; Label1: TLabel; btn_stop: TButton; procedure btn_startClick(Sender: TObject); procedure btn_stopClick(Sender: TObject); private { Private declarations } public { Public declarations } end; TDisPlay=class(TThread) protected procedure Execute;override; end; var Form1: TForm1; DisThread:TDisPlay;implementation{$R *.dfm}procedure TDisPlay.Execute; var i:integer; begin i:=0; for i:=1 to 100000 do begin if Terminated then break; Form1.label1.caption := inttostr(i); sleep(1); end; end;procedure TForm1.btn_startClick(Sender: TObject);begin DisThread:=TDisPlay.Create(False); end;procedure TForm1.btn_stopClick(Sender: TObject); begin DisThread.Destroy; end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormShow(Sender: TObject);
procedure doloop;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
isloop:boolean;
implementation{$R *.dfm}procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=' ' then
begin
isloop:= not isloop;
doloop;
end;
end;procedure TForm1.FormShow(Sender: TObject);
begin
isloop:=false;
end;procedure TForm1.doloop;
var i:integer;
begin
for i:=1 to 100000 do
begin
Application.ProcessMessages;
if isloop then label1.caption := inttostr(i) else break;
end;
end;
end.
if keypress = #13 and Num = 0 then begin
for i:=1 to 100000 do
label1.caption := inttostr(i);
Num = Num + 1;
end else if keypress = #13 and Num = 1 then begin
Self.update;
Num = 0;
Exit;
end;
end;
1:keypress应为key
2: num=num+1应为num=num+1
3: if keypress = #13 and Num = 0 then 应为if (keypress = #13) and (Num = 0) then
而且就算改过来好像也不行,不知二楼的发贴前试过没有
如果 for i:=1 to 100000 do 没有执行完,程序根本不响应第二次按空格键,
也就是每次都在 100000处中止循环
就算改过来,二楼也是错的
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormShow(Sender: TObject);
procedure doloop;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
isloop:boolean;
implementation{$R *.dfm}procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=' ' then
begin
isloop:= not isloop;
doloop;
end;
end;procedure TForm1.FormShow(Sender: TObject);
begin
isloop:=false;
end;procedure TForm1.doloop;
var i:integer;
begin
for i:=1 to 100000 do
begin
Application.ProcessMessages;
if isloop then label1.caption := inttostr(i) else break;
end;
end;
end.d7测试通过
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;type
TRunStatus = (rsRun, rsStop, rsExit);
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FStatus: TRunStatus;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case FStatus of
rsRun: FStatus := rsStop;
rsStop: FStatus := rsRun;
end; Randomize;
while True do
begin
Application.ProcessMessages;
if FStatus = rsExit then Break;
if FStatus = rsStop then Continue;
Panel1.Caption := IntToStr(Random(100));
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
UpdateWindow(Self.Handle);
FStatus := rsStop;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FStatus := rsExit;
end;end.
看看这个怎样?
unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons;type
TRunStatus = (rsRun, rsStop, rsExit);
TForm1 = class(TForm)
pnlResult: TPanel;
edtLength: TEdit; //用于得到随机数字的长度
btnStart: TSpeedButton; //用于发送开始信号
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnStartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FStatus: TRunStatus;
function RandomLuckyNO: String;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #32 then //空格,开始和停止状态
case FStatus of
rsRun: FStatus := rsStop;
rsStop: FStatus := rsRun;
end;
if Key = #13 then //回车,退出循环
FStatus := rsExit;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FStatus := rsExit;
end;procedure TForm1.btnStartClick(Sender: TObject);
begin
btnStart.Visible := False;
edtLength.Visible := False;
try
FStatus := rsStop;
Randomize;
while True do
begin
Application.ProcessMessages;
if FStatus = rsExit then Break;
if FStatus = rsStop then Continue;
pnlResult.Caption := RandomLuckyNO;
Sleep(10); //这个随便了
end;
finally
btnStart.Visible := True;
edtLength.Visible := True;
end;
end;function TForm1.RandomLuckyNO: String;
var
i: Integer;
iNOLen: Integer;
begin
iNOLen := StrToIntDef(edtLength.Text, 6);
Result := '';
for i := 1 to iNOLen do
begin
Result := Result + IntToStr(Random(10));
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
//用于控制长度编辑框里只能输入数字
SetWindowLong(edtLength.Handle, GWL_STYLE, GetWindowLong(edtLength.Handle, GWL_STYLE) or ES_NUMBER);
end;end.
这个其实很简单用:piao9wu(飘麟霄骥) 的这点代码就可以了。
-------------------------------------------------------------
拜托,那是我的代码好不好,看青一楼的回帖先
var
H: Handle = 0;
procedure dosomething;
begin
for x to y do
do........
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in[#$20,#$13]) then exit;
if H > 0 then
SuspendThread(H);
else
CreateThread(nil,0,@dosomething,nil,H);
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
btn_start: TButton;
Label1: TLabel;
btn_stop: TButton;
procedure btn_startClick(Sender: TObject);
procedure btn_stopClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; TDisPlay=class(TThread)
protected
procedure Execute;override;
end;
var
Form1: TForm1;
DisThread:TDisPlay;implementation{$R *.dfm}procedure TDisPlay.Execute;
var
i:integer;
begin
i:=0;
for i:=1 to 100000 do
begin
if Terminated then break;
Form1.label1.caption := inttostr(i);
sleep(1);
end;
end;procedure TForm1.btn_startClick(Sender: TObject);begin
DisThread:=TDisPlay.Create(False);
end;procedure TForm1.btn_stopClick(Sender: TObject);
begin
DisThread.Destroy;
end;end.