在我的delphi 7应用程序中,代码的一部分冻结或禁用表单上的其他内容

时间:2012-09-28 09:16:07

标签: delphi loops delphi-7

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

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.

如果您愿意,我可以向您发送表格的图片。 如果你能帮助我。

2 个答案:

答案 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) ;