(私はVB6を使用していますが、これは他のほとんどの言語で表示されると思います)ユーザーがキャンセルしたときにネストされたサブルーチンの途中から正常に終了するにはどうすればいいですか?
GUIボタンが表示され、1〜2分かかることがあります。私は、ちょっとしたユーザーがボタンを2回クリックして、いつでもルーチンから正常に退出できるようにしたいと思います。
私は静的変数を使ってこの作業をかなりうまく行いましたが(以下のコードを参照してください)、私はプロジェクトをクリーンアップしていますが、For/Nextループを独自の関数に入れたいと思っています。プロジェクトの場所。
しかし、これを実行するとfor/nextに埋め込まれた静的フラグが破損するため、いくつかの変更を加える必要があります。私は公的(世界的)な変数を持っていることを前に、私はこの問題に直面したときに他の(よりスマートで、おそらく実際にCS教育を受けた)人々がしたことを尋ねると思った。
Private Sub DoSomething_Click()
Static ExitThisSub As Boolean ' Needed for graceful exit
If DoSomething.Caption = "Click To Stop Doing Something" Then
ExitThisSub = False ' this is the first time we've entered this sub
Else ' We've re-entered this routine (user clicked on button to stop it)
ExitThisSub = True ' Set this so we'll see it when we exit this re-entry
Exit Sub '
End If
DoSomething.Caption = "Click To Stop Doing Something"
For i = 0 To ReallyBigNumber
Call DoingSomethingSomewhatTimeConsuming
If ExitThisSub = True Then GoTo ExitThisSubNow
DoEvents
Next
' The next line was missing from my original example,
' prompting appropriate comments
DoSomething.Caption = "Click To Do Something"
Exit Sub
ExitThisSubNow:
ExitThisSub = False ' clear this so we can reenter later
DoSomething.Caption = "Click To Do Something"
End Sub
私が移動すると、独自の機能へ/次のforループ:
だから基本的に私の質問は、私はこれを複製行う方法ですか?
私はExitThisSubを新しいfor/next subとDoSomething_Clickを同じ方法で終了するパブリック変数QuitDoingSoManyLongCalculationsに変更すると考えています。
しかし、グローバル変数を使用すると、私はいつもアマチュアのように感じます。より洗練されたソリューションはありますか?
...フォームのスコープを持つ静的オブジェクトでは、いくつかのリスクを紹介しますが、「正しい」方法でそれを行うと、より多くのコードを追加します。私は、両方の世界のベストは、ボタンのテキストをコード内で定義し、その全体を使っていると思います。それはどこでも変わります。 –
私が気づいているブレイクコマンドはありませんが、あなたは私にそれを見させて、 "Exit For"を使用していなければなりません。 クリーンアップコードは「Exit Sub」の後に来るため、誤って実行することはできません。私はそれがそうしたのは、他の人がそれをやっているのを見たことがあるからです。それが理想的であるかどうかは考えられませんでした。 –
コントロールのtagプロパティを使用することもできます。 –