none
コントロール配列 RRS feed

  • 質問

  • vb6でコマンドボタンとラベルを各々900ケロードして表を作っておりました。Visual studio2008で当然同じ事が出来ると思っていたのに2008ではコントロール配列がないと知り愕然としております。色々調べて出来る方法があるのは見ましたが、いずれもその方法コードの書き方が解りません。vb6では以下の手順でやりましたがvb2008ではどうやるのかこれに沿って教えて頂けませんか。これが実現できないとvisual studio2008を買った意味もないし今後づっとvb6で行っていいのかの不安があります。よろしくお願い申し上げます。

    vb6   picture boxにcommand buttonを貼り付けindexプロイバティを0にセット。formのloadイベントに

    for n=1 to 900

       load  command1(n)

    next

    だけで良かったのですがどうしてvb2008ではこのように簡単に出来ないのでしょうか。折角の便利な機能を改悪する等利用者無視のマイクロソフトの方針には怒りのぶつけるすべもありません。他にもvb6で複数のformにまたがる変数はmoduleでglobal XXX as integerで定義できたいたのにこれもvb2008ではどこにどう記述するのか解りません。毎日本屋に行きあらゆる書物を見ましたがこのような簡単なことは書いてある本もありません。簡単なことも一々クラスライブラリを参照しないといけないようでこんな製品は到底初心者には使えません。 

     

      

    2014年1月21日 5:39

回答

  • vb6では以下の手順でやりましたがvb2008ではどうやるのかこれに沿って教えて頂けませんか。

    とりあえず、一例ですが、コード的には以下のような感じになると思います。

    Public Class コントロール配列
    
        Private Sub コントロール配列_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            '作成するボタンの数
            Dim button数 = 10
    
            Dim MyButtons = New Button(button数 - 1) {}
    
            Me.SuspendLayout()
    
            For i = 0 To MyButtons.Length - 1
                MyButtons(i) = New Button
                'プロパティ設定
                MyButtons(i).Name = "Button" + i.ToString()
                MyButtons(i).Text = i.ToString()
                MyButtons(i).Tag = i.ToString()
                MyButtons(i).Size = New Size(50, 30)
                MyButtons(i).Location = New Point(i * 50, 100)
                AddHandler MyButtons(i).Click, AddressOf MyButton_Click
            Next i
    
            Me.Controls.AddRange(MyButtons)
    
            Me.ResumeLayout(False)
    
        End Sub
    
        'Buttonのクリックイベントハンドラ
        Private Sub MyButton_Click(ByVal sender As Object, ByVal e As EventArgs)
    
            Dim button = CType(sender, Button)
    
            MessageBox.Show(button.Name + " index: " + button.Tag)
        End Sub
    
    End Class

     

    どうしてvb2008ではこのように簡単に出来ないのでしょうか。折角の便利な機能を改悪する等利用者無視のマイクロソフトの方針には怒りのぶつけるすべもありません。

    VB6もオブジェクト指向言語だと言えなくもないですが、正確にはオブジェクト指向的要素も持ち合わせていると言った方がよいでしょう。これが、.NETになってからVBは本格的なオブジェクト指向言語になりました。VB6で実装されていたコントロール配列は、オブジェクト指向から見れば、極めて異例な実装になります。よって、.NETになってコントロール配列が無くなることは、コード記述の利便性から見れば改悪かもしれませんが、.NETのVBがきちんとしたオブジェクト指向言語に生まれ変わるために必要だったと思います。何かを得るためには何かを捨てなければならないこともあります。1つの側面だけで改悪だと決めつけるのは乱暴だし、悲しいことです。マイクロソフト社という大きな会社で開発している言語です。何かしら理由があるはずですし、そのマインドを知るように努力されると、親近感が増し、より自分のものになるように思います。

    他にもvb6で複数のformにまたがる変数はmoduleでglobal XXX as integerで定義できたいたのにこれもvb2008ではどこにどう記述するのか解りません。

    .NETのVBにもモジュールは存在します。

    連載! とことん VB: 第 14 回 Visual Basic 固有の「モジュール」(Module) の役割
    http://code.msdn.microsoft.com/windowsdesktop/14-Visual-Basic-Module-2c407099

    毎日本屋に行きあらゆる書物を見ましたがこのような簡単なことは書いてある本もありません。簡単なことも一々クラスライブラリを参照しないといけないようでこんな製品は到底初心者には使えません。

    基本的に、VB6と.NETのVBは別物だと思われた方が良いでしょう。つまり、勉強が必要です。特にオブジェクト指向周りの概念を身に付ける必要があります。ただ、.NETのVBでもVB6からの移行者を考慮してか、VB6のようにコードを書いても、裏でコード自動生成するなどして、オブジェクト指向をあまり意識しなくても動作するような仕組みが取り入れられています。これには賛否両論がありますが、いずれにしても隠しているだけで、ちゃんとしたオブジェクト指向に従っています。
    本格的なオブジェクト指向になって、敷居が高く感じられる部分があることは仕方のないことだと思います。しかし、それ以上にその敷居を乗り越えれば、VB6よりも広大な世界が広がります。VB6と比較する気持ちはわかりますが、比較せず、新たにVBを学ぶつもりの方が良いのではないかと思います。そして、その際にVB6での知識経験は、大きなアドバンテージになることでしょう。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年1月22日 2:41
    • 回答としてマーク 星 睦美 2014年1月24日 1:05
    2014年1月21日 8:23
    モデレータ

すべての返信

  • だけで良かったのですがどうしてvb2008ではこのように簡単に出来ないのでしょうか。折角の便利な機能を改悪する等利用者無視のマイクロソフトの方針には怒りのぶつけるすべもありません。他にもvb6で複数のformにまたがる変数はmoduleでglobal XXX as integerで定義できたいたのにこれもvb2008ではどこにどう記述するのか解りません。
    VB6の知識はどのようにして身に付けたのでしょうか? これでは「日本語は簡単なのに英語をしゃべるにはいちいち辞書を引かなければいけない」と言っているのと何ら変わりがありません。
    vb6でコマンドボタンとラベルを各々900ケロードして表を作っておりました。
    コントロール配列を作ることはできますが、それよりも900個もコントロールが並ぶという人間離れした画面設計を見直すことをお勧めします。私はそのような画面を見たことがありません。例えばキーボードですら高々100キーなのにその9倍だなんて…。質問者さんはそのような画面が一般的だとお考えなのでしょうか? 怒りをぶつける先がおかしいです。
    2014年1月21日 5:53
  • vb6ではコントールは900ケ必要でも1ケ貼り付ければ済んでいました。indexプロパティを0に設定すればあとはformのloadイベントに先に書いたような記述で自動的に900ケロードされました。900必要云々は別問題です。各コントロールの動作はindex番号を引数にして渡してやってそのコントールのイベントにindex4ならこういう動作と記述していただけです。私はvb6で簡単に出来ていたのだから何故それをvb2008ではようわざわざ改悪したのに腹をたてているだけです。マイクロソフト関係者がこの記事を見たならせめてvb2008での実現方法を解り易く書いてくれるのが罪償いと思い投稿しただけです。有料サポートは33、090円と言われ唖然としました。
    2014年1月21日 6:22
  • 2008にコントロール配列ないのであれば、それっぽい動作をする関数を
    自分で書けばよいだけの様な気がします。

    Private Function Command1(ByVal index As Integer) As Button
        // "Command"+indexを作成
        Return DirectCast(My.Controls("Command" & index.ToString), Button)
    End Function

    てな感じかもしれません。

    2014年1月21日 6:39
  • gosekiten さま よろしく。

    愚痴を溢すそのお気持ちは分からないではありませんが。

    vb6 ... vs2008 で当然同じ事が出来ると思っていたのに > は止めましょう。
    確認しないで、思い込みだけで買われたのですか? と突っ込まれますよ。

    折角、購入なさったのですから、是非、新しい(既に旧バージョンですが)言語に慣れて下さい。
    私も、別言語から、来た口です。
    別の言語だと思って、もう一度、知識を習得して下さい。 素地はある訳ですから。
    別言語だと思えば、書き方が違うし、別のアプローチがある事もご理解戴けるのではないでしょうか。
    無理をして vb6 での考え方を .Net に載せるより、
    新しい言語に沿ったアプローチを探されては如何ですか。

    表 との事なので、ListView もしくは DataGridView を利用する事になるかと思いますが、
    時間的に許すなら、一旦、本件から離れて、VB2008 での書き方に慣れる事をお勧めします。

    また、複数のformにまたがる変数は、スタートアップのクラスのソース冒頭に、
     Friend xxx as integer
    で如何でしょうか。

    • 編集済み ShiroYuki_Mot 2014年1月21日 8:35 てにをは修正 と 語句変更
    • 回答の候補に設定 星 睦美 2014年1月22日 2:43
    2014年1月21日 7:27
  • vb6では以下の手順でやりましたがvb2008ではどうやるのかこれに沿って教えて頂けませんか。

    とりあえず、一例ですが、コード的には以下のような感じになると思います。

    Public Class コントロール配列
    
        Private Sub コントロール配列_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            '作成するボタンの数
            Dim button数 = 10
    
            Dim MyButtons = New Button(button数 - 1) {}
    
            Me.SuspendLayout()
    
            For i = 0 To MyButtons.Length - 1
                MyButtons(i) = New Button
                'プロパティ設定
                MyButtons(i).Name = "Button" + i.ToString()
                MyButtons(i).Text = i.ToString()
                MyButtons(i).Tag = i.ToString()
                MyButtons(i).Size = New Size(50, 30)
                MyButtons(i).Location = New Point(i * 50, 100)
                AddHandler MyButtons(i).Click, AddressOf MyButton_Click
            Next i
    
            Me.Controls.AddRange(MyButtons)
    
            Me.ResumeLayout(False)
    
        End Sub
    
        'Buttonのクリックイベントハンドラ
        Private Sub MyButton_Click(ByVal sender As Object, ByVal e As EventArgs)
    
            Dim button = CType(sender, Button)
    
            MessageBox.Show(button.Name + " index: " + button.Tag)
        End Sub
    
    End Class

     

    どうしてvb2008ではこのように簡単に出来ないのでしょうか。折角の便利な機能を改悪する等利用者無視のマイクロソフトの方針には怒りのぶつけるすべもありません。

    VB6もオブジェクト指向言語だと言えなくもないですが、正確にはオブジェクト指向的要素も持ち合わせていると言った方がよいでしょう。これが、.NETになってからVBは本格的なオブジェクト指向言語になりました。VB6で実装されていたコントロール配列は、オブジェクト指向から見れば、極めて異例な実装になります。よって、.NETになってコントロール配列が無くなることは、コード記述の利便性から見れば改悪かもしれませんが、.NETのVBがきちんとしたオブジェクト指向言語に生まれ変わるために必要だったと思います。何かを得るためには何かを捨てなければならないこともあります。1つの側面だけで改悪だと決めつけるのは乱暴だし、悲しいことです。マイクロソフト社という大きな会社で開発している言語です。何かしら理由があるはずですし、そのマインドを知るように努力されると、親近感が増し、より自分のものになるように思います。

    他にもvb6で複数のformにまたがる変数はmoduleでglobal XXX as integerで定義できたいたのにこれもvb2008ではどこにどう記述するのか解りません。

    .NETのVBにもモジュールは存在します。

    連載! とことん VB: 第 14 回 Visual Basic 固有の「モジュール」(Module) の役割
    http://code.msdn.microsoft.com/windowsdesktop/14-Visual-Basic-Module-2c407099

    毎日本屋に行きあらゆる書物を見ましたがこのような簡単なことは書いてある本もありません。簡単なことも一々クラスライブラリを参照しないといけないようでこんな製品は到底初心者には使えません。

    基本的に、VB6と.NETのVBは別物だと思われた方が良いでしょう。つまり、勉強が必要です。特にオブジェクト指向周りの概念を身に付ける必要があります。ただ、.NETのVBでもVB6からの移行者を考慮してか、VB6のようにコードを書いても、裏でコード自動生成するなどして、オブジェクト指向をあまり意識しなくても動作するような仕組みが取り入れられています。これには賛否両論がありますが、いずれにしても隠しているだけで、ちゃんとしたオブジェクト指向に従っています。
    本格的なオブジェクト指向になって、敷居が高く感じられる部分があることは仕方のないことだと思います。しかし、それ以上にその敷居を乗り越えれば、VB6よりも広大な世界が広がります。VB6と比較する気持ちはわかりますが、比較せず、新たにVBを学ぶつもりの方が良いのではないかと思います。そして、その際にVB6での知識経験は、大きなアドバンテージになることでしょう。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年1月22日 2:41
    • 回答としてマーク 星 睦美 2014年1月24日 1:05
    2014年1月21日 8:23
    モデレータ
  • 愚痴は無意味なのは重々解っていますが、vb2008は余りにひどすぎる、オブジェクト指向だから仕方ない、でも膨大なオブジェクトからこういう動作をさせたいと思うときどうやって該当のオブジェクトを選べというのでしょう。またvb6からのコンバージョンツールもあれはステートメントを単にvb2008に書き換えただけで、コンバートできないところはできないここを見よと言っているだけです。本当にコンバージョンするなら全てコンバートして内部で自動デバッグして動くようにして渡すべきです。vb。netとvb2008のパッケージ二つで10万超えたのです。しかも解らないところは電話サポート1件33、090円です。回答が不適切でも電話かけただけで33090円取られます。難しく不親切に作ってサポートで儲けるこの姿勢は絶対許せるものではありません。それは冗談ですが客、利用者を先ず考える、自分の都合は二の次です。friend定義でも当然駄目でした。

    • 編集済み 星 睦美 2014年1月22日 4:41 一部内容を削除させていただきました。
    2014年1月22日 1:45
  • F.Y.I.
    --------------------------------------------------
    https://om2.one.microsoft.com/OPA/htmlpages/TC/TC-ja-jp.htm#toc02

    2. マイクロソフトのライセンスおよびライセンス料金の返金に関する情報

    Microsoft ソフトウェアは、販売対象ではなくライセンスの対象となります。お客様のご注文になられたソフトウェア (付属するメディアおよびドキュメントまたは印刷物) のすべての所有権、権利、知的財産権 (存在する場合) は、マイクロソフトまたはそのサプライヤに帰属します。すべてのご注文には、製品に含まれる該当ライセンスに対するお客様の承諾がなされることを条件とします。ライセンスの条項に同意しない場合、納品後 30 日以内に製品を返品できます。製品を返品する場合は、マイクロソフトに連絡し、複製されておらず損傷のないソフトウェア、すべてのドキュメント、および購入を証明する書類を第 1 種郵便で郵送してください。
    ソフトウェアを使用する場合、またはライセンスに対する承諾または同意としてパッケージまたはソフトウェアに記載されているその他の行為を行う場合、お客様はライセンスに同意したとものみなされ、ソフトウェアに付属する文書に明記されている場合を除き、返金を受けることはできません この返金は、ライセンス条項がお客様に該当しない場合、および製品に対する支払いを行う前に完全なライセンスを確認できなかった場合にソフトウェアを返品できるようにすることを目的としています。マイクロソフトは、お客様が製品に満足されない場合も返金に応じます。マイクロソフトにご連絡ください。配送料は、(該当する場合) 返金されない場合があります。
    --------------------------------------------------

    2014年1月22日 2:15
  • gosekiten さま 噛み付かれてしまいましたね。

    う~ん。 どう、返信したら良いのか。

    私が伝えたかったのは、コンバートや部分修正に頼らずに、
    全て、新しい言語(.net)に沿う形で、再構築をなさった方が良いのでは、
    という事です。
    無論、今迄の方法論は、使えなくなるので、ご指摘の様な不便はあると思います。

    しかし、考えて見て下さい。
    vb6 から .net に移行して、既に何年も経っていますし、VB も更にヴァージョンアップされています。
    ここでご回答の多くの方々は、これらを乗り越え、知識を習得なさっている筈です。
    どうやって該当のオブジェクトを選べというのでしょう > をクリヤされています。
    gosekiten さま の様なお考えの方が多ければ、既に、マイクロソフトも舵を切っているとは思いませんか。 商売ですから。

    お馬鹿 さまがご指摘なさった様な方法もある様ですし。

    私の立ち位置と似た形で、trapemiya さまが細かく分かり易く書いておられます。 頑張ってと。

    個人的な感想は、実は、冒頭に 佐祐理 さまが書かれた内容にとても近いのですけど。 まぁ、それを言っちゃぁね。

    • 編集済み ShiroYuki_Mot 2014年1月23日 1:48 噛み付くと感じた部分 Moderator さまが削除
    2014年1月22日 3:25
  • フォーラム オペレーターの星 睦美です。
    gosekiten さん、投稿ありがとうございます。

    こちらのMSDN フォーラムはユーザー同士が技術的な情報交換を行うコミュニティを目的としています。
    プログラミングに関して参考になりそうなアドバイスに私のほうで[回答の候補に設定] させていただきました。

    Visual Studio 2008 を含めたマイクロソフト への製品に関するご意見やご要望に関しては、お問い合わせ先のページからマイクロソフトのカスタマー サービスへ電話、チャット または Web フォームからお問い合わせができます。(カスタマーサービスでは技術的な質問は承りませんのでご了承ください。)

    お馬鹿 さんのライセンスに関する参考情報を補足させていただきますと、ページに表示の最終更新日付が2006年5月(Last Updated: 5/18/2006) とあり、その後に内容が変更されている可能性があります。まずはお持ちのVisual Studio 2008 のライセンス条項をご確認いただければと思います。確認のためのWeb ページがありますのでリンクしておきます。

    マイクロソフトまたはコンピューター製造業者によりライセンスされたマイクロソフト ソフトウェアのエンド ユーザー ライセンス条項の検索:

    すでにご覧いただいているかも知れませんが、MSDN ライブラリに「Visual Basic 6.0 ユーザーのための Visual Basic .NET 移行ガイド 」が公開されています。こちらの内容がgosekiten さんのお役にたちましたら幸いです。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年1月22日 4:55
    1. 「色々調べて出来る方法があるのは見ましたが、いずれもその方法コードの書き方が解りません。」は、個人の理解力の問題であり、言語製品の問題ではありません。たとえば、「vb コントロール配列」で検索すると、どぼんさんのところにコードも書いてあります。
    2. 「しかも解らないところは電話サポート1件33、090円です。回答が不適切でも電話かけただけで33090円取られます。」は、明らかに誤りです。料金が発生するのはインシデントの単位であり、電話の回数ではありません。
      また、33,090円というのも、おかしいです。開発製品のプロフェッショナル サポートは、31,800円となっています。税抜きですが、5% の税金を加えると33,390円です。金額が一致しません。
      さらに、このスレッド内で要求されている「vb2008での実現方法を解り易く書いてくれる」という目的はサポート対象外の「プログラム開発の請負とサンプル作成」に該当します。最初の投稿の内容でも、サポート対応範囲である「仕様確認」に収まるかどうか、微妙です。むしろ、プレミア サポートの範囲でしょう。

    Jitta@わんくま同盟


    • 編集済み 星 睦美 2014年1月24日 0:59 参考情報として編集させていただきました。
    2014年1月23日 12:32
  • 返信いただいた皆様ありがとうございます。コントロール配列を作成する例や、VB6から.NET プログラミングに進む際のアドバイスをgosekiten さんにも参考していただけたのではないかと思います。

    gosekiten さん、
    今回は私から[回答としてマーク] させていただきました。回答の内容に質問がありましたら、新しい質問の投稿をお願いします。
    それでは今後ともMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年1月24日 1:27