最も効率の良い For 〜 Next のコーディング技法


xyz  2005-01-28 11:30:00  No: 88077  IP: [192.*.*.*]

ボタン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

最も効率のよいコーディング技法をご教示ください。

編集 削除
ふぁんふぁん大佐  2005-01-28 11:53:29  No: 88078  IP: [192.*.*.*]

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

これでは駄目ですか?

編集 削除
Dental  2005-01-28 11:59:48  No: 88079  IP: [192.*.*.*]

何の効率?
動作速度? コーディング量? わかりやすさ?

> 表示させたいのはそのうちの「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回列挙した方が動作効率は良いと思う。多分。

編集 削除
Dental  2005-01-28 12:00:50  No: 88080  IP: [192.*.*.*]

> For v In Array(3, 4, 11, 12)

ちがった、For Each v In Array(3, 4, 11, 12) だ。
変数 v は Variant型。

編集 削除
LESIA  2005-01-28 12:57:29  No: 88081  IP: [192.*.*.*]

こんなのもあります。
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

編集 削除
じゃんぬねっと  URL  2005-01-28 13:29:07  No: 88082  IP: [192.*.*.*]

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 番素直な気がします。

ただし、ループで使用する変数を同一にはしない方が良いですね。

編集 削除
ふとした疑問  2005-01-28 17:03:44  No: 88083  IP: [192.*.*.*]

しかし、For〜Nextのコーディング技法を模索している時点で、
製造効率は良くない。orz

編集 削除
ガッ  2005-01-28 17:39:01  No: 88084  IP: [192.*.*.*]

必要なのをCollectionにつっこんでForEach…はダメか…しかも既出の予感(orz

編集 削除
ひろ  2005-01-28 19:47:45  No: 88085  IP: [192.*.*.*]

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セットの
ボタンのグループを意識したコードに見えますから、
本当にそういう意味があるときに書くべきコードだと思います。

編集 削除
ねろ  2005-01-28 20:46:44  No: 88086  IP: [192.*.*.*]

このようなコードを書くと、時として怒る人もいるが
特に文法的な誤謬は無い。
On Error Resume Next
For a_intCnt = 1 To 12
    Call SetProperty(PROPERTY_BUTTON, a_intCnt)
Next a_intCnt
On Error GoTo 0

編集 削除
Dental  2005-01-29 16:50:13  No: 88087  IP: [192.*.*.*]

>>ねろさん
> 特に文法的な誤謬は無い。

でもそれじゃ、動作が異なってしまいますよね。

◎ボタンIndex は「1 〜 12」あるとする。
◎表示させたいのはそのうちの「3 / 4 / 11 / 12 」とする

ボタンIndex自体が、「3 / 4 / 11 / 12 」しか無かったのであれば、
エラー発生を無視する事でも、対応できるかも知れないけど……。

編集 削除
ねろ  2005-01-29 18:01:34  No: 88088  IP: [192.*.*.*]

>ボタンIndexが「飛び飛び」になっている場合
失礼、ここしか読みませんでした。謝(^^;

編集 削除
ねろ  2005-01-29 19:05:28  No: 88089  IP: [192.*.*.*]

基本的な問題として、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で
選択した方が良いでしょう。

編集 削除
ひろ  2005-01-31 12:51:38  No: 88090  IP: [192.*.*.*]

一番大事なこと書き忘れた。

結局「どういう根拠に基づいて 3,4,11,12を対象に決めたのか」が問題です。

ボタンの表示位置によって決まったものならば、ボタンの表示位置で
振り分ける。

ボタンのCaption によって決まった物ならば、Cationによって場合分け
する。

もし、それがあなたの家族の誕生月だというのなら、あなたの家族の誕生月の
りストをに含まれるかどうかで判定。

まぁ、パフォーマンス上の理由で判定処理をその場で行う余裕がないのなら、「根拠」の部分はコメントに書いておいて、Select Caseで分岐にしますけどね。

編集 削除
lovejazz  2005-02-02 19:53:45  No: 88091  IP: [192.*.*.*]

自分なら

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

です。上の方がすき。

編集 削除
俺オレ!  2005-02-03 16:03:25  No: 88092  IP: [192.*.*.*]

あたしゃ、こんな方法を使う。

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

編集 削除