- ベストアンサー
C++BuilderXE2starterでbmpやImageの配列を引数に渡す方法
- C++BuilderXE2starterでビットマップ(bmp)やTImageを配列で定義し、関数の引数として渡す方法を教えてください。
- bmpやImageを配列で定義し、関数の引数として渡すことができます。以下は正しい使い方の例です。
- 最終的にやりたいスタイルを実現するために、bmpとImageの配列のサイズと位置を設定し、関数を呼び出すことで描画することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
おそらく、やりたいことは次のようなコートだと思います。 void sub2(TBitmap* bmp[10], TImage* image[10]) { for (int i = 0; i < 10; ++i) image[i]->Canvas->Draw(0, 0, bmp[i]); } void __fastcall TForm1::FormClick(TObject *Sender) { TBitmap* bmp[10]; TImage* image[10]; for (int i = 0; i < 10; ++i) { bmp[i] = new TBitmap(); bmp[i]->LoadFromFile(IntToStr(i) + ".bmp"); image[i] = new TImage(this); image[i]->Parent = this; image[i]->Left = i * 32; image[i]->Top = 0; image[i]->Height = 32; image[i]->Width = 32; } sub2(bmp, image); for (int i = 0; i < 10; ++i) delete bmp[i]; } せっかくC++を使うなら配列よりもstd::arrayやstd::vectorなどを使った方がいいと思います。 画像ファイルを表示するだけなら次のようにかけます。 void __fastcall TForm1::Button1Click(TObject *Sender) { for (int i = 0; i< 10; ++i) { TImage* image = new TImage(this); image->Parent = this; image->Left = i * 32; image->Top = 0; image->Height = 32; image->Width = 32; image->Picture->LoadFromFile(IntToStr(i) + ".bmp"); } }
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
C++Builder は全然知らんのだけど, TImage::Image とか TImage::TImage って存在するの? 4つ目 (29行目) のエラーはこれらとは全然関係なくって, 単に「配列の渡し方を理解しているかどうか」だけの問題.
お礼
引き続き C++Builder をご存知の方のご返事をお待ちします。
- Tacosan
- ベストアンサー率23% (3656/15482)
・unit.h で TForm1::sub2 が宣言されていないのはなぜ? ・TForm1::sub2 の中にある Image ってなに? Free は for で回さないとだめだね.
お礼
ご返事ありがとうございます。 投稿時にミスがあったようです。現在のコードとそのエラーを開示します。 未定義のシンボルImageがよくわからないです。 [BCC32 エラー] Unit1.cpp(21): E2451 未定義のシンボル Image *1 [BCC32 エラー] Unit1.cpp(21): E2451 未定義のシンボル Imagenum *2 [BCC32 エラー] Unit1.cpp(26): E2303 型名が必要 *3 他に下記エラー等もあるが、上記と関連していると思います [BCC32 エラー] Unit1.cpp(29): E2034 'TBitmap *' 型は 'TBitmap * *' 型に変換できない unit.h 抜粋 private: // ユーザー宣言 void TForm1::sub2(Graphics::TBitmap **bmp, TImage **Image); unit1.cpp void __fastcall TForm1::onclick(TObject *Sender) { int n; Graphics::TBitmap *bmp[10]; TImage::Image *Imagenum[10]; // *1,*2 for(n=0;n<10;n++){ bmp[n]=new Graphics::TBitmap(); Imagenum[n]=new TImage::TImage; //*3 (*1,*2正しくないから?) } sub2(*bmp,*Imagenum); for(n=0;n<10;n++){ Free(bmp[n]); Free(Imagenum[n]); } } //--------------------------------------------------------------------------- void TForm1::sub2(Graphics::TBitmap *bmp[], TImage *Imagenum[]) { Imagenum[0]->Canvas->Draw(0,0,bmp[0]); Imagenum[1]->Canvas->Draw(0,0,bmp[1]); }
お礼
T.yamamoto様(お世話になっている方のイニシアルに覚えがありますが・・)ご返事ありがとうございます。 書き方はわかりました。意味も大体わかりました。 記法のバラエティとして以下を確認しました。 ・image[i] = new TImage(this);→image[i] = new TImage(Form1); 前者の方が一般的なのですね。 ・void sub2(TBitmap* bmp[10], TImage* image[10]) → void sub2(TBitmap** bmp, TImage** image) 同じならば、前者の方が実体をよくあらわしているのでベターですね。 理屈は体で(指で?)覚えていないので、すぐ忘れてしまいます。できるだけ忘れない方法でメモしておきます。 他 std::array はスマートポインタですね。触手のでる良い点もありますがどうも新しいことにはなかなかなじめません。 Fotranの添え字チェックにもあたりますね。 image[n]の使い方のご提示で、規則的配置とも限らないのですが、参考になります。
補足
あと、忘れました。 Delete Image[n]がなくても良い点が疑問です。