CommonDialog のプロパティ

解決


Marina  2005-11-01 03:01:46  No: 127166

CommonDialogで"ファイルを開く"画面になり"ファイル名(N):"の箇所でファイル名を指定する箇所の質問です。
最初デフォルトで"Test.txt"と表示しています。
そして、この"Test.txt"のファイル名を変えられないようにしたいです。
プロパティを検索しているのですが、期待通りの動作をするものがなく、駒っています。
どのようにしたらよろしいでしょうか?
大変申し訳ないのですが、併用でそこの項目に入力された文字を取得するプロパティのようなものはないでしょうか?
CommonDialog1.FileName だと、フルパスになってしまい、期待通りの動作ができません。
初歩的な質問で申し訳ないのですが、お願い致します。


ガッ  2005-11-01 03:15:27  No: 127167

ん…
フルパスを設定できるなら、フルパスで設定すればいいのでは…?


いな  2005-11-01 03:27:02  No: 127168

フルパスが取得できるのならば、
そこからファイル名にするのは簡単だよね?

InstrRevを使って加工すれば一行で書けるような気がするのだが
何か問題がありますか?


Marina  2005-11-01 03:47:53  No: 127169

ガッさん アドバイスありがとうございます。
説明不足で申し訳ありません。

もう少し状況を細かく説明すると
まず、ファイルの出力先を決定する動きにしたくて、フォルダ指定のダイアログ(APIを使ったダイアログ)でやっていたところ、出力する際に、他のファイルが見えていたほうが都合が良いとのことで、CommonDaialogを使用することとなりました。
しかし、CommonDaialogでは、ファイル名を指定しないと「保存」ボタンが押せないことに気が付き、そこで、ファイル名を固定にしてしまえば良いと思いました。
ですが、指定したはいいですが、手動で変更できてしまって思い通りにいかなくなりました。

フルパスで動作が上手くいかないというのは、最後のファイル指定の部分が手動で変えたパスで出力してしまうので不都合となっています、というつもりでした。
自分で書いてても自分の言い方がすごく伝わりにくな、って思っちゃいます。すみませんが、もう一度、そういった状況で私は、ファイル名を固定で手動変更不可、にすれば解決できるかと思いました。私の考えた方法の手段、または他に良い手段があったらご教授願います。

説明下手で本当に申し訳ありません。


ガッ  2005-11-01 04:19:42  No: 127170

えーと、とりあえず[CommonDialog].Flagsプロパティをもう一度確かめてみてください。


Marina  2005-11-01 04:57:54  No: 127171

いなさん ガッさん ありがとうございます。

> InstrRevを使って加工すれば一行で書けるような気がするのだが

strFileName = InstrRev(Dialog1.FileName , "ここがわかりません")
この使い方で合っているのでしょうか・・・。
どうも、上手くいかないようです。

>えーと、とりあえず[CommonDialog].Flagsプロパティをもう一度確かめてみ>てください。
CommonDialog.Flags の値は1024 となっています。
ファイル名を変動させても、1024となっています。

すみません、もう少しお願いしますm(__)m


ガッ  2005-11-01 05:23:56  No: 127172

|ω・`) しまった…「確かめる」といえば確かに確かめるだけで終始しまするな…

MSDNでFlagsプロパティを調べてみてください。
たとえば cdlOFNFileMustExist が設定されて…あれ、設定されていませんね…
うーん…本当に "ファイル名を指定しないと「保存」ボタンが押せない" ですか?

…こちら(VB6 SP6)で試したところ、指定したファイルが存在しなくても「保存」ボタンを押すことが出来たのですが…


Marina  2005-11-01 05:38:00  No: 127173

ガッさん、何度もありがとうございます。
MSDNで調べたところ・・・イメージの属性フラグということですが、すみません、何ともしっくりきません。。。

「保存」というか「開く」となっています。
ファイルを指定しても、ファイルの名前がなくても「開く」となり、ファイル名があれば、保存し、無ければ「開く」を押下しても何も起こりません。


ガッ  2005-11-01 05:40:54  No: 127174

> 「保存」というか「開く」となっています。
んー、[Commondialog].ShowSave メソッドを調べてみてください。

また MSDN を使って調べるときは、状況依存のヘルプが使えます。
ためしに、Flagプロパティの"Flag"の上でF1キーを押してみてください。
きっといい結果を得ることができます。


Marina  2005-11-01 05:54:55  No: 127175

ガッ さんありがとうございます。
まず、Dialog1.ShowOpenになっていたので、Dialog1.ShowSaveにすることで「開く」が「保存」に変わりました。
しかし、まだ、ファイル名がないと何も起きない状態です。

    With Dialog1
        .CancelError = True
        .InitDir = iniFileData.OutputDataFilePath
        .FileName = "001.txt"
        .ShowSave
    End With

>また MSDN を使って調べるときは、状況依存のヘルプが使えます。
>ためしに、Flagプロパティの"Flag"の上でF1キーを押してみてください。
>きっといい結果を得ることができます。
ヘルプってこうやって使用するのですね!
ちょっとびっくりしました・・・。
解決には至らなかったですが、すごく参考になります。


ガッ  2005-11-01 07:40:23  No: 127176

えーと、確か問題は、
・存在しないファイルを指定しても「開く」ボタンを押すことが出来なかった。
  →なので、存在しないファイルの場合は
    既定のファイル(001.txt ?)を選択させようとした。

ですが、現在は
・存在しないファイルを指定して「保存」ボタンを押すことが出来る。
はずです。
問題の原因は解消したと思いますが…

※また誤爆してるかなぁ…


030  2005-11-01 09:20:53  No: 127177

話が大きく戻ってしまうけどSHBrowseForFolderを使ってたんだったらulFlagsに
BIF_BROWSEINCLUDEFILES
の属性をつければファイルの一覧も表示できるよ。


Marina  2005-11-01 18:39:46  No: 127178

ガッさん・・・本当にすみません、私の説明が紛らわしいみたいです。

・ファイル名は固定で"001.txt"です。
・ユーザーはファイル名を変更できない。

これが追加しなければならない機能なんです。
しかし、私が中途半端に案を出してしまったため、変な誤解を生んでしまいました。

現状は
・手動で変更できてしまう。
これを修正したいです。

どうか、もう一度お願いしますm(_ _)m

>030 さん
アドバイスありがとうございます。
こちらの問題が解決したら、是非試してみます。


名無し  2005-11-01 19:09:56  No: 127179

それはもしかしたら、ダイアログに限ったことでなく、単にファイル名が変更されたらまずいってことなんじゃないの?

それとも、ダイアログで開くときにだけ変更されたらまずいってこと?


Marina  2005-11-01 19:35:33  No: 127180

名無し さんありがとうございます。

えっと、まず、Textファイルを出力するプログラムになっています。
前回まで、フォルダ指定形式のダイアログを使用していました。
フォルダのパスをユーザーが指定し、そのパスにプログラム上で固定のファイル名を付け足し、ファイルを出力していました。
これは正常に動作していました。

今回、"フォルダの中身を見れるように"とか"そのまま新規フォルダを作れるように"との要望のため、ダイアログの形式を変更することになりました。
CommonDialogを使用することになり、そこで発生し、その問題が上記の通りです。


ガッ  2005-11-01 20:01:38  No: 127181

けっこう特殊な動作を要求されていますね…
標準のコモンダイアログコントロールではフォルダを選択したりは出来なかったと思います。
(そして、空のファイル名も選択できない、なので"001.txt"と固定したいのですね?)

試してはいませんが、030さんの方法が一番手っ取り早くUIとしても十分だと思います。
強引にコモンダイアログでやろうとするなら、
WinAPIの GetSaveFileName() に渡す OPENFILENAME 構造体の lpfnHook メンバを調べてみてください。
ダイアログメッセージのフックを行って何か得られる"かも"しれません。


もげ  2005-11-01 20:06:17  No: 127182

どうしてもコモンダイアログにこだわるなら、いろいろ手はあると思うけど、
http://www.kanazawa-net.ne.jp/~pmansato/CommonDialog.htm
まずは、誤解を解くところから始めないとドロ沼化するだけだと思いますが。

・フォルダの中身を見れるように
SHBrowseForFolderでBIF_BROWSEINCLUDEFILES指定、
もしくはファイルリストボックス等を併用
(私見  フォルダを選択して決まった名前のファイルを作るのに
「フォルダの中身を見れるように」というのは変でしょう?
却下してもいいのでは?  私見終了)

・新規フォルダを作れるように
SHBrowseForFolderでBIF_NEWDIALOGSTYLE指定

でいいんじゃないですか?


Marina  2005-11-01 21:21:26  No: 127183

030 ガッ もげ さん ありがとうございます。
三方が言われる通りにするのが一番良いように思ってきました。

SHBrowseForFolderでBIF_BROWSEINCLUDEFILES指定
SHBrowseForFolderでBIF_NEWDIALOGSTYLE指定
を実装してみたのですが、指定方法が上手くいきません。

    Dim tBrowseInfo         As BROWSEINFO
    Dim lFoldPointer        As Long
    Dim szPath              As String * 1024
    
    OpenDirDialog = ""
    m_szDefPath = szDefPath

    With tBrowseInfo
        .hwndOwner = hWnd
        'ルートフォルダを設定
        .pidlRoot = CSIDL_DESKTOP
        .lpszTitle = szTitle
        'フラグを立てる
        .ulFlags = BIF_BROWSEINCLUDEFILES ← この行で"変数が定義されていません"エラーがでます。
        .lpfn = FunctionAdress(AddressOf BrowseCallbackProc)
    End With

    '[フォルダの参照]ダイアログを呼び出す
    lFoldPointer = SHBrowseForFolder(tBrowseInfo)

指定の方法が間違っているのでしょうが、どのように指定したらよいのでしょうか・・・。
何度も申し訳ありませんがお願いします。


030  2005-11-01 21:34:53  No: 127184

http://www.google.com/search?num=50&hl=ja&q=BIF_BROWSEINCLUDEFILES&lr=lang_ja


Marina  2005-11-01 21:54:27  No: 127185

030 さん ありがとうございます。

見つかりました。
何から何まで本当にすみません。

どちらも動作は確認することができました。
でも、両方同時にというのは難しいのでしょうか・・・?
.ulFlags = BIF_BROWSEINCLUDEFILES
.ulFlags = BIF_NEWDIALOGSTYLE

のように二つ並べてしまうと当然、後ろに書いたほうが上書きされてしまい、片方しか実装できないのですが、どのように設定すればよろしいでしょうか。


030  2005-11-01 22:07:40  No: 127186

API使ってるから基礎的なことは分かっている人だと勘違いしてました。
そのプログラムを完成させる前に学ぶべきことは多そうですね。

とりあえずコモンダイアログのFlagsプロパティにはどのように
フラグをセットしていったか思い出してください。


もげ  2005-11-01 22:10:15  No: 127187

.ulFlags = BIF_BROWSEINCLUDEFILES Or BIF_NEWDIALOGSTYLE

論理演算子について調べて理解してください。
(APIを使うなら必須ですよ。)


Marina  2005-11-01 22:16:27  No: 127188

ガッさん いなさん 030さん 名無しさん もげさん
初歩的な質問ばかりに付き合ってくれて、本当にありがとうございました。
期待通りの動作が確認できました。


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

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






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