暇人おやじの暇なつぶやき
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
■便利なプロパティ「DialogResult」
このプロパティはコマンドボタンの戻り値の指定を行う事がてきる 例えばボタンが二つあり、一方が「OK」、他方が「キャンセル」であった場合 戻り値としてどちらが押されたかを知ることができる もう一つの便利な機能として、フォーム2などにボタンを配置して、DialogResultを設定した場合 わざわざフォームを閉じるコードを記載しなくても、ボタンを押下した段階で自動で閉じてくれる とてもありがたいプロパティです
■実際の使用例 System::Windows::Forms::DialogResult result; //戻り値の定義 result = MessageBox::Show( this, message, caption, buttons ); if ( result == ::DialogResult::Yes ) { Yesの場合の処理 }; PR
■Form1からForm2のデータを利用する
色々とWebを回ったけど、よく分からん。単純にForm1からForm2を表示して、そこで入力された文字列をForm1に表示したいだけなのだが、そんな単純な事も簡単にできないのか??? さすがC++は恐ろしいと思っていましたが、分かってみると単純でした。 【キーポイントは public 】 様々なHPで解説されているForm2を表示する方法として、次の2行のコードがあります --------------------------- Form2^ F2 = gcnew Form2(); F2->ShowDialog(); --------------------------- これはForm2型のF2を宣言しgcnewにて実体化、F2はそのハンドルになり モーダル表示になります。 大抵のHPで上記コードがボタンを押下した際のイベント(button1_Click)に書かれていますが まずこれが危険信号だったんです というのは型宣言は最小の範囲でしか使えない為ここでForm2型の宣言をしたF2が利用できるのは、このイベント内だけになります。当然、他から参照する事ができない。 そこでまずForm2型の宣言をメインフォームであるForm1に行います。 ---------------------------------------------------- Form2^ F2; #pragma region Windows Form Designer generated code ---------------------------------------------------- 次にForm2においてForm1で利用したいコンポーネント(TextBox)のプロパティ「Modifiers」を「 Public 」にします。これでTextBoxをForm1から利用する準備ができました。 実際にForm2を実体化するのはForm1のForm_Loadイベントで行います。 これでForm1のどの場所からでもForm2のpublicな内容を参照する事が可能になります。
■構造体の使用方法
struct で構造体を定義しますが、valueをつけることでstaticになる 下記は名前なしnamespaceでの作成 もちらん構造体自体は、メインのnamespaceに作成しても他のnamespaceに作成しても利用できる □宣言□ namespace { value struct PERSON { //PERSON構造体の定義 System::String^ namae2; int age; int life; }; } □実装□ PERSON MyChar ;// PERSON型変数MyCharの定義 MyChar.namae2 = "はじめの一歩"; MyChar.age = 20; MyChar.life = 100; メインのnamespaceにも他のnamespaceにもどこでも定義は可能
■VC++.NETからのDLL呼び出し
.NETの考え方からすると直接DLLを呼び出すというのはよくないらしいが 呼ばなければならない時がある これには、Runtimeクラスを使用する using namespace System::Runtime::InteropServices; そして、使用するDLLの明示する [DllImport("user32")] extern int MessageBoxA( int hWnd , String^ lpText , String^ lpCaption , unsigned int uType ); 上記はuser32.dllにあるMessageBoxAという命令を呼び出す際の定義です これで、このプログラム(NameSpace)で呼び出す準備ができました 次に呼び出しを実施します 今回はボタンを押下したらMessageBoxAを呼び出してみましょう private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { MessageBoxA(0,L"DLLのテスト",L"呼ばれました",0x00); } これがボタンを押した際のコードになります 実際にプログラマが書くのは「{ 」と「 }」の間のコードだけです このサンプル、実際には MessageBox::Show で代用できますがDLLの呼び出しということで 一番簡単と思われるものを記載しました 尚、宣言部で各種プロパティを設定できます [DllImport("user32", CharSet=CharSet::Ansi, ExactSpelling=true)] これは自動で行ってくれるということが説明にあるので、気にしなくてもOK
■Formから別のフォーム名の呼び出し
1、ソリューションエクスプローラにて プログラム本体の部分又はヘッダーファイルの部分を右クリック 追加メニューから新しい項目を選択する 画面が表示されるので、Windowsフォームを選び、ファイル名を入力する このファイル名がフォーム(クラス)の名前になる 2、メインフォームからこの画面を呼び出すには まずメインフォームのコードにこの画面を使う為にincludeする必要がある #pragma once #include "xxxxxx.h" ←1で作成した名前 そして呼び出す場面にて Form^ form2 = gcnew xxxxxx(); form2->ShowDialog(); これで呼び出すことが可能になる。尚「ShowDialog()」命令は画面をモーダル表示する ここで一つ不可解な事がある それは1番目のフォームの場合、クラス名でそのままアクセスできるのに2番目以降の画面の場合にはそのままでは利用できない、これはメイン画面の作成と2番目以降の画面では作成方法が異なっているからだ メインフォームの場合、プログラム本体(メイン プロジェクト ファイル)にて作成 // メイン ウィンドウを作成して、実行します Application::Run(gcnew FrmMain()); つまり、ApplicationクラスのRunメソッドで生成される ところが2番目以降の場合は Form^ frminit = gcnew FrmInit(); Formクラスにアクセスして実体化している そのため、同じgcnewを実行しているが、Formクラスの場合その戻り値がフォームの名称となるので、ファイルと同じ名称では利用できない これを回避するには、大文字、小文字を駆使する必要がある Form^ FrmInit= gcnew FrmInit(); ←これはコンパイルでエラーになる
■Form1から任意のフォーム名への変更
デフォルトのフォーム名「Form1」では後々何を行っているフォームか分かりにくい為にプログラムを組む時には名称を変更する 1、ソリューションエクスプローラにて ヘッダーファイルのForm1.hを選択し、プロパティ(Name)にて名前をFrmMain.hに変更する 変更後Enterを押下 2、FrmMain.hのコードでclass表記がされている行にカーソルを持っていく するとプロパティ画面にクラスの名称「Form1」が表示されているので 「FrmMain」に変更しEnterを押下する 3、プログラム本体「XXXX.cpp」の変更(XXXX=新規作成で入れた名前) ソリューションエクスプローラにて ソースファイルのXXXX.cppの「#include "Form1.h"」を 「#include "FrmMain.h"」に変更し次にフォームの生成を行っている部分「Application::Run(gcnew Form1());」のForm1の部分をFrmMainに変更する メーカによるフリープログラミング開発環境の走りとなったDelphi6 |
カレンダー
カテゴリー
フリーエリア
最新CM
最新TB
ブログ内検索
|