メンバ変数 LPARAM m_lParam;
にクラス、構造体などのポインタを保存&読み込み
( CTreeCtrl等にある GetItemData(),SetItemData()の真似事 )
をしようとして以下のコードを書きました
CView.hに
public:
void SetItemData(DWORD dwData) { m_lParam = (LPARAM)dwData; }
DWORD GetItemData() const { return (DWORD)m_lParam; }
private:
LPARAM m_lParam;
CString m_szTmp;
CView.cppに
void CView::Set()
{
m_szTmp = テスト;
SetItemData( (DWORD)&m_szTmp );
}
void CView::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使用
> CStringArrayのGetAt()の戻り値は一時オブジェクトなので
> これを保存しても意味が無いのかな?
その通りです。
何をしたいのかはっきりしないので、
どう変更するのが普通というのは言えませんが、
現在のSetItemDataを使って何とかするのであれば、
// 実際に配列に含まれるCStringへの参照を保持。
// ただし、m_saTmp配列を変更すれば、そのポインタは多分無効になり非常に危険。
SetItemData(m_saTmp.ElementAt(0));
または、
// 新しいCStringを作る。
// 用が済んだらdeleteしなければならない。メモリリークの危険性大。
SetItemData((DWORD)new CString(m_saTmp.GetAt(0)));
または、
// ポインタでなく配列インデクスを保持する。
// ポインタやメモリ管理に煩わされず、安心・安全。
SetItemData(0);
やりたいことは、
C***Viewのコンストラクタで必要な文字をCStringArrayのAddをします
あるクラスをCStringArrayのGetSize()の数だけ動的に生成し文字を渡す
なので、
>// ポインタでなく配列インデクスを保持する
で解決できました
ありがとうございます。
ついでなのですが、(DWORD)&m_szTmpのような、
アドレスをDWORDにキャストするってどういうことなのでしょうか?
アドレス=ポインタなので LPVOID にキャストするならポインタ同士なので
なんとなくわかるのですが DWORDにキャストするって ?
今は意味もわからず使用しています。
よろしくお願いします
DWORD 32ビット
ポインタ 32ビット(32ビットOS時)
サイズが同じだからですね・・
そーなると、この場合のキャストは単純にコンパイラをだましているだけで
極端な話、同じサイズの型なら何でもいいって事になるんでしょうか?
すみませんがよろしくお願いします。
極端な話、そういうことです。
