私は、コマンドボタンのキャプションを状態変数として使用するために、私の最後の質問(How to gracefully exit from the middle of a nested subroutine when user cancels?)で正当な重要なフィードバックを受けました。私はそれが効率的なので、一度に2つか3つの目的に少しでも役立ちますが、私はそれが問題を引き起こす可能性があることを理解しています。VB6でボタンキャプションを変数として使用するのはどうですか?
私はこれが独自の議論に値すると思うので、ここではちょっと整理して "正しい"ように修正しました(基本的には文字列を単一の場所に定義してコードが失敗しないようにしています単にコマンドボタンのテキストを変更しただけです)。変数とコントロールの命名規則が悪い(OK、存在しない)ので、事前に申し訳ありません。しかし、私は状態変数の議論としてキャプションに集中しておきたいと思います。
は、だからここに私達は行く:
' Global variables for this form
Dim DoTheThingCaption(1) As String
Dim UserCancel, FunctionCompleted As Boolean
Private Sub Form_Initialize()
' Define the possible captions (is there a #define equivalent for strings?)
DoTheThingCaption(0) = "Click to Start Doing the Thing"
DoTheThingCaption(1) = "Click to Stop Doing the Thing"
' Set the caption state when form initializes
DoTheThing.Caption = DoTheThingCaption(0)
End Sub
Private Sub DoTheThing_Click() ' Command Button
If DoTheThing.Caption = DoTheThingCaption(0) Then
UserCancel = False ' this is the first time we've entered this sub
Else ' We've re-entered this routine (user clicked on button again
' while this routine was already running), so we want to abort
UserCancel = True ' Set this so we'll see it when we exit this re-entry
DoTheThing.Enabled = False 'Prevent additional clicks
Exit Sub
End If
' Indicate that we're now Doing the Thing and how to cancel
DoTheThing.Caption = DoTheThingCaption(1)
For i = 0 To ReallyBigNumber
Call DoSomethingSomewhatTimeConsuming
If UserCancel = True Then Exit For ' Exit For Loop if requested
DoEvents ' Allows program to see GUI events
Next
' We've either finished or been canceled, either way
' we want to change caption back
DoTheThing.Caption = DoTheThingCaption(0)
If UserCancel = True Then GoTo Cleanup
'If we get to here we've finished successfully
FunctionCompleted = True
Exit Sub '******* We exit sub here if we didn't get canceled *******
Cleanup:
'We can only get to here if user canceled before function completed
FunctionCompleted = False
UserCancel = False ' clear this so we can reenter later
DoTheThing.Enabled = True 'Prevent additional clicks
End Sub '******* We exit sub here if we did get canceled *******
だからそれがあります。まだ実際に何かがありますかこのようにするのは悪いですか?それはちょうどスタイルの問題ですか?これらの4つのことをより望ましい、あるいは維持可能な方法で私に与えてくれる何か他のものがありますか?
- ユーザーのボタンを押してアクションがユーザーのためのワンボタンウェイ
- を希望されていない場合は、ユーザーの目にはすでにキャンセルする方法である場所でのアクション
- インスタントGUIからのフィードバックをもたらしたことをインスタントGUIのフィードバック(GUI上の混乱の量を減らす)操作
- をキャンセル/複数のクローズ要求
を防止するためのシンプルな、即時のコマンドボタンの無効化を開始するために私は1つの懸念はトンであるかもしれない見ることができます彼はコードとGUIの間のカップリングを(いくつかの方法で)閉じているので、大きなプロジェクト(または少なくとも大規模なGUI)では大きな問題になる可能性があります。これは、この種の「治療」を受けるボタンが2つまたは3つしかない小規模のプロジェクトです。
UIを削除すると、IMOも同じように動作します。ユーザーと対話するのはそこだけです。 – Deanna