====================  高位のVisualBasicで  コンポーネントを配列として管理する方法  Copyright Miyama. 2025 May  http://kazutomimiya.sakura.ne.jp  KazutomiMiyamaSub@gmail.com ====================  はじめに  先日、拙作、限りなく白色に近いブルー (いまさらながらふざけたなまえです)とい う色彩調整ソフトをバージョンアップしてい た時、  RGB三原色の調整スクロールバーを配列と して管理できないかという発想がありました。  また拙作の家計簿ソフトで、曜日別の入力 テキストボックスを配列で管理していたこと もあり、その応用実装について試行錯誤をし たのがこの動機となっています。  関連項目を調べていたところ、  意外にも多くの方が高位のバージョンのV Bでそれができないことに悩んでいたのに軽 く驚きました。  曰く、VB6でなら考えなくコントロール 配列が使えたのに、ということです。  拙作の家計簿ソフトは、VB2017でおよそ6 年ほど前に製作しました。  コードを見直してみると試行錯誤を繰り返 したあとがあり、また当然、旧VBでは簡単 に配列が使えたはずなのに、というぶつぶつ を多分つぶやいていたに相違ありません。  連休でめずらしく暇なので、自分に対する 整理もかねてその論理の整頓をしたものを、 upしたいと思います。  また色彩調整ソフトのコアとして、  画面からマウスで色を拾う機能を実装する にあたり、書き込みに手助けしてもらったこ とに対するネット空間へのお礼も兼ねていま す。  同梱のsample.exeはこのコードの実装です。  表示される小さい窓をクリックしてみてく ださい。  使用配布条件  フリーソフト&ドキュメントです。  使用配布は自由です。  動作条件:サンプルプログラム  WIN7,8,10,11 win10以外は推定  基本の発想  デザイナーの上でコンポーネント配列を配 置することができないので、フォームのロー ド時に記述によってコンポーネントを宣言、 設定する必要があります。  そのこと自体の概念が結構理解しづらく、 また配列として扱うための宣言を別途しなけ ればなりません。  同梱したソースコードに並行して解説して いきたいと思います。  このようなことを根底から理解するにはお おくカタカナで使われる抽象概念を深く理解 している必要があるそうですが、浅薄な自分 にそれができるとはとても思えず、手探りで 概念をあやつるしかなさそうです。誤謬があ りましたらご容赦ください。  むかしのコンピュータの入門書は、まずそ の機械のメモリ空間の解説に相当なページを 割いていたようです。  こんなことを全部おぼえなきゃならないの か、という意味でコンピュータを使うことに 挫折してしまった御仁も相当にいたに違いあ りません。  データと命令を側頭葉系と前頭葉系のアド レスとして理解し、その相互アクセスとして コンピュータとして模倣しているような空間 です。  題だけは覚えている書籍として、 「ポインタと構造体」という本がありました。 実に題だけでもコンピュータの癖の本質を如 実に表している名前だといまさらながら感心 をする次第です。  変数の宣言をするとき、機械はメモリ空間 にそのデータ列を格納する、最初のメモリア ドレスを指定します。浅薄な記憶ではこれが ポインタと呼ばれるものだったと思います。  機械がデータを参照する場合はこのポイン タアドレスに飛びまたそこから得られる情報 によって冗長的に長さのあるそのデータ全容 を取得しようとします。  配列のような長いかつひとかたまりのデー タは、このポインタを起点とした連続した情 報として管理されます。  構造体とは、複数の変数を束として抱えた 存在をやはり呼び出し名を使ってまとめて参 照しようとする概念です。  その意味で、プログラム上のコンポーネン トは定義された複数のプロパティやメソッド をもち、構造体としての理解にもっとも適し た存在です。  人事の社員管理のためのデータテーブルも、  年齢、役職、給与なども、一人の名前をエ ントリとしたデータの束なので、構造体とし て管理することが可能です。  表計算ソフトにおける、家計簿の支出の一 行も同様です。  こう考えると構造体の応用と実用がわかり やすくなるかもしれません。  クラスライブラリとは、このような構造体 のデータ形式の束を定義した実装で、  インスタンスとはそのクラスライブラリの 実装をおりじなるとして使用するメモリ空間 にコピーし、使用上の具体的な名前を付け、 データを格納して実用に供与する 「現場の存在」と理解した方がいいでしょう。  ーーー  コードの解説 code.txt  表示の上方から解説します。  番号はコードの上の場所です。  ※suspendlayaout、   resumelayout  は動的にコンポーネントを配置するとき、  既存のコンポーネントをプロセスが配置す ることを止めたり再開するものだと記述があ ります。ですが明示的に宣言しなくても動作 に支障もないこともあり、どうもよくわかり ません。  1 グローバル宣言  呼び出されたフォームのメモリの上に  コンポーネントのポインタを宣言します。  フォームの上に宣言されているので、その ほかの既存のコンポーネントがそうであるよ うにグローバルな存在としてフォーム上のど のプロセスからもアクセスすることができる ようになります。  かっこは配列として使用します、という宣 言です。  フォームが初期化プロセスを呼び出します  コンポーネントの定義と配置は、論理上プ ログラムのどこでもできますが、できれば業 務論理が動き出す前に完了しておくのが望ま しいとされています。  2 配列の宣言  ポインタとしてのグローバル領域に、これ を配列として3つ使用する宣言をします。コ ンピュータの序列空間は普通0から始まるの で、0,1,2の三つの割り振りになります。 ですから 宣言 (3) と書くと都合4つ のインデックスを確保してしまいます。  3つなら3ー1と理解しなくてはなりませ ん。  3 個々の要素の宣言  配列として使用するためにはそれぞれのイ ンデックスごとに、さらにこれはテキストボ ックスとして使用するよという宣言をします。  配列として使用しない場合はこのプロセス は多分必要ありません。その代わりに最初の フォーム上の宣言でカッコは不要になります。  4 実装  配列として宣言したコンポーネント群をメ モリ空間に実装するところだと推測します。  これでおそらく、コンポーネント自体の実 装は終わったはずです。  5 イベントハンドラ  配列コンポーネント自体のイベントをルー チンのプロセスとして記述することは実際上 出来ないはずです  例えば sub コンポーネント_Click() ............ end sub  と記述すると、  デザイナー上で定義されていない、存在し ていないコンポーネントです、とデバッガが エラーを吐き出してコンパイルできません。  ですからそのコンポーネントに対するハン ドラも、フォームのロード後に追加してやら なければなりません。  この概念は、大きさや色といったコンポー ネントのプロパティと同じ扱いを受けるので、 概念的にはそうむずかしいことではありませ ん。  6 子プロセスの処理の分岐  イベントハンドラを通じて個々の配列コン ポーネントごとに処理を分けたい、  とします。  VB6的にはイベントごとにインデックス 引数を格納する領域があり、そこで処理分岐 を指示することが可能でしたが、仕様として 高位のVBではそうはなっていないようです。  自分は過去どうしていたか調べたところ、 どこで調べたのか妙なテクニックを使ってい ました。  subプロシージャは、そのプロセスがどこ から呼び出されたかを知ることができる引数 を取得することができます。  コード中のsenderとよばれる変数がそれで す。  この記述は勝手に作った、任意のプロシー ジャがも実装することが可能です。  このセンダーとよばれる引数はおそらくヴ ァリアント形式という引数の束で、その意味 では厳密には構造体に入ります。  ここに、呼び出したコンポーネントの表示 名:論理名ではないので同じ名前が可能、が 格納されていますので、引き出して利用する ことができます。  このコード上のテキストボックスの各プロ パティはとくに何もしていないので、多くが 空白になっており、初期状態ではname文字列 変数にも何も入ってはいません。  そこに、name変数に適当な共通名を付け、 そこにインデックス番号を文字列化して追加 してやると、  渡された子プロセスもどの配列からきたの か、判断することが可能になります。  子プロセスでは文字列チェック関数  instrを使用しています。  黎明期からさわっていた知識がこんなとこ ろで役に立つとはおもいませんでした。 ====================  ドキュメントの終わり。 ====================