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 に答える