リストビューに選択したファイルの詳細を表示する方法 – 固定ページ 2 – プログラミング – Home

リストビューに選択したファイルの詳細を...
 
通知
すべてクリア

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

固定ページ 2 / 2

はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

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

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


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

選択したものは

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();
}

}

で選択しています。


返信引用
三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
 

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

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

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


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

CString path = C:\\windows;
path += \\*.*;
で、C:\\windows;をpszBuffer;にって事ですよね?それだとリストビュー内に何も
表示されませんでした。

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

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

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

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


返信引用
三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
 

> 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);
}
・・・


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

すいません、遅れました。

CString path = pszBuffer;

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

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

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

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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

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

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

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


返信引用
三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
 

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

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

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


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

また、危険な事をしていたみたいですね。すいません。謝るよりも自分の為に改善しな
きゃいけないですね。

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

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

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


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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