我的应用程序应生成随机总和计算答案,然后将其放在面板上的编辑框中,然后面板应向下移动并重复(我已完成所有这些)。好的问题是,当面板向下移动时,没有任何其他工作就好像所有东西都被禁用了一样。
unit Unit5;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls, StdCtrls, math, Buttons;
type
TForm1 = class(TForm)
Image1: TImage;
Panel1: TPanel;
Edit1: TEdit;
Panel6: TPanel;
Shape1: TShape;
Panel7: TPanel;
Label1: TLabel;
Edit6: TEdit;
Label2: TLabel;
Button1: TButton;
Image5: TImage;
Edit7: TEdit;
Image2: TImage;
Label3: TLabel;
Timer1: TTimer;
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Image2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
var hori : integer;
vert : integer;
back : integer;
value1 : integer;
value2 : integer;
answer : integer;
star: integer;
stranswer: string;
k : integer;
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
panel1.hide;
panel7.Hide;
back:=0;
star:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
stranswer:= inttostr(answer);
if edit6.Text=stranswer then
begin
star:=star+1;
edit7.text:=inttostr(star);
end;
button1.Caption:='Next';
panel7.Show;
edit6.SetFocus;
panel1.show;
randomize;
hori:=random(840);
value1:=random(10);
value2:=random(10);
panel1.Top:=0;
panel1.Left:=hori;
update;
answer:=value1+value2;
edit1.text:=(' '+inttostr(value1)+' + '+inttostr(value2));
for k:= 1 to 512 do
begin
vert:= vert+1;
panel1.Top:= vert;
update;
sleep(50)
end;
end;
procedure TForm1.Image2Click(Sender: TObject);
begin
back:=1;
form5.Close;
button1.show;
end;
end.
如果您愿意,我可以向您发送表格的图片。 如果你能帮助我。
答案 0 :(得分:3)
您可以在512个单像素步骤中向下移动面板,每步之间有50毫秒的睡眠时间。由于您在此时间内未处理任何消息,因此您的应用程序将无法响应动画面板所需的25秒。程序挂起,因为您无法为消息队列提供服务。
解决方案是使用计时器而不是循环。在Button1Click
中,您需要启动计时器滴答。
procedure TForm1.Button1Click(Sender: TObject);
begin
.....
StartPanelAnimation;
end;
procedure TForm1.StartPanelAnimation;
begin
Panel1.Top := 0;
Timer1.Interval := 50;
Timer1.Enabled := True;
end;
计时器程序如下:
procedure TForm1.PanelAnimationTimerTimer(Sender: TObject);
begin
DoPanelAnimationStep;
if PanelAnimationComplete then
PanelAnimationTimer.Enabled := False;
end;
这些功能如下所示:
procedure TForm1.DoPanelAnimationStep;
begin
Panel1.Top := Panel1.Top+1;
end;
function TForm1.PanelAnimationComplete: Boolean;
begin
Result := Panel1.Top=512;
end;
答案 1 :(得分:0)
如果您希望您的应用程序在完成工作时执行其他操作,则上述示例很好。但是如果你只是希望表单没有锁定,你可以使用
for i := 1 to 100 do // trying to simulate Sleep(n) in a much more primitive way.
Application.ProcessMessages ;
而不是
Update ;
Sleep(50) ;