• ベストアンサー

VB2008によるコントロール配列

VB初心者でただ今勉強中です。VB2008です。 Form1の中にたくさん(100個くらい)の星(ビットマップデータ)をちりばめ、その星がランダムに点いたり消えたりするプログラムを作成しようとしています。 フォームにPictureBoxを配置して(星.bmp)とします。 その星を100個フォーム上にちりばめたいのですがPictureBoxを100個も置くのはムダな労力です。 それで配列を使いたいのですが、PictureBoxを1つだけフォームに配置してそれをコード上で配列として使う方法がわかりません。 いろいろ調べてみたのですが初心者にはわからない説明ばっかりで途方に暮れています。

質問者が選んだベストアンサー

  • ベストアンサー
  • freetaka
  • ベストアンサー率53% (106/197)
回答No.2

質問者さんのイメージは こんな感じのことができればいいですか? Public Class Form1 Private PicBox() As PictureBox Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load PicBox = New PictureBox(10) {} SuspendLayout() 'PictureBoxの生成と各種パラメータの設定 For i As Integer = 0 To 2 PicBox(i) = New PictureBox PicBox(i).Name = "PictureBox" + i.ToString() 'テスト用に色つけます PicBox(i).BackColor = Color.Red PicBox(i).Size = New Size(20, 20) PicBox(i).Location = New Point(i * 30, 10) Next i 'テスト用にPictureBox3だけずらしてみる PicBox(2).Location = New Point(70, 70) 'フォーム上に追加 Controls.AddRange(PicBox) ResumeLayout(False) End Sub End Class

otaking
質問者

お礼

回答ありがとうございました。 そうです、こんな感じのことがしたかったんです。 これを参考にして完成できました。 回答No.1さんも書いてましたようにControls.AddRenge(PicBox) がポイントなんですね。 ありがとうございました。

その他の回答 (3)

noname#166246
noname#166246
回答No.4

いろいろ分からない点があります。 逆に教えてください。 > PictureBoxを配置して(星.bmp) 星.bmp というファイルがあって、それをPictureBoxに表示するということでしょうか?単純に線で星マークを描くだけではだめなのでしょうか。 その”星”の大きさは単なる点ということではないでしょうね。 ある程度の大きさがある場合は、 星と星が部分的に重なる場合があるかどうか(許すかどうか)を 決めていただかなくてはなりません。 重なりを許すとすると、その重なったときのイメージは どんな感じなのでしょうか? 星の部分だけを重ねたいとなると、ちょっと面倒になってきます。 四角のPictureBoxの前に別のPictureBoxが重なると、 単純には前に来た四角の枠で重なってしまいますから。 また、逆に、重なってはならない、とすると、ランダムに 配置する場合に、いままで作成した星(またはPictureBox)と 重ならないことを確認しなくてはならなくなります。 > PictureBoxを1つだけフォームに配置して とありますが、配置してから行いたいのはなぜでしょうか。 bmpファイルをPictureBoxに設定するといったことも コード上で可能ですから念のためお聞きいたします。

otaking
質問者

お礼

回答ありがとうございます。 >単純に線で星マークを描く~ 何でもよかったのですが、ペイントを使って星の絵を描いてみたのでそれを使いたかっただけです。 >星と星が重なる場合~ そこまで厳密には考えていません、画面上の星が100個ぐらいあればいいという感じなので、別に重なって99や98になってもOKです。 あくまでVBの練習用に自分で作った課題なので。 >PictureBoxを1つだけフォームに配置して~ これは単にピクチャーボックスは「フォームに配置しないとコード上で使えない」と思っていたからです。 今回(回答No.1および2さん)の回答で、フォームに配置しなくてもコード上だけでできることは理解できました。

  • tochansa
  • ベストアンサー率76% (23/30)
回答No.3

こんにちわ。 いろいろ調べられたのでしたら、その中の何が理解できないのかを提示されることをお勧めします。 きっとotakingさんのスキルアップに繋がる返事がきますよー。 さてさて、この件に関してはDOBON.NETさんのところの記事が参考になるんじゃないかと思います。 読んでみて実行してみてくださいませ。 「動的にコントロールの配列を作成する」 http://dobon.net/vb/dotnet/control/buttonarray.html ※フォーム上には一個も置かずにやる形になりそうですけど。。

otaking
質問者

お礼

回答ありがとうございます。 >~何が理解でいないのかを提示~きっとotakingさんのスキルアップに~ その通りなんですけど・・・その記事も調べた中に入っておりました。 が、理解できませんでした、ところどころわからない事だらけで。 まだまだ自分は勉強不足なんでがんばります。

  • talosoft
  • ベストアンサー率26% (6/23)
回答No.1

星を100個用意する方法 for i as integer = 1 to 100 dim newstar as new picturebox = me.picturebox1 dim r as new random newstar.location=new point(r.next(0,me.width-newstar.width),r.next(0,me,height-newstar.height)) me.controls.add(newstar) next ポイントは位置をランダムにすること。 ちなみにコントロールを配列的にあらわす方法はMe.Controlsを使う。

otaking
質問者

お礼

回答ありがとうございました。 Me.Controlsを使うんですね。 (ちなみにこのプログラム例の4行目、・・・me,height・・・   間はコンマではなくピリオドですね)

関連するQ&A

  • VB2005 コントロール配列について教えていただけませんか?

    現在VB2005を用いてプログラムを行なっている初心者です。 ここのサイトでVB2005ではコントロール配列は使用できないことを知りました。そこで、例えばフォーム上にTextBoxを5個配置して、各TextBoxに入力された値を配列に格納するのにはどのようにすれば良いでしょうか? data(0) = textbox1.text data(1) = textbox2.textと一つずつやるしかないでしょうか・・・ For文などを用いて簡単にできる方法を教えてください。 よろしくお願い致します。

  • .net 2010VB配列TextBox貼り付ける

    初めて質問致します。 よろしくお願い致します。 超初心者レベルです。 VB6の時に、Formにテキストボックスやラベルなどを1つ貼り付け、それをコピーすると「配列にするか?」と聞かれていました。 今、.net 2010 VB でテキストボックス(ラベル)をコピーしても、配列にするかどうか聞いてくれません。 プログラム等ではなく、手動でFormに貼り付け時に、配列にする方法を教えて下さい。 (どのプロパティが、配列のインデックスなのかが分かりません。) <(__)>

  • vb2008でもぐらたたきを作りたいのですが

    vb2008でもぐらたたきを作っているのですが、まだまだ初心者なので分からないことだらけです。 フォーム上のスタートボタンを押すことでゲームを開始させ、Timerを用いてPictureBoxを作成し、PictureBoxにもぐらの画像を対応させて、それを指定された数箇所にランダムに表示させたいのですが、どのようにすれば良いのでしょうか。 表示させるもぐらの座標位置は (50,50),(240,50),(430,50) (50,290),(240,290),(430,50) の6つなのですが。 答えていただければ幸いです。

  • Formをロードしたときに

    はじめまして。 VB2005を使っています。 Formをロードしたときに、デザイン画面に配置してある、ButtonやPictureBoxなどのNameプロパティなどを、Object型の配列変数に取得することは可能ですか? どなたか詳しい方ご教授ください。

  • VB2008

    初心者です。よろしくお願いいたします。 現在、VB2008を使い、あるアプリケーションの作成に挑戦中です。 フォーム上にWebBrowserを配置しているのですが、このWebBrowserはVBのプログラム上でのみ操作したいのです。 つまり、キーボード操作、マウス操作を一切無効にするにはどのようにしたら良いでしょうか? フォーム自体にはButtonやtextboxが配置してあり、フォームの下半分にWebBrowserが配置してあります。 WebBrowserのみ操作禁止にしたいのです。 なにぶん、VBを始めてまだ日が浅いので、この操作が難しいのか簡単なのかもわかりません。 昨日から書籍やWEBでいろいろ探したのですが、これと言った内容は見つかりませんでした、よろしくお願いいたします。

  • アクセス+vb 複数コントロールに同じ処理する場合

    アクセス+VBです。 空のフォームにラベルを複数ランダムに配置します。(多ければ500個くらい) そのラベルにクリックイベントを発生させて処理させる場合、ラベルの数だけイベント処理を書かなくてはいけませんよね。 もし、処理内容が同じならひとつの処理記述ですませる方法はないですか。 例えば学校の教室だとすれば、ラベルを机の代わりにしてフォームに配置します。 ラベル(机)をクリックしたら、その生徒のデータが表示される。 良い方法はないでしょうか?

  • VB.NETでフォーム間でのコントロールの参照

    VB.NETでフォーム間でのコントロールの参照が うまくいかず困っています Windows フォーム Form1とForm2があります Form1にはリストビュー(name:ListView1)を配置しています Form1_LoadイベントでListView1にアイテムを追加します Form2を表示し、Form1のListView1のアイテム数を、 取得しようとすると 0 になってしまします どうすればForm2から取得できるのでしょうか? 次のように書いています Form1_Load イベント内 ListView1.Items.Add("Item1") ListView1.Items.Add("Item2") ListView1.Items.Add("Item3") MessageBox.Show(CStr(ListView1.Items.Count), "Form1") Dim Form2 As New Form2() Form2.Show() Form2_Load イベント内 Dim Form1 As New Form1() MessageBox.Show(CStr(Form1.ListView1.Items.Count), "Form2")

  • 配列を使ったビットマップクラス

    VC++を使ったフォームアプリケーションでビットマップなどの画像を表示させ、ピクセル処理を施せるプログラムを作りました。このプログラム上ではピクチャボックスを1つ用意していますが、今後もっと多くのピクチャボックスが必要になってきます。以下のプログラムではBitmapクラスのbmpをピクチャボックス1の画像に入れています。単純にBitmapクラスのbmpを増やせば(例:bmp1)、ピクチャボックスが増えても平気ですが、処理の関係上配列を使いたいと思っています。なので下に書いてあるプログラムのbmp->という部分をbmp[0]->というふうに変えたいと考えています。自分なりに調べて(1)、(2)の部分を変えればいいと思うのですがどうもうまくいきません。わかる方がいたらご教授ください、おねがいします。 #pragma once namespace bmp { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Text; using namespace System::Collections::Generic; /// <summary> /// Form1 の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // bmp = nullptr; ……… (1) //Bitmap^ bmp[300]; }      //省略// #pragma endregion //private: array<Bitmap^>^ bmp = gcnew array<Bitmap^>(300); ……… (2) private: Bitmap^ bmp; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bmp = gcnew Bitmap("C:/Documents and Settings/Owner/デスクトップ/lena.bmp",true); pictureBox1->Image = bmp; } private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) { /*bmp = gcnew Bitmap("C:/Documents and Settings/Owner/デスクトップ/lena.bmp",true);*/ int x,y; int w = bmp->Width; int h = bmp->Height; for(x = 0; x < w; x++){ for(y = 0; y < h; y++){ if(x < (w * 0.05) || y < (h * 0.05) || (y > (h - (h*0.05)))&&(y < h) || (x > (w - (w*0.05)))&&(x < w)){ Color pixelColor = bmp->GetPixel( x, y ); Color newColor = Color::FromArgb( 255, 0, 0 ); bmp->SetPixel( x, y, newColor ); } } } pictureBox1->Image = bmp; } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { } }; }

  • Delphi で配列を使ったimageを表示

    Delphi初心者です。 Form上に同じ内容のbmpファイル(写真)を10回表示したいのですが、手順が全く判りません。 配列の宣言からimageの表示までの手順を教えて頂けないでしょうか。 よろしくお願いします。

  • VB6→VB2005移行におけるpopupmenu機能について

    すみません、VB&VB.net初心者です。 VB系の経験が無いのですが、仕事で現行VB6のソースをVB2005版にポーティングすることになり、色々調べながら進めてますが、壁にあたっております。。 現在は、以下の処理で困っています。 <やりたいこと> Form2上で右クリック押下時にポップアップメニュー (別フォーム(Form1)で作成:“右クリックは無効です”)を表示 <VB6ソース> If Button = vbRightButton Then Form2.PopupMenu Form1.mnuPop End If VisualStudio2005のアップグレードウィザードを使用したところ、 「PopupMenuアップグレードされませんでした」となりました。 ヘルプや検索等調べたところ、ContextmenuまたはContextmenustripを使いましょう、 ということのようなのですが、別フォームを呼び出す例が見当たりません。 (書いてあるけどピンとこなく気付かないのかも知れませんが。。) 実現方法をご存じの方おりましたら、ご教授よろしくお願いいたします。

専門家に質問してみよう