リストボックスで選んだ項目ををエディターに表示させるには?

解決


ペンネーム  2009-07-14 23:27:18  No: 70571

たびたび申し訳ありません。
実は、OnInitDlgでポインタを使わずに
リストボックスに項目を追加して、
右のマウスボタンでダイヤログが開き、
リストボックスで何かひとつ項目を選んで、
OKボタンを押すと、その選んだ項目が
エディターに表示される、
といったことをしておりまして、
そのリストボックスで選んだ項目をエディター
に表示させるには、どうすればいいかわかりません。
お忙しい中申し訳ありませんが、わかる方教えたいただけない
でしょうか?


ペンネーム  2009-07-15 01:27:45  No: 70572

まず、m_naniwoとm_donoyouniをコントロール変数で登録して、
DlgクラスのOnInitDlgで以下のようにコードを書き込みました。
BOOL CkihonkeiDlg::OnInitDialog() 
{
  CDialog::OnInitDialog();
  m_naniwo.AddString("美しい笑顔");
  m_naniwo.AddString("きれいな心");
  m_naniwo.AddString("しつこい性格");
  m_donoyouni.AddString("すごく好きです");
  m_donoyouni.AddString("とても好きです");
  m_donoyouni.AddString("まあまあ好きです");
  m_donoyouni.SetCurSel(0);
  return TRUE;
}
それで、ViewクラスのONRButtonDownで以下のようにしたのですが、
「temp +="私はあなたの" + dlg.m_naniwo;」と
「temp +="を" + dlg.m_donoyouni;」の箇所で引っかかります。
以上2箇所には、何か足りないものがあるのでしょうか?
教えていただきたいのですが・・・
void CMyLoveView::OnRButtonDown(UINT nFlags, CPoint point) 
{
  CkihonkeiDlg dlg;
  dlg.m_keisyo=0;
  
  dlg.m_date=true;
  if(dlg.DoModal()==IDOK){
    CEdit& edit=GetEditCtrl();
    CString temp;
    CString x[2]={"さん","くん"};
    temp=dlg.m_name+x[dlg.m_keisyo] + "\r\n好きです。                                                              \r\n";
    temp +="私はあなたの" + dlg.m_naniwo;
    temp +="を" + dlg.m_donoyouni;
    edit.SetWindowText(temp);
  }
  CEditView::OnRButtonDown(nFlags, point);
}


maru  2009-07-15 01:41:26  No: 70573

文字列ポインタにCListBoxの加算はできないとおもう。

temp +="私はあなたの" + dlg.m_naniwo.GetWindowText();
かな。
temp +="私はあなたの";
temp +=dlg.m_naniwo.GetWindowText();
にする必要があるかも。


maru  2009-07-15 01:45:54  No: 70574

しまった。

void GetWindowText(CString& rString) const;
だから、
一旦CStringにテキストを取得する必要があるな。

CString strList;
dlg.m_naniwo.GetWindowText(strList);
temp +="私はあなたの" + strList;


Blue  2009-07-15 01:46:08  No: 70575

ダイアログを閉じてしまったら、コントロールにアクセスできないので、
ダイアログ側のOnOKイベントで適当なCStringメンバ変数を用意して格納し、
それを使うようにしては。

何いっているかわからない場合は、入門書から勉強してください。


maru  2009-07-15 01:49:03  No: 70576

おっとっと。

> ダイアログを閉じてしまったら、コントロールにアクセスできないので、
> ダイアログ側のOnOKイベントで適当なCStringメンバ変数を用意して格納し、
> それを使うようにしては。
こっちでしたか。


ペンネーム  2009-07-15 02:10:53  No: 70577

> ダイアログを閉じてしまったら、コントロールにアクセスできないので、
> ダイアログ側のOnOKイベントで適当なCStringメンバ変数を用意して格納し、
> それを使うようにしては。
意味がよくわからないんですが、要は、ClassWizardでIDOKイベント
に変数を追加することでしょうか?
そうした上で、
CString strList;
dlg.m_naniwo.GetWindowText(strList);
temp +="私はあなたの" + strList;
を行うんでしょうか?


Blue  2009-07-15 02:32:50  No: 70578

http://laboratory.sub.jp/c++/22.html

3,ダイアログの変数
を参考にメンバ変数をpublicでダイアログに追加する。

OKボタンを押すイベントはリソースエディタでダブルクリックすれば追加されるので、そこにコードを記入。

いまだにVC++6.0を使っているのか、、、


Blue  2009-07-15 02:36:18  No: 70579

参考サイトはVC++6.0のものではなかったw
publicとか指定できるのがあったのにないとおもったら
>Microsoft Visual C++ Ver 4.0
orz

http://www.vcppclub.com/kouza/beginner/beginner2.html

■ 通常のメンバ変数の追加
を参考に。


ペンネーム  2009-07-15 02:38:41  No: 70580

使っているのは、vc++Ver6です。


ペンネーム  2009-07-15 03:10:01  No: 70581

よくわかりません。
ダイアログ側のOnOKイベントってどこを
さすのでしょうか?
ちなみに、今の状態でやったら、
コンパイルは通ったのですが、
実行でエラーになりました。
FILE  WINCORE.CPP
Line1074
です。


maru  2009-07-15 03:20:31  No: 70582

> ダイアログ側のOnOKイベントってどこをさすのでしょうか?

> OKボタンを押すイベントはリソースエディタでダブルクリックすれば追加されるので、そこにコードを記入。

class CkihonkeiDlg
{
...
public:
 CString m_str1; // 追加
 CString m_str1; // 追加
...
}
void CkihonkeiDlg::OnOK(/*引数は忘れた*/)
{
 m_naniwo.GetWindowText(m_str1);
 m_donoyouni.GetWindowText(m_str2);
 CDialog::OnOK();
}
void CMyLoveView::OnRButtonDown(UINT nFlags, CPoint point) 
{
...
 temp +="私はあなたの" + dlg.m_str1;
 temp +="を" + dlg.m_str2;
...
}


maru  2009-07-15 19:06:21  No: 70583

> CString m_str1; // 追加
> CString m_str1; // 追加

間違い修正
 CString m_str1; // 追加
 CString m_str2; // 追加


ペンネーム  2009-07-15 19:09:33  No: 70584

maruさんどうもありがとうございました。
上のエラーの件は、解決しました。
また、ひとつお聞きしたいことがございまして、
今度は、リストボックスで、選んだ項目が
エディターに表示されなくなりました。
なにか設定忘れ戸かあるのでしょうか?
お忙しい中、教えていただきたいのですが・・・


ペンネーム  2009-07-15 19:41:23  No: 70585

上の表記に誤字がありました。
すみません。
なにか設定忘れ戸かあるのでしょうか?

なにか設定忘れ等があるのでしょうか?


maru  2009-07-15 20:29:58  No: 70586

> なにか設定忘れ等があるのでしょうか?
あなたがどこにどんな設定をしているのはわかりませんので、回答しようが有りません。

> 今度は、リストボックスで、選んだ項目が
> エディターに表示されなくなりました。
CkihonkeiDlg::OnOK()のm_naniwo.GetWindowText(m_str1);
でリストボックスで選んだ項目がとれているか、
CMyLoveView::OnRButtonDown(UINT nFlags, CPoint point) で
dlg.m_str1がどうなっているかをデバッガで追って見てください。


ペンネーム  2009-07-15 20:51:25  No: 70587

>CkihonkeiDlg::OnOK()のm_naniwo.GetWindowText(m_str1);
>でリストボックスで選んだ項目がとれているか、

デバッガで追ってみたのですが、
CkihonkeiDlg::OnOK()のm_naniwo.GetWindowText(m_str1);
のところでは、項目は取れていませんでした。

>CMyLoveView::OnRButtonDown(UINT nFlags, CPoint point) で
>dlg.m_str1がどうなっているかをデバッガで追って見てください。
同じように取れていません。


maru  2009-07-15 21:18:30  No: 70588

失礼、別のコントロールと勘違いしてました。
void CkihonkeiDlg::OnOK()
{
 int nSel = naniwo.GetCurSel();
 if (nSel != LB=ERR)
 {
   m_naniwo.GetText(nSel, m_str1);
 }
 CDialog::OnOK();
}
です。


ペンネーム  2009-07-15 22:18:18  No: 70589

maruさん、本当にどうもありがとうございました。
長い間、お手数おかけしました。
おかげさまでうまくいきました。
本当にどうもありがとうございました。

大変申し訳ないのですが、
ちなみに
>if (nSel!= LB=ERR)
if (nSel!= CB_ERR)
の間違えですよ・・・


maru  2009-07-16 00:19:47  No: 70590

> >if (nSel!= LB=ERR)
> if (nSel!= CB_ERR)
> の間違えですよ・・・
おっとっと。ちょっと打ち間違い。
LB_ERRの間違いです。CB_ERRはCCombBoxのエラー。
値は両方とも-1だから間違いじゃないけどね。
HELPをみてね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加