0

我的应用程序应该生成一个随机和计算答案,然后将其放在面板上的编辑框中,然后面板应该向下移动并重复(我已经完成了所有这些)。好的,问题是当面板向下移动时,没有其他工作,就好像一切都被禁用了。

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.

如果你愿意,我可以给你发一张表格的照片。如果可以请帮助我。

4

2 回答 2

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;
于 2012-09-28T09:50:39.440 回答
0

如果您希望您的应用程序在执行工作时执行其他操作,则上述示例很好。但是,如果您只是希望表单未锁定,则可以使用

for i := 1 to 100 do   // trying to simulate Sleep(n) in a much more primitive way. 
  Application.ProcessMessages ;

代替

Update ;
Sleep(50) ;
于 2012-09-29T06:17:16.550 回答