2011-01-26 25 views
1
procedure TForm1.Timer1Timer(Sender: TObject); 
var 
    i : integer; 
begin 
    if i > StrToInt(Edit1.Text) then 
    Timer1.Enabled := False 
    else 
    i :=+ 1; 
    SendClick(645,302); 
    Sleep(2200); 
    SendClick(694,619); 
    Sleep(2200); 
    SendClick(967,638); 
    Sleep(2200); 
    SendKeys('{BKSP}{BKSP}{BKSP}{BKSP}1',False); 
    SendClick(917,688); 
    Sleep(2200); 
    SendClick(917,688); 
    Sleep(2200); 
    SendClick(917,688); 
    amount := StrToInt(Label3.Caption) + 1; 
    Label3.Caption := IntToStr(amount); 
end; 

何らかの理由で1回だけ繰り返すと誰かが問題を見つけることができますか?オーバーとその上に数回行って、私は1つを見ているように見えることはできませんかなり疲れてIVEイム...Delphiタイマー問題

+0

はい、なぜ私が使用するdesidedこと...私はforループを使用することができます知っている...それはforループのように正常に動作します...しかし、それはその完成まで、ダイアログボックスをフリーズタイマー... – Bryan

+0

これは、ループを作るためのいくつかのラウンドアバウトの方法です... – badp

+1

あなたの実際の質問は、SendKeys、SendClick、またはそのナンセンスのせずに、これを正しく行う方法を尋ねることです。 –

答えて

11

Iは初期化されていないローカル変数です(ガベージが含まれています)。したがって、i> StrToInt(Edit1.Text)がランダムである場合の比較結果です。これは、人々は単に無視するだけでなくケースです

type 
    TForm1 = class(TForm) 
    .. 
    private 
    FTimerCount: Integer; 
    FMaxTimerCount: Integer; 
    .. 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
    FTimerCount := 0; 
    FMaxTimerCount := 20; //the timer will fire 20 times. 
    Timer1.Enabled := True; 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
    Inc(FTimerCount); 
    Timer1.Enabled := FTimerCount < FMaxTimerCount; 
    DoOtherStuff(); 
end; 
+0

どうすれば inc(i); Timer1.Enabled:= i StrToInt(Edit1.Text) Timer1.Enabled:= Falseの他 I:= + 1; – Bryan

+0

@Bob:* my * answerをもう一度読んでください。 –

+0

@アンドレアス@Bobには、新しい ':= +'演算子を含むDelphiのベータ版がなければならないと思います。 –

10

ライン

i :=+ 1; 

は(も1として知られている)値+1を代入します変数名はiです。 (それはiが55に等しく、そしてあなたがi :=+ 1を行う場合は、i1に等しくなり、である。)

おそらく、あなたは

i := i + 1; 

または

inc(i); 

を求めていますか?

+0

デルファイは非常に寛容な言語です – Bryan

+1

@ボブ:はい、とSertacとして。 al。正しく指摘すると、 'i'を比較すると、' i'が何であるべきかをコンピュータに知らせていないので、結果は未定義です。 –

+0

-1 - どのようにしても、この無意味な答えは非常に多くのプラスを持っています。その答えはi変数がユニット化されたことです。なぜならイベントの最初の条件はこのローカル変数をテストしているからです。 –

5

iを初期化していません。これはローカル変数です。したがって、タイマーは、メモリの所在が保持する任意の値に応じて、イネーブルまたは非アクティブにすることができます。

+0

ive tryをグローバル変数にして、フォームを作成するときに設定します。 – Bryan

0

:あなたは、自分のフォームのクラスにメンバ変数を追加し、適切な時に初期化し、それは、にOnTimerイベントに何か値です確認したいことがあり

警告メッセージ。 コンパイラがヒントやエラー、警告なしを吐き出すことを望みます。警告は、コンパイラからの短いコミットであり、それはそれ以降のバージョンで修正する必要があります。

乾杯