忍者ブログ
暇人おやじの暇なつぶやき
[1] [2] [3]
×

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

■サンプルを活用する

マイクロソフトの.NET Framework Developer Centerには様々なサンプルコードが記載されている
しかし残念ながらそのまま動くものと動かないものがある

何故か?
たいていのコードは標準的な書かれ方をしているため、またコンソールアプリとして書かれている場合が
多いのでVC++などの環境では動いても一瞬で終了するような事がある

   Console::WriteLine( HexTest::ToHexString( b ) );

コンソールへの出力で終わっているプログラムの場合には、その後に入力待ちを入れるなどの工夫が
必要である

   Console::ReadLine();

通常C++の入力待ちは cin で記載する場合がある
cincoutはC++ネイティブ(?)としてヘッダーiostreamに記載があるのでこれをincludeしないと使用できない
そこで、上述の Console::ReadLine();を利用するのが便利である

次のコードはbyte変換用のサンプルと、それをVC++で使う際に変更したコード
■MSのサンプル
----------------------------------------------
ref class HexTest
{
private:
   static array<Char>^hexDigits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

public:
   static String^ ToHexString( array<Byte>^bytes )
   {
      array<Char>^chars = gcnew array<Char>(bytes->Length * 2);
      for ( int i = 0; i < bytes->Length; i++ )
      {
         int b = bytes[ i ];
         chars[ i * 2 ] = hexDigits[ b >> 4 ];
         chars[ i * 2 + 1 ] = hexDigits[ b & 0xF ];

      }
      return gcnew String( chars );
   }

};

int main()
{
   array<Byte>^b = {0x00,0x12,0x34,0x56,0xAA,0x55,0xFF};
   Console::WriteLine( HexTest::ToHexString( b ) );
}
-------------------------------------------------------------

■実際のコード
----------------------------------------------
// hextest.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"

using namespace System;
ref class HexTest
{
private:
   static array<Char>^hexDigits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

public:
   static String^ ToHexString( array<Byte>^bytes )
   {
      array<Char>^chars = gcnew array<Char>(bytes->Length * 2);
      for ( int i = 0; i < bytes->Length; i++ )
      {
         int b = bytes[ i ];
         chars[ i * 2 ] = hexDigits[ b >> 4 ];
         chars[ i * 2 + 1 ] = hexDigits[ b & 0xF ];

      }
      return gcnew String( chars );
   }

};

int main(array<System::String ^> ^args)
{
   array<Byte>^b = {0x00,0x12,0x34,0x56,0xAA,0x55,0xFF};
   Console::WriteLine( HexTest::ToHexString( b ) );
   Console::ReadLine();
   return 0;
}
-------------------------------------------------------------

PR
■接続相手のIPとポートを表示する

// Uses the RemoteEndPoint property.
    Console::WriteLine(  "Connected to {0} on port number {1}",
       IPAddress::Parse( ( ( (IPEndPoint^)(socket->RemoteEndPoint) )->Address)->ToString() ),
       ( (IPEndPoint^)(socket->RemoteEndPoint) )->Port.ToString() );

これはマイクロソフトのサンプルから抜粋
ソケット接続後であれば閉じるまでの間、いつでも確認ができる

■RichTextBoxに改行コードを挿入してみる

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
             {
                 Form2^ F2 = gcnew Form2();
                 F2->ShowDialog();
                 richTextBox1->AppendText(F2->textBox1->Text);
                 richTextBox1->AppendText(Environment::NewLine);
             }

先般のForm2のデータを使うを利用して、ボタンクリックイベントのみで作成してみた
特に問題はないようだ
■便利なプロパティ「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の場合の処理
};
■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


忍者ブログ [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:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索