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


xyz  2005-01-28 20:30:00  No: 88077

ボタン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 20:53:29  No: 88078

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 20:59:48  No: 88079

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

> 表示させたいのはそのうちの「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 21:00:50  No: 88080

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

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


LESIA  2005-01-28 21:57:29  No: 88081

こんなのもあります。
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 22:29:07  No: 88082

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-29 02:03:44  No: 88083

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


ガッ  2005-01-29 02:39:01  No: 88084

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


ひろ  2005-01-29 04:47:45  No: 88085

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-29 05:46:44  No: 88086

このようなコードを書くと、時として怒る人もいるが
特に文法的な誤謬は無い。
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-30 01:50:13  No: 88087

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

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

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

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


ねろ  2005-01-30 03:01:34  No: 88088

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


ねろ  2005-01-30 04:05:28  No: 88089

基本的な問題として、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 21:51:38  No: 88090

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

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

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

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

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

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


lovejazz  2005-02-03 04:53:45  No: 88091

自分なら

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-04 01:03:25  No: 88092

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加