0

特定の質問

Borland C ++ Builderでボタンの配列を作成し、それを操作するにはどうすればよいですか?

Borland C ++Builder6とBorlandDeveloperStudio 2006(Turbo C ++ 2006)を使用しています。

目的

たとえば、キャプション、サイズ、位置を変更するなど、インデックス付きのforループを使用するだけで、フォーム上の多数のボタンを操作できます。

呼び出されたボタンがあるかどうかを知っていますButton1。このボタンのクリックイベント内で別のボタンを作成すると(から)、 ( )TButton *Button2 = new TButton(Form1)に割り当てることができButton1、それらのキャプションをで変更するだけです。だから私はそれを拡張したいと思います。実際のコンポーネントのポインタを配列の要素に割り当てて、それらすべてをループで動作させます。Button2Button2 = Button1Button1Button2->Captionfor

さて、誰かがフォーム上の配列としてすべてのボタンを追加する方法を見つけた場合、それはより良いです:)

試行

以下のテストは、フォーム上のボタンのイベントであるTForm1 :: Button1Click()にそれぞれのコードを配置して行われました。

  • テスト1

    • 説明:アレイを直接作成する
    • コード:

      TButton Buttons[3];
      
    • 結果:コンパイルエラー:

      > [C++ Error] Unit1.cpp(23): E2248 Cannot find default constructor
      > to initialize array element of type 'TButton'
      
    • コメント:
      • 私はこのテストのいくつかの変形をテストしました(たとえばTButton Buttons = new TButton[3]calloc関数などを操作する)が、それらはすべて、TButton引数のないコンストラクターがない、つまり、、、および;だけTButton()の問題を示しています。TButton (TComponent *AOwner)TButton(void *ParentWindow)TButton(const TButton &)
      • コンストラクターのプロトタイプ、配列のnew引数で演算子を使用する方法はありますか?TButton
  • テスト2

    • 説明:ベクトルの作成
    • コード:#include "vector.h"ユニットヘッダーも追加します...

      vector<TButton> Buttons;
      Buttons[0].Caption="it is ok";
      Buttons[1].Caption="mayday, mayday";
      
    • 結果:3行目のデバッガー例外:

      > Project Project1.exe raised exception class EAccessViolation
      > with message 'Acceess violation at address 401075B9 in module
      > 'vcl60.bpl'. Read of address 00000254'. Proccess stopped. Use
      > Step or Run to continue.
      
    • コメント:
      • vector<TButton> Buttons(3);ええ、私はそれが上がることを期待していましたが、同じ理由でtest1が失敗したので、作成後にそのベクトル上のより多くの要素にメモリを割り当てる方法を誰かに言いました:(

一般的な質問

ビジュアルコンポーネントに対してどのようにそれを行うのですか?

4

3 に答える 3

3

同じ理由で、すべての試行が失敗しました。インスタンスへのポインタTButtonの配列/ベクトルではなく、実際のオブジェクトインスタンスの配列/ベクトルを作成しようとしています。TButton

ボタンポインタの固定長配列を作成するには:

TButton* Buttons[3];
...
Buttons[0] = Button1;
Buttons[1] = Button2;
Buttons[2] = Button3;
...
for(index = 0; index < 3; ++index)
{
    TButton *Btn = Buttons[index];
    // use Btn as needed...
}

ボタンポインタの動的な長さの配列を作成するには:

TButton** Buttons;
...
Buttons = new TButton*[3];
Buttons[0] = Button1;
Buttons[1] = Button2;
Buttons[2] = Button3;
...
for(index = 0; index < 3; ++index)
{
    TButton *Btn = Buttons[index];
    // use Btn as needed...
}
...
delete[] Buttons;

ボタンポインタのベクトルを作成するには:

std::vector<TButton*> Buttons;
...
Buttons.push_back(Button1);
Buttons.push_back(Button2);
Buttons.push_back(Button3);
...
for(index = 0; index < 3; ++index)
{
    TButton *Btn = Buttons[index];
    // use Btn as needed...
}
/*
Or:
for(std::vector<TButton*>::iterator iter = Buttons.begin(); iter != Buttons.end(); ++iter)
{
    TButton *Btn = *iter;
    // use Btn as needed...
}
*/
于 2012-09-10T20:43:28.387 に答える
1

これはすべて非常に素晴らしく、正しく真実です。しかし、ユーザーの質問は別の意図だったということです。すべてのボタンについて、それぞれのインデックスに特別なメリットがない場合、これは本当の方法にすぎません。目的は、クリックするだけですべてのコンポーネント(ボタン、パネル、形状など)を制御することであり、それぞれが新しいコードにインデックスを付けます。そのため、いくつかのプログラムのコードを変更しました。

void __fastcall TForm1::Button1Click(TObject *Sender)

{

typedef TPanel* TPanels;

TPanels Panels[3] = {Panel1, Panel2, Panel3};

int count;

for(count=0;count<3;count++)

Panels[count]->Left=random(100);

}  

indexここの代わりに見ることができるようにですcountrandomize()確かにへの挿入を忘れないでくださいTForm1

于 2018-06-30T18:12:47.533 に答える
0

奇跡的なTypedef+疑似配列=ソリューション

  • 奇跡的なTypedef:

    • 何時間も道を探した後、私はtypedefそのスタックオーバーフローとグーグル検索の旅を見て、なぜそうしないのか考えました:

      typedef TButton* TButtons;
      
    • まあ、それは私が実行できるので、すべてのものを変えます:

      TButtons Buttons[3];
      
  • 疑似配列:

    • そのButtons[3]配列に格納されているデータにメモリを割り当てる方法に問題が残っていましたが、私の質問の目的セクションの2番目の段落の知識で、私は考えました:新しいデータを忘れて、データがそこにあり、そこを指します(それで私はそれを構築するためにそれを呼び出します疑似配列。既存のデータへのポインターの配列のみを作成するため):

      TButtons Buttons[3] = {Button1, Button2, Button3};
      
    • ここButton1で、Button2およびButton3は、通常(マウスを使用して)フォームに配置したときにすでに作成されています。

実例

  1. 新しいvcl/formsアプリケーションプロジェクトを作成します。
  2. その解決策を示すために、左側の図のように3つのボタン(Button1、、 )を配置し、アクションを実行するための図のように 1つの大きなボタン( )を配置します。Button2Button3Button4下の図のポイント2
  3. 4番目のボタンのクリックイベントに次のコードを挿入しますButton4

    typedef TButton* TButtons;
    TButtons Buttons[3] = {Button1, Button2, Button3};
    int index;
    
    for(index=0;index<3;index++)
    {
            Buttons[index]->Caption=(AnsiString)"teste "+index+" - "+(1+random(100));
            Buttons[index]->Left=25+4*random(100);
            Buttons[index]->Top=25+4*random(100);
    }
    
  4. 「shazam!」を実行します 走って遊んで... ゲームプロジェクトのように
于 2012-09-07T23:38:39.940 に答える