アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++系(主にボーランドビルダー)でVBの様なイベント付きクラスを作成したいのです。

単なるスレッドクラスの定義は:
//----------------------------------------------
// クラス
// スレッドクラスより派生
//----------------------------------------------
class CUserClass : public TThread
{
private:
AnsiString aa;
HANDLE hr;// ハンドル
protected:
HWND FormHandle; // 親フォームハンドル
void __fastcall Execute();// スレッドメイン処理
public:
__fastcall CUserClass(bool,AnsiString ,HWND ); // コンストラクタ
__fastcall ~CUserClass(); // デストラクタ
};

でいいのですが・・・。

何かクラス側で変化があったとき、クラスを使う親側モジュールにイベントを発生させたいのですが。
クラス側から親側に
SendMessage( 親側ハンドル, 送りたいメッセージ, 0, 0 );
でメッセージを送る方法があるのですが、これだと親側がクラスでないといけないし、送りたいメッセージが固定となるし・・・。

よい方法を教えてください。

A 回答 (2件)

関数を宣言する


その関数を「型」とするフィールドを作る
コンストラクタでnullに初期化する
使う側で、そのフィールドに飛ばしたい関数のアドレスを設定する
イベントを発生させたいタイミングで、フィールドがnullでなければコールする


ってかんじかな?

BCBなら「コンポーネント開発者ガイド」に「イベントの作成」という章があります。

この回答への補足

すみません初心者なものでよく分かりません。サンプルPGを載せて説明いただけないでしょうか?

補足日時:2004/04/14 13:23
    • good
    • 0

初心者には呼出側をクラスにした方法がベターですが


こんな方法もあるよってことです。
後はご自分で考えてください。

typedef LRESULT (*CALL_PROC)(WPARAM wParam,LPARAM lParam);

class Caller
{
CALL_PROC pFn;
Caller():pFn(NULL)
{
}
void SetCallback(CALL_PROC pFn)
{
Caller::pfn = pFn;
}

LRESULT Foo(WPARAM wParam,LPARAM lParam)
{
if (pFn)
return (*pFn)(wParam,lParam);
return 0;
}
};

LRESULT Func(WPARAM w,LPARAM l)
{
return 0;
};

:

Caller ob;
ob.SetCallback(&Func);
:
ob.Foo(1,2);

この回答への補足

吟味していきたいと思いますが僕の知識ではどうも難しいようです。だれかコメントつきで超初心者でも分かるような説明をお願いしたいと思います。

補足日時:2004/06/23 12:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!