- ベストアンサー
リストコントローラについての問題
- MFCを使用して画面にリストコントローラとボタンを配置しましたが、選択したファイルがリストコントロールに反映されない問題が生じています。一度レジストリに覚えていた値を削除すると正しく反映される場合もあり、対処方法がわかりません。
- リストコントローラについての問題が発生しています。選択したファイルが反映されない場合があり、解決策が分かりません。一度レジストリに覚えていた値を削除すると正しく反映されることもあります。
- WindowsXP ProとVC++6.0を使用して画面にリストコントローラとボタンを配置しました。しかし、選択したファイルがリストコントロールに反映されない問題が発生しています。ただし、一度レジストリに覚えていた値を削除すると問題は解消しますが、再現性がありません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>DWORD kind; >INT size = sizeof(INT); >INT colWidth; >::RegQueryValueEx(hKey,"Column0",NULL, &kind, (BYTE*)&colWidth, &size)); 読み込むところも、とりあえず上のコードの部分は問題なさ送ですね。キーのopenがないんでそっちはわかりませんが。 ということで、順番に調査するしかなさそうですね。 まず、レジストリに書かれた値がおかしいということから、 「レジストリに値を書く処理は動作している。」と推定できます。 では、値が不正になるタイミングはどこなのかというと、 1.カラム幅の取得 2.レジストリの値の書き込み 3.レジストリの値の読み込み(ただし、アプリケーション終了時に無条件にカラム幅を書き込む処理が組まれているとき) 3.絡む幅の設定(ただし、アプリケーション終了時に無条件にカラム幅を書き込む処理が組まれているとき) のどれかと考えられます。 上記の処理が正しく行われているかを戻り値等を確認していくしかないでしょう。 ASSERTマクロを利用するのも手だと。 #動きがおかしいといって聞く前に、まず戻り値くらいは見ましょうね。あとはWinAPIを使うのでしたらGetLastError()の値も。
その他の回答 (2)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>>どうやって? >>ここがわからないと誰も答えられないと思いますど。 > >保存するキーをRegCreateKeyEx()関数でオープンして、 >カラム幅を取得して、RegSetValueEx()関数を使用しています。 >具体的にコードで下記に記述します。 特に問題なさそうですね。 ちなみに、 >そこで、一度レジストリに覚えていた値を削除してプログラムを起動したところ、正しく反映されていました。 ってことですが、そのときにレジストリにかかれていた値はなんだかわかりますか? 幅が0になってて、次回起動時にファイル名を表示したんだけど単純に見えなくなってるだけのような気がするのですが。 あと、できればレジストリを読み込むところのコードも一緒に。 #ちなみにCListCtrlはMFCのクラスの名前です。本当のコントロールの名前はListViewコントロールです。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>今MFCを使用して、画面にリストコントローラと、ボタンを配置しました。処理の流れとして、 リストコントローラってなんですか? カラム幅ってあるからリストビューのことですか? >1.ボタンを押すと、CFileDialogクラスを起動して、 訳わかりませんが。クラスを起動するってのが。 DoMoadlメソッドを呼び出すことですか? >3.終了時にリストのカラム幅をレジストリに覚える。 どうやって? ここがわからないと誰も答えられないと思いますけど。 #勝手に言葉を作るのはやめましょう。
補足
説明不足ですみません。補足させていただきます。 >リストコントローラってなんですか? >カラム幅ってあるからリストビューのことですか? CListCtrlのことです。 >訳わかりませんが。クラスを起動するってのが。 >DoMoadlメソッドを呼び出すことですか? はい。CFileDialogオブジェクトを生成して、DoModalメソッドを呼び出しています。 >どうやって? >ここがわからないと誰も答えられないと思いますど。 保存するキーをRegCreateKeyEx()関数でオープンして、カラム幅を取得して、RegSetValueEx()関数を使用しています。具体的にコードで下記に記述します。 <<コード>> HKEY hKey; DWORD sts; CListCtrl *pListCtrl = (CListCtrl*)GetDlgItem(IDC_LISTCTRL); ::RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Test", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &sts); INT iWidth = pListCtrl->GetColumnWidth(0); ::RegSetValueEx(hKey,"Column0",0,REG_DWORD,(BYTE*)&iWidth, sizeof(INT)); よろしくお願いします。
補足
>そのときにレジストリにかかれていた値はなんだかわかりますか? 0x77CFF465というとても大きな値になってました。 コードの補足です。 RegSetValueEx()でDWORDの値を書き込む前に、文字列を書き込もうとしていました。ただ、最後の引数のサイズに問題があるのかと思い、後にs.GetLenth()+1に修正しました。 <<コード>> CString s = "test"; ::RegSetValueEx(hKey,"StringTest",0,REG_SZ,(BYTE*)(LPCTSTR)s, s.GetLength()); <<値と読みところ>> DWORD kind; INT size = sizeof(INT); INT colWidth; ::RegQueryValueEx(hKey,"Column0",NULL, &kind, (BYTE*)&colWidth, &size)); 以上、よろしくお願いします。