ボタンIndex は「1 〜 12」あるとする。
表示させたいのはそのうちの「3 / 4 / 11 / 12 」とする
ループカウントを回して表示させたいボタンINDEXを指定
その際、ボタンIndexが「飛び飛び」になっている場合
(例)
For a_intCnt = 3 To 4
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
Next a_intCnt
For a_intCnt = 11 To 12
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
Next a_intCnt
最も効率のよいコーディング技法をご教示ください。
if(a_intCnt=3 or a_intCnt=4 or a_intCnt=11 or a_intCnt=12) then
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
end if
これでは駄目ですか?
何の効率?
動作速度? コーディング量? わかりやすさ?
> 表示させたいのはそのうちの「3 / 4 / 11 / 12 」とする
3,4,11,12の4つだけなら、列挙でも良い気がしますよ。
とりあえず、VB6 と仮定すると、
For v In Array(3, 4, 11, 12)
SetProperty PROPERTY_BUTTON, CInt(v)
Next
なんて書き方もあるけど、4回列挙した方が動作効率は良いと思う。多分。
> For v In Array(3, 4, 11, 12)
ちがった、For Each v In Array(3, 4, 11, 12) だ。
変数 v は Variant型。
こんなのもあります。
For a_intCnt = 1 To 12
Select Case a_intCnt
Case 3, 4, 11, 12
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
End Select
Next a_intCnt
4つだけならば、For 〜 Next を使わず、直打ちが 1 番効率的だと思いますが、
敢えて使うとすれば、最初に例に挙がっている...
For a_intCnt = 3 To 4
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
Next a_intCnt
For a_intCnt = 11 To 12
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
Next a_intCnt
が 1 番素直な気がします。
ただし、ループで使用する変数を同一にはしない方が良いですね。
しかし、For〜Nextのコーディング技法を模索している時点で、
製造効率は良くない。orz
必要なのをCollectionにつっこんでForEach…はダメか…しかも既出の予感(orz
3,4,11,12がユーザーインターフェース上常に1つのグループとして
扱われることを意図したのなら、3,4,11,12を同じフレームに入れて
フレームの表示/非表示を制御する方が良いかもしれません。
For a_intCnt = 3 To 4
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
Next a_intCnt
For a_intCnt = 11 To 12
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
Next a_intCnt
というコードは、(3,4), (11,12) という2セットの
ボタンのグループを意識したコードに見えますから、
本当にそういう意味があるときに書くべきコードだと思います。
このようなコードを書くと、時として怒る人もいるが
特に文法的な誤謬は無い。
On Error Resume Next
For a_intCnt = 1 To 12
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
Next a_intCnt
On Error GoTo 0
>>ねろさん
> 特に文法的な誤謬は無い。
でもそれじゃ、動作が異なってしまいますよね。
◎ボタンIndex は「1 〜 12」あるとする。
◎表示させたいのはそのうちの「3 / 4 / 11 / 12 」とする
ボタンIndex自体が、「3 / 4 / 11 / 12 」しか無かったのであれば、
エラー発生を無視する事でも、対応できるかも知れないけど……。
>ボタンIndexが「飛び飛び」になっている場合
失礼、ここしか読みませんでした。謝(^^;
基本的な問題として、Indexの番号でボタンのグループ分けをして
そのままコードを書くと、コードを見ただけで、どのボタンをアクチベート
したのか一目で分らず、コードの見通しが悪くなります。
色々な方法がありますが、とりあえず、
ボタン3〜4のTagプロパティを"GroupA"
ボタン11〜12のTagプロパティを"GroupB"とし、
その他のボタンのTagを"GroupC"とします。
Const MaxCommandButton = 11
Dim tag As String
For n = 0 To MaxCommandButton
tag = Command1(n).tag
If tag = "GroupA" Or tag = "GroupB" Then
Call SetProperty(PROPERTY_BUTTON, a_intCnt)
End If
Next
もしこの様な方法が取れない場合は、一つ一つのボタンのCaptionで
選択した方が良いでしょう。
一番大事なこと書き忘れた。
結局「どういう根拠に基づいて 3,4,11,12を対象に決めたのか」が問題です。
ボタンの表示位置によって決まったものならば、ボタンの表示位置で
振り分ける。
ボタンのCaption によって決まった物ならば、Cationによって場合分け
する。
もし、それがあなたの家族の誕生月だというのなら、あなたの家族の誕生月の
りストをに含まれるかどうかで判定。
まぁ、パフォーマンス上の理由で判定処理をその場で行う余裕がないのなら、「根拠」の部分はコメントに書いておいて、Select Caseで分岐にしますけどね。
自分なら
For a_intCnt = 0 To 1
Call SetProperty(PROPERTY_BUTTON, 3 + a_intCnt )
Call SetProperty(PROPERTY_BUTTON, 11 + a_intCnt)
Next a_intCnt
または
For a_intCnt = 3 To 11 step 8
For b_intCnt = 0 To 1
Call SetProperty(PROPERTY_BUTTON, a_intCnt + b_intCnt)
Next b_intCnt
Next a_intCnt
です。上の方がすき。
あたしゃ、こんな方法を使う。
3/4/11/12のTagプロパティに「V」を入れておく
Dim i As Integer
For i = 0 To Command1.Count - 1
With Command1(i)
If .Tag = "V" Then
.Visible = True
Else
.Value = False
End If
End With
Next i
ツイート | ![]() |