なぜにこの様な領域があるのか?
皆さんが悩んでいる(海外でも)!!ファイルを公開したいのですがセキュリテイの問題で公開できないのです(サバ-側でエラーになる、細かくしないといけません)。
お困りの方はコメントを投函して下さい
ご指導いたします。
パソコンにはハ-ドとソフトがありますそれと読み書きするためのメモリ-と言われる個所に分かれています、例えばパチンコにはEPROMとRAM共に2Kバイトの容量で動いています、ですからプログラムはROMに書き込み永久に保持する事が出来ます。しかし動的に情報を書き換える事も必要でその為にRAMが有ります、これならばEPROM内容は動的に変更できず完璧に保護されています、所が私たちのパソコンは全てがRAMに配置されてEPROMは存在しません、ですからこの固定デ-タも事故で書き換えられてしまいます、前で説明したEPROMと言われた箇所がスタティツクと言われる領域なのです。この猟奇に私たちがデータを作成する事が出来れば例外は発生しなくなるのです(ただ簡単では有りません)。
マイクロソフトの技術者はこの構成を持つ為にフレ-ムワ-クと言われる各クラスが開発されたのです、このクラスは此処に独立されていて簡単にアクセツスが出来ないように構築されていてこれらの事が原因と難しくしていますC#とか言われる高級言語ではこの辺は知らなくてもいいのですがVC++ではそうは行きません難しいのです。
メッセ-ジの伝わり方理解する
ここのクラスに通知を送る又は通知を受け取るこれらが理解できないとプログラムは出来ない!いやダイアログベースでやるしか無いと思われます、しかしどんな高級言語とかMAYAとかワ-ドですらこのVC++で開発されているのですから、私たちはこれらを未来に向けて伝承して行かなければ行けません未来に伝承する事が何よりも重要なんです。
コントロラ-全てがウインドウズです
ビユ-の切り替えはメインフレ-ムで行います、でこのメインフレ-ムに指示を送るのは各フォ-ムビュ-と言われるビユ-なのです、此処で重要な事は各クラスは隠蔽されていると言う事実です、なので問題はデ-タがメモリ-内のどこにそのデータが存在(作成されるのか)するか?これはビユ-の存在が動的にしか存在しないと言う事です(データもロ-カルにしか存在しない、即ちビユ-が消えればデ-タも消える)、例えばあるビュ-が作成されたデ-タをどこかで参照されていた場合にデータを作成したビユ-が他のビユ-に切り替わればデータも存在しなくなるです、だからMSはドキュメントクラスを新たに作りこの中に配置すると言うやり方を決めたのです、ですがこのドキュメントクラスも他のクラスからも隔離されているために簡単に参照出来ないと言う難しさが存在するのです、各コントロラ-が扱うデ-タはそのロ-カルビユ-が参照するものであり他のビユ-からは隔離されていると言う事実なんです、この辺の理屈を理解していないと起きる問題は皆さんが既に経験されていると思うのですが、例外ですこの中で一番多いのがこのデ-タは古いとか多種多様な異常メッセ-ジです。強力なデバッカで開発中であるならばこのデバッカが保護してくれるのですがリリ-ス版にあるともう保護はしてくれずに例外のオンパレ-ドになり皆さんが途方にくれるのですがこれらの多くの問題はデ-タはすべて静的(スタティツクエリヤ)な範囲内に作れば良いそうすればビユ-が消えても有効なデ-タは何時でも存在することになり問題は解決します。
ビユ-の切り替えにはスタティツク範囲を使う必要が有ります。
各コントロ-ル内ではデ-タは確保されません、単にロ-カル内に仮想的に配置されているだけなのです、各セルないのデ-タは全て一時的に存在している物で表示にだけしか意味していないのです、このリストコントロ-ルの内容を又再表示する場合でも同じく無効になります、しかし強力なデバック環境で作業している場合には強制的にデバッカ-が保護されているだけですからリリ-スバ-ジョンに切り替えた途端に動かなくなります。
スタティツク領域を確保する
例
static _TCHAR MeikingDishCormA[]={_T(“栄養素名”),_T(“重量”),_T(“単位”),_T(“比率%”)};
ドキュメントクラスのヘッダ-へ記載
フレ-ムビユ-からの保存
コントロ-ルの表示デ-タは下記の様にスタティツクエリヤに転送します、これらを行う事でこのビユ-が再表示された場合にも正しいデ-タが表示されるようになり例外も発生しなくなります。
リストコントのデ-タはstaticエリヤ内部に保持します。ローカルにあるリストコントロ-ル表示デ-タは一時的な物であり他のクラスからは参照できませんしビュ-が再表示されてもそのデ-タは無効になり例外になってしまいますので上記の様にスタティックエリヤに保存する事で他のクラスから何時でも自由に参照が可能になります。
コントロ-ル・セル内デ-タ再表示
このようにしてリストコントロ-ルへデ-タを再挿入してから表示します。リストコントロ-ル内に現存するデ-タは既に無効になっていますから例外が発生するのです。
独自のメッセ-ジの使用宣言
この様にして宣言を行います、これでこのメッセ-ジをウインドズが認識してくれます、ドキュメントクラス・ヘッダ-に記載します。
メッセ-ジの発行
フォ-ムビュ-からメインフレ-ムに向けて処理を要求しています。ここでpDocにドキュメントクラスのポインタ-を取得している事に注意してください。
此処でメッセ-ジを受け取ります。
メインフレ-ムのCPPファイル内部にコ-ドを記載しています。
正しいリストコントロ-ルの初期化
リストコントロ-ルの初期化は簡単では有りません、色々な手順を踏む必要があります,若しも貴方が手掛けているアプリケ-ションがリリ-スバ-ジョンで仕上げるのであればこの手順は絶対に必要になります。何故ならばMFCの強力なデバッカ-がもう一切貴方のアプリケーションを保護してくれず単体で安定的に起動できるアプリケ-ションである必要があるからです。そうでないならばこの限りでは有りません。
この様なコントロ-ル考えているならば
ダイアログべ-スのアプリケ-ションはド素人で使い物にはならないでしょう!、だから下記のようなエクセル見たいな物を考えているのでしょうが?それは簡単では無く全てを自分で制御する事をMFCから強要され非常に難しいのだ!と覚悟して精進しなければなりません。
手順1 フォ-ムビユ-の初期化関数を追加する。
手順2 コントロ-ル(罫線・文字・等々)を表示するハンドラ-を追加する。
手順3 データ領域をスタティツク範囲に確保する。
手順4 スタティツク領域にアクセスする関数を用意する。
リストコントロ-ラ・プロパテイ
関数の使用を宣言します
関数本体です
コ-ドをよく見て下さいリストコントロ-ル1の内部デ-タを読み出すことは無くデ-タが変化しているかどうかだけを判断しています、変更されていればスタティツク領域からこのコントロ-ル1に対するデ-タを読み出しコントロ-ル1に変更された箇所だけデ-タを設定しています、重要な事はコントロ-ル内のデ-タは重要では無いし又あてにならないと言う事なんです。
この場所が呼び出されます
関数本体が呼び出されるタイミングは未定でWindowsがこのコントロ-ルに対して再表示の必要が有ると判断されればこのこのメッセージが発行されて呼び出されて来ます。但し呼び出された場合には最短時間で返却しなければ行けません。赤枠内はどれもこれもフォ-ムビュ-には最低限必要な関数です、勝手に呼びだす事は許されませんWindowsが管理するものです。
リソースから作成されたフォームビュ-
リソースから作成されたフォームビュ-クラスにドキュメントクラスを参照する関数は含まれていません、さすがMFSですね!(残酷で気が利かない)。
これが絶対に必要になるのですが、クラスを新規作成した場合にはこの定義は組み込まれては居ません、ですから手動で組み込む必要があります。
ドキュメントクラス内を参照します
ドキュメントクラスはこの様に使います
他のクラスからのメッセージを受け取る
関数の宣言
メッセ-ジを受け取る関数の本体
コントロ-ル表示の例です。
最初から始めましょう
この画面から開始です、難しい箇所も多々ありますが皆さん着いてきてください、私の寿命があるうちに覚えて下さいプロジェクトはシングルドキュメントでダウンロ-ドしてから立ち上げればこの画面になるはずです。