CTreeCtrl等にあるGetItemData(),SetItemData()の真似事

[戻る]
ナオーバ 2002/11/28(木) 16:45:40
メンバ変数 LPARAM m_lParam;
にクラス、構造体などのポインタを保存&読み込み
( CTreeCtrl等にある GetItemData(),SetItemData()の真似事 )
をしようとして以下のコードを書きました

C***View.hに
    public:
        void    SetItemData(DWORD dwData)  { m_lParam = (LPARAM)dwData; }
        DWORD   GetItemData() const        { return (DWORD)m_lParam;    }
    private:
        LPARAM  m_lParam;
        CString m_szTmp;

C***View.cppに
    void C***View::Set()
    {
        m_szTmp = "テスト"; 
        SetItemData( (DWORD)&m_szTmp );
    }
    
    void C***View::Test()
    {
        CString* psTmp = (CString *)GetItemData();
        AfxMessageBox( *psTmp );
    }
は"テスト"を表示します。これを

メンバ変数変更
    CString         m_szTmp;
             ↓
    CStringArray    m_saTmp;
メンバ関数変更    
    void C***View::Set()
    {
        m_saTmp.Add("テスト");
        SetItemData( (DWORD)&m_saTmp.GetAt(0) );
    }
のようにすると表示しなくなります。

CStringArrayのGetAt()の戻り値は一時オブジェクトなので
これを保存しても意味が無いのかな?

普通はどのように実装するのかな?

よろしくお願いします。
WIN2000 SP2/VC6.0 SP5/MFC使用

dairygoods 2002/11/29(金) 09:51:07
> CStringArrayのGetAt()の戻り値は一時オブジェクトなので
> これを保存しても意味が無いのかな?

その通りです。

何をしたいのかはっきりしないので、
どう変更するのが普通というのは言えませんが、
現在のSetItemDataを使って何とかするのであれば、

// 実際に配列に含まれるCStringへの参照を保持。
// ただし、m_saTmp配列を変更すれば、そのポインタは多分無効になり非常に危険。
SetItemData(m_saTmp.ElementAt(0));

または、

// 新しいCStringを作る。
// 用が済んだらdeleteしなければならない。メモリリークの危険性大。
SetItemData((DWORD)new CString(m_saTmp.GetAt(0)));

または、

// ポインタでなく配列インデクスを保持する。
// ポインタやメモリ管理に煩わされず、安心・安全。
SetItemData(0);

ナオーバ 2002/11/29(金) 12:41:43
やりたいことは、
C***Viewのコンストラクタで必要な文字をCStringArrayのAddをします
あるクラスをCStringArrayのGetSize()の数だけ動的に生成し文字を渡す

なので、
>// ポインタでなく配列インデクスを保持する
で解決できました
ありがとうございます。

ついでなのですが、(DWORD)&m_szTmpのような、
アドレスをDWORDにキャストするってどういうことなのでしょうか?

アドレス=ポインタなので LPVOID にキャストするならポインタ同士なので
なんとなくわかるのですが DWORDにキャストするって ?

今は意味もわからず使用しています。

よろしくお願いします

不良PG 2002/11/29(金) 13:11:26
DWORD 32ビット
ポインタ 32ビット(32ビットOS時)

サイズが同じだからですね・・

ナオーバ 2002/11/29(金) 17:45:19
そーなると、この場合のキャストは単純にコンパイラをだましているだけで
極端な話、同じサイズの型なら何でもいいって事になるんでしょうか?

すみませんがよろしくお願いします。

tib 2002/11/29(金) 18:27:48
極端な話、そういうことです。

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