オープンダイアログの初期値を設定するには?


マイケル  2006-05-26 05:16:45  No: 21814

お世話になります。
OpenDialog を使ってファイル名を取得しているのですが、
OpenDialog 表示したときの初期値を
レポート(サイズや日付が表示されるタイプ)で表示し、
さらに、最新の日付順で表示したいのですが
どのようにすればよいのでしょうか?


カレーライズ  2006-05-26 07:36:34  No: 21815

うーん。プロパティとかでは設定できない感じですね。
ぎこちないと思うけど以下の方法だとできると思うけど。実装してないからできるかはわからないけど参考程度に・・・
あと  開くいたあとの動作です。

i)  OpenDialogの開く位置から、予め「表示」ボタンの位置と「詳細」メニューの位置の座標(スクリーン座標)を控えておく
ii) SetCursorPos()を使って「表示」ボタンの位置で mouse_eventでクリックイベントを発生させる
iii) そのあと  ii)と同じように 「詳細」でmouse_eventを発生させる

こんな感じかな。


かみづ  2006-05-26 10:06:49  No: 21816

これを応用してできないでしょうか?
http://forum.nifty.com/fdelphi/samples/00650.html


えーとね  2006-05-26 17:59:36  No: 21817

レポート表示は
TOpenPictureDialogの表示メニューについて
https://www.petitmonte.com/bbs/answers?question_id=1923

$702Cを送ります。


ん?  2006-05-27 00:12:27  No: 21818

いつか役に立つかもしれないで、ちょっと調査してみました。

Googleのキャッシュから拾ってくると(ほかでは見つからず)
> CDN_INITDONE ではListViewのウィンドウハンドルが得られない様
とのことで、FolderChange イベントで実行することにしました。

「レポート(詳細)表示」については、「かみづ」さんと「えーとね」の回答と同じ手順で行います。
また、並べ替えは、カラムをクリックしたことにして、昇順・降順で表示します。

たぶん、uses に Commctrlが追加で必要。
フォームにOpenDialogを一個置いて、OnFolderChangeイベントを記述します。

procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
var
  fhShellDll,
  fhListVw: HWND;
  wmNotify: TWMNotify;
  hdNotify: THDNotify;
begin
  fhShellDll := FindWindowEx(GetParent(OpenDialog1.Handle), 0, 'SHELLDLL_DefView', nil);
  if fhShellDll <> 0 then begin

    {詳細表示}
    SendMessage(fhShellDll, WM_COMMAND, $702c, 0);

    //WC_LISTVIEW='SysListView32': commctrl.pas
    fhListVw := FindWindowEx(fhShellDll, 0, WC_LISTVIEW, nil);

    if fhListVw <> 0 then begin
      hdNotify.Hdr.hwndFrom := FHListVw;
      hdNotify.Hdr.idFrom := 1;
      //LVN_COLUMNCLICK: commctrl.pas
      hdNotify.Hdr.code := LVN_COLUMNCLICK; 
      hdNotify.Item := -1;
      //3列目:更新日時
      hdNotify.Button := 3;
      hdNotify.PItem := nil;
      wmNotify.Msg := WM_NOTIFY;
      wmNotify.IDCtrl := 1;
      wmNotify.NMHdr := @hdNotify;

      //カラムをクリックしたことにして、昇順に並び替えてもらう
      SendMessage(fhShellDll, WM_NOTIFY, TMessage(wmNotify).WParam, TMessage(wmNotify).LParam);
      //降順にするときは、もう一回
      //SendMessage(fhShellDll, WM_NOTIFY, TMessage(wmNotify).WParam, TMessage(wmNotify).LParam);
    end;
  end;
end;

以上

問題点
・3列目が、更新日時とは限らないのではないかと思うが、よくわからない。
・ファイル数が多いと、ソートに時間がかかると思われる。

動作確認
Windows XP SP1(実機)
Windows95(たぶんB) (in VirtualPC)
Windows98 SE (in VirtualPC)
WindowsNT4.0 (in VirtualPC)
WindowsXP SP2 (in VirtualPC)


ん?  2006-05-27 00:15:22  No: 21819

[補足]

> > CDN_INITDONE ではListViewのウィンドウハンドルが得られない様
> とのことで、FolderChange イベントで実行することにしました。
WM_NOTIFYメッセージのCode=CDN_INITDONE で、OnShow イベントが
発生するので、OnShow では、 'SHELLDLL_DefView' のハンドルが取得できません。

・・ということ。
わかる人にはわかる補足(^^ゞ


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

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






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