リストビューに選択したファイルの詳細を表示する方法

[戻る]
はな 2006/07/11(火) 15:54:55
OSはWindows XPでVisual Studio2005のVC++です。
MFCアプリケーションのダイアログベースで、ボタン(IDC_KARI)上に『SetDlgItemText
(IDC_KARI,pszBuffer);』で表示されたファイルの場所をリストビューに表示orもってい
きたいのですが、わかる方お願いします。

PATIO 2006/07/11(火) 16:12:21
言っている事がよくわからないです。
ボタンのキャプションに表示されている文字列がファイルの場所を示していて
リストコントロール上に表示したいと言うのはその文字列を表示したいのですか?
それともその場所にあるファイルの一覧を表示したいのでしょうか?
操作イメージがもっと良くわかるようにうまく説明をお願いします。
なにせ、掲示板の場合は文章だけが頼りなのでうまく表現しないと
内容が伝わりません。

PATIO 2006/07/11(火) 16:13:40
そもそも表示したいリストコントロールって何処にある物なんでしょう?

はな 2006/07/11(火) 16:22:12
すいません。
まず、表示したいファイルはパソコンの中にある、マイドキュメントやCドライブ等の
ファイルの中身です。
今は、実行するとファイルが選択できる状態で、選択したファイルの場所がボタン上に
表示されています。

はな 2006/07/11(火) 16:24:34
マイドキュメントを選択すると『C:\Documents and Settings\????\My Documents』とボ
タン上に表示されています。このデータをリストビューの方へもっていって、ファイル
の中身を表示させたいのですが。

三草 2006/07/11(火) 16:30:42
えっと、、、ご質問を整理すると。

1.何かの処理でボタンコントロールへ SetDlgItemText()で、
  何かのファイルの場所(C:\windowsとか?)が表示される
2.表示したファイルの場所を、リストビューコントロールにも表示したい

ということをやろうとしている?
いや、でもタイトルは、リストビューに選択したファイルの詳細を・・・だよな。。。

申し訳ない。
何をやろうとしているのか分からなく、
何に困っているのか分からないので、お答えができないです。

・どういったことをやろうとしていて、
・何をやる方法が分からないか

をもう少し明確にしていただけると、大変助かります。
# 私の読解力がないだけ??

はな 2006/07/11(火) 16:37:07
すいません。まず、単純にやりたい事は、選択したファイルの場所(マイドキュメントや
マイコン)の詳細(名前、更新日時など)を自由に表示させたいです。

はな 2006/07/11(火) 16:42:36
CString path = "C:\\windows";
path += "\\*.*";
で、Cドライブの中のwindowsの詳細が表示できる状態です。この" "の中身を変更する
と変更した場所のが表示されます。

はな 2006/07/11(火) 16:45:14
そこで、書き換えをせずに、自分が選択したものが詳細表示されるようなものがつくり
たいのですが。現在、選択したものがボタン上に表示されているので、それを" "の中
にいくようにすれば完成しそうなのですが。

三草 2006/07/11(火) 16:45:50
ぉぉぅ、PATIOさんがご指摘されてました。
しかもはなさんが、その回答まで。。。orz

FindFirstFile() もしくは FindNextFile()でファイルの検索をかけ、
見つかれば、ファイルのデータが第2引数のLPWIN32_FIND_DATAに入っているかと。

はな 2006/07/11(火) 17:03:08
ありがとうございました。なんとなく説明がわかりました。

三草 2006/07/11(火) 17:06:59
あれ、勘違いしてました。。。?

えっと、イメージされている機能としては、

 ・ボタンコントロール
   → ファイルの場所(C:\windows とか)を表示するだけ

 ・リストビューコントロール
   → ボタンコントロールに表示されたファイルの詳細(作成日時とか)を表示する

であってます?




あれ、
> そこで、書き換えをせずに、自分が選択したものが詳細表示されるようなものがつくり
> たいのですが。現在、選択したものがボタン上に表示されているので、それを" "の中
> にいくようにすれば完成しそうなのですが。
ということは、ただ単に、ボタンコントロールに
『SetDlgItemText(IDC_KARI,pszBuffer);』
でセットした文字列が欲しいと言っています?
であれば、pszBufferがそのままだと思いますが。。。?

それとも、GetWindowText()や、GetDlgItemText()のような、
コントロールからテキストを得る方法が分からないと言うことでしょうか?

はな 2006/07/11(火) 17:14:25
イメージはあってます。ボタンの上の表示は別に必要ないのですが、なぜか表示されて
いるので使ってます。

リストビューコントロールに選択した詳細さえ表示できればいいのですが。この『選択
したもの』が重要なのですが…。

三草 2006/07/11(火) 17:27:53
『選択したもの』は、どこで選択しているのでしょうか?

三草 2006/07/11(火) 17:31:49
> ボタンの上の表示は別に必要ないのですが、なぜか表示されて
> いるので使ってます。
ご自分で『SetDlgItemText(IDC_KARI,pszBuffer);』で設定しているのでは。。。?

はな 2006/07/11(火) 17:35:15
>> ボタンの上の表示は別に必要ないのですが、なぜか表示されて
>> いるので使ってます。
>ご自分で『SetDlgItemText(IDC_KARI,pszBuffer);』で設定しているのでは。。。?

いまの所この方法でしか場所が表示されないので、しています。他のプログラムを真似
ながらやっているのであまりわかっていない感じなのです。

はな 2006/07/11(火) 17:38:25
選択したものは

void CSampleDlg::OnBnClickedButton1()
{
    
    //「フォルダの参照」ダイアログを表示する    
    LPMALLOC pMalloc;
    
    //Shellの標準のアケロータを取得する
    
    if(::SHGetMalloc(&pMalloc) == NOERROR)
    {
        BROWSEINFO bi;
        TCHAR pszBuffer[MAX_PATH];
        LPITEMIDLIST pidl;
        
        bi.hwndOwner = GetSafeHwnd();
        bi.pidlRoot = NULL;
        bi.pszDisplayName = pszBuffer;
        bi.lpszTitle = _T("ファイルを検索するフォルダを")
                        _T("選択してください");
        bi.ulFlags = BIF_RETURNFSANCESTORS |
            BIF_RETURNONLYFSDIRS;
        bi.lpfn = NULL;
        bi.lParam = 0;
        
        //ダイアログ ボックスを表示する。
        if((pidl = ::SHBrowseForFolder(&bi)) != NULL)
        {
            if(::SHGetPathFromIDList(pidl,pszBuffer))
            {
                SetDlgItemText(IDC_KARI,pszBuffer);

                

                                
                                
        
            }
            pMalloc->Free(pidl);
        }
        pMalloc->Release();
    }
    

}

で選択しています。

三草 2006/07/11(火) 18:07:55
フォルダ選択ダイアログで指定されたファイル(のパス)を、取得したいのですよね?
やはり、pszBufferに格納されているかと。

サンプルソースをそのままコピーするのも、一つの手だとは思いますが、
何をやっているか理解してコピーしなければ、あとで大変な苦労をしますよ。

また、画面に表示されたからOK/動いたからOK。とするのではなく、
「なぜ動いたのか」を理解しなければ、ステップアップに繋がりませんし、
大変な危険を持ったソースになりかねません。

はな 2006/07/11(火) 19:24:41
CString path = "C:\\windows";
path += "\\*.*";
で、"C:\\windows";を"pszBuffer";にって事ですよね?それだとリストビュー内に何も
表示されませんでした。

>サンプルソースをそのままコピーするのも、一つの手だとは思いますが、
>何をやっているか理解してコピーしなければ、あとで大変な苦労をしますよ。

アドバイスありがとうございます。その場しのぎでは何もならないのはわかります。基
本からコツコツがんばりたいと思います。


>また、画面に表示されたからOK/動いたからOK。とするのではなく、
>「なぜ動いたのか」を理解しなければ、ステップアップに繋がりませんし、
>大変な危険を持ったソースになりかねません。

確かに出来上がりだけ満足して、過程の重要さを忘れているかもしれません。今の所、
あまり危険さがわかっていないので、もしかしたら今後の大失敗につながるのかもしれ
ません。一文、一文見ながらやっていきたいと思います。

三草 2006/07/11(火) 19:38:32
> "C:\\windows";を"pszBuffer";にって事ですよね?
もしかして、
CString path = "pszBuffer";
とやってます?
それでは、pathに"pszBuffer"としか入らないです。
ダブルクォーテーション(" ")で囲むと、文字列として認識され、変数として機能しませ
んよ。

あと一点確認したいのですが、デバッグで動かしたとき、pszBufferにちゃんとパスが
入ってますか?

・・・
//ダイアログ ボックスを表示する。
if((pidl = ::SHBrowseForFolder(&bi)) != NULL)
{
    if(::SHGetPathFromIDList(pidl,pszBuffer))
    {
        SetDlgItemText(IDC_KARI,pszBuffer);  ←ココでブレークポイント

    }
    pMalloc->Free(pidl);
}
・・・

はな 2006/07/12(水) 08:58:01
すいません、遅れました。

CString path = pszBuffer;

としたら、リストビューにローカルディスク(C:)の中身が表示されていました。とりあ
えず、OKです。

> SetDlgItemText(IDC_KARI,pszBuffer);  ←ココでブレークポイント
と、した所、

自動変数の値が0*0012f414"フフフフフ…"
型がchar[260]

となっていました。この、"フフフ"は以前も出た事あります。


これからしたい事は、実行した時に、はじめはリストビュー内に何も表示されていない
状態で、フォルダ選択ダイアログで指定した自分の好きなファイルを選択した後にその
選択したファイルがリストビュー内に表示されるようなものができれば完成なのです
が。

Blue 2006/07/12(水) 09:34:40
> この、"フフフ"は以前も出た事あります。
単に領域を初期化しないと、VCではある特定の値が入るようになっているからです。
(デバッグ版のみだったかな。)

気持ち悪いならば、memsetで初期化するなり、宣言時に初期化するなりしてください。

> TCHAR pszBuffer[MAX_PATH];
TCHAR szBuffer[ MAX_PATH ] = _T( "" );


ちなみに、ポインタ型変数でないのであれば、変数の頭にpをつけないほうがよいかも。

三草 2006/07/12(水) 10:21:36
>>また、画面に表示されたからOK/動いたからOK。とするのではなく、・・・
> ・・・
> としたら、リストビューにローカルディスク(C:)の中身が表示されていました。
> とりあえず、OKです。
危険ですよ〜
特に、
SetDlgItemText(IDC_KARI,pszBuffer);
のブレークポイントでパスが入っていないのに、なぜ、
CString path = pszBuffer;
で入るのか?かなり怪しい動きをしていませんか。。。?
# 上記がどこにあるか不明ですが。

はなさんのご発言から察するに、おそらく「これからしたい事」は、
今までの技術で実現できると思いますよ。

あとは、それぞれの関数/アルゴリズムが、
どのような動きをするかを調べ整理し(すでに組んであるところも含め)、
不明なところはMSDNやGoogle等で調べ、うまく組み合わせることが出来れば、
見事完成できるかと。

はな 2006/07/12(水) 11:21:24
[[解決]]
また、危険な事をしていたみたいですね。すいません。謝るよりも自分の為に改善しな
きゃいけないですね。

関数を足したり、教えてもらって自力ではありませんでしたが、完成しました。

三草さん、みなさんありがとうございました。

またどこかで…。勉強になりました。

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