リストボックスをダイアログの外からコントロール – プログラミング – Home

リストボックスをダイアログの外からコン...
 
通知
すべてクリア

[解決済] リストボックスをダイアログの外からコントロール


熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

MFC VC++6.0 XP
ダイアログにリストボックスを貼り付けて、そのリストボックスに表示される内容をそ
とから、コントロールしたいのですが、実態化したあと、InsertString()を使うと落ち
てしまいます。OnInitDailog()で、InsertString()を記述するとうまくいくのですが、
それでは、外から、リストの表示内容を渡すことができません。
詳しい方いらっしゃいましたら、よろしくお願いします。

// DialogList.h
CListBox m_ListBox ;

// DialogList.cpp
int CDialogList::InsertString( int nIndex, LPCTSTR lpszItem )
{
   return(m_ListBox.InsertString(nIndex,lpszItem)) ;
}

//呼び出す側
CDialogList wDialogList ;
wDialogList.InsertString(0,0行目) ;//この行で落ちる
wDialogList.InsertString(1,1行目) ;
wDialogList.InsertString(2,2行目) ;
wDialogList.InsertString(3,3行目) ;
if (wDialogList.DoModal() == IDOK) {
}


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

これは仕様なので、「できない」が当然の動作。
MFC の FAQ に書かれているので読むべし。
http://msdn.microsoft.com/ja-jp/library/cc403767(VS.71).aspx
解決策も書いてある


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

tetrapod さん、レスありがとうございます。FAQで該当するところは、以下のところだ
と思います。
DoModal()が呼び出されるまで、ダイアログは、生成されないのですね。
不思議な感じがしますが、仕方ないですね。

CDialogコントロールのDDX/DDVが初期化できないわけは?

ダイアログが生成されるまで、つまりDoModal()が実行されるまでは、ダイアログのコン
トロールに対して何も行えません。問題の解決法として、データ用のメンバ変数を作成
し、それらをDoModalの呼び出しの前に初期化して、その後OnInitDialogまたは
UpdateData()で値を渡すという手段があります。ClassWizardで行うメンバ変数の初期化
とほとんど同じです。
したがって、ダイアログにCStringListかCStringArrayを組み込み、そこにリストボック
ス用の値を入れ、それらをOnInitDialog(など)にあるリストボックスに渡します。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

ダイアログはウィンドウなので、
「実体を生成」と「ウィンドウを生成」は別です。

たとえば、

CWnd *wnd;
wnd=new CWnd;

wnd->Create(...);
wnd->ShowWindow(..);

変数宣言は上2つまで
DoModal()は、下の2つを担当すると考えればわかるのではないでしょうか

また、ウィンドウやコントロールのスタイルなどの設定はCreate時に行います
よって、Createされる前にコントロールをいじれないのは至極当然

ちなみに、InsertStringを、F11キーなどでステップインすると
いきなり「SendMessage」が使われているのがわかります。
当然、ウィンドウがない相手にはできないわけです


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

ryoさん、レスありがとうございます。
>「実体を生成」と「ウィンドウを生成」は別

なるほど、いい勉強になります。

> ちなみに、InsertStringを、F11キーなどでステップインすると
> いきなり「SendMessage」が使われているのがわかります。

わたしのイメージとは、ぜんぜん違いました。

重ねてありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました