VC++でクラスからメソッドを作る方法

[戻る]
Team AziOGroup [HomePage] 2009/11/27(金) 20:42:41
Visual Studio 2008 で VC++ .NET を使って開発をしています。
クラスについて現在勉強しているんですけど、早速詰まってしまいました。

『クラス内のメソッドを呼び出す時に、Form1等のフォームを指定し、クラス側ではそのフォームにボタンを配
置する。
配置して、そのボタンをクリックされると、ダイアログで「Hello World!」と表示する』
このようなソフトを作りたいのです。(特に意味はなく、勉強したいため)
ボタンの配置までは出来るんですが、「クリックされると」の部分が出来ません。
今までは、(クラス使ってないときでは)
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

など、 EventHandlerにthisを与えていたのですが、クラスだとthisが使えなくて困っています。
分かる方お願いします

以下コード


---------------------------------------------------
Form1.h 内

#pragma once

#include "Obj.h"
namespace MakeObj {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;

--中略--

            this->Text = L"Form1";
            this->ResumeLayout(false);

        }
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 Obj::Make(this,this);

             }
    };
}


---------------------------------------------------

Obj.h (クラスのヘッダーファイル)内

#pragma once

ref class Obj
{
public:
    Obj(void);
    static void Make(System::Windows::Forms::Control^);
};
 
---------------------------------------------------

Obj.cpp (クラスの実装部分)内

#include "StdAfx.h"
#include "Obj.h"

Obj::Obj(void)
{
}

void Obj::Make(System::Windows::Forms::Control^ frm)
{
System::Windows::Forms::Button^ button2;
button2 = gcnew System::Windows::Forms::Button(); //ボタンインスタンス化
frm->Controls->Add(button2);
    

}

---------------------------------------------------

επιστημη [E-Mail] [HomePage] 2009/11/27(金) 22:24:31
↓こんなんでいいのかしら

public ref class Form1 : public System::Windows::Forms::Form
{
public:
  Form1(void)
  {
    InitializeComponent();
    button1->Click += gcnew EventHandler(&Form1::Hello);
  }

  static void Hello(Object^,EventArgs^) {
    MessageBox::Show(L"Hello, world");
  }
  ...
};

επιστημη [E-Mail] [HomePage] 2009/11/27(金) 22:32:01
OKWaveでもみかけたな。マルチポストは僕は大嫌いだ。

Team AziOGroup [HomePage] 2009/11/27(金) 22:57:35
回答ありがとうございます。
マルチポストは今後気をつけます・・・

回答なんですが、
そのコードは Form1.h のコードですよね?
私が書きたいのはObj.h または Obj.cpp なんですが・・・

επιστημη [E-Mail] [HomePage] 2009/11/27(金) 23:07:45
> 私が書きたいのはObj.h または Obj.cpp なんですが・・・

だから? 同じでしょ?

wclrp ( 'o') 2009/11/29(日) 03:26:02
俺.NETやってないから判らんのだけど
クラスだとthisが使えないって意味が判らん

推測だけど

.NETのObjectクラスの派生クラスのインスタンスじゃないからってことか

中継すればいいのかな

C++/CLIでアンマネージクラスの非静的メンバをデリゲートにする
http://d.hatena.ne.jp/yuaaa/20080507/1210174504

επιστημη [E-Mail] [HomePage] 2009/11/29(日) 12:03:06
> クラスだとthisが使えないって意味が判らん

「クラスメソッド(=staticメンバ関数)だと this がないけど、どーすんの?」
ってことのようです。

wclrp ( 'o') 2009/11/29(日) 14:49:32
なるほど、そういうことか。
thisが使いたくて困っているのではなく
staticメンバ関数を使いたくて困っているってことか。

C#のデリゲートって
C言語のコールバックみたいにthisなしの使い方もできるし
this付きでメソッドを指定もできるのが便利だよね。

PATIO 2009/11/30(月) 10:35:47
どういう事がしたくて別のしかもFormとは特に関係無いクラスで
Form上にコントロールを配置したいのか?
という部分が書かれていないので何とも。

特に意味無しならformの方で書かないと駄目でも結論にはなるのかな。

古いスレッドには追加発言できません。