忍者ブログ
暇人おやじの暇なつぶやき
[4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

■便利なプロパティ「DialogResult」

このプロパティはコマンドボタンの戻り値の指定を行う事がてきる

例えばボタンが二つあり、一方が「OK」、他方が「キャンセル」であった場合
戻り値としてどちらが押されたかを知ることができる

もう一つの便利な機能として、フォーム2などにボタンを配置して、DialogResultを設定した場合
わざわざフォームを閉じるコードを記載しなくても、ボタンを押下した段階で自動で閉じてくれる

とてもありがたいプロパティです
.NET Compact Framework によるサポート None ダイアログ ボックスから Nothing が返されます。つまり、モーダル ダイアログ ボックスの実行が継続します。
.NET Compact Framework によるサポート OK ダイアログ ボックスの戻り値は OK です (通常は "OK" というラベルが指定されたボタンから送られます)。
.NET Compact Framework によるサポート Cancel ダイアログ ボックスの戻り値は Cancel です (通常は "キャンセル" というラベルが指定されたボタンから送られます)。
.NET Compact Framework によるサポート Abort ダイアログ ボックスの戻り値は Abort です (通常は "中止" というラベルが指定されたボタンから送られます)。
.NET Compact Framework によるサポート Retry ダイアログ ボックスの戻り値は Retry です (通常は "再試行" というラベルが指定されたボタンから送られます)。
.NET Compact Framework によるサポート Ignore ダイアログ ボックスの戻り値は Ignore です (通常は "無視" というラベルが指定されたボタンから送られます)。
.NET Compact Framework によるサポート Yes ダイアログ ボックスの戻り値は Yes です (通常は "はい" というラベルが指定されたボタンから送られます)。
.NET Compact Framework によるサポート No ダイアログ ボックスの戻り値は No です (通常は "いいえ" というラベルが指定されたボタンから送られます)。


■実際の使用例

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
IDE開発環境はwindowsプログラミングの敷居を低くしてくれる最高のtoolでR

これで例えばゲームを作ってみる
簡単なところからブロック崩し

メイン画面(フォームという)にボールとバーとなるImageコンポーネントを
貼り付ける

Imageコンポーネントは絵を表示する為のコンポーネント(部品)である

Delphiのプログラミングスタイルはこのように数々の部品を使用して
組み立てていくので、初心者にも簡単に作れるのでR



忍者ブログ [PR]
カレンダー
08 2024/09 10
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
フリーエリア
最新CM
最新TB
プロフィール
HN:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索