お世話になります。
OpenDialog を使ってファイル名を取得しているのですが、
OpenDialog 表示したときの初期値を
レポート(サイズや日付が表示されるタイプ)で表示し、
さらに、最新の日付順で表示したいのですが
どのようにすればよいのでしょうか?
うーん。プロパティとかでは設定できない感じですね。
ぎこちないと思うけど以下の方法だとできると思うけど。実装してないからできるかはわからないけど参考程度に・・・
あと 開くいたあとの動作です。
i) OpenDialogの開く位置から、予め「表示」ボタンの位置と「詳細」メニューの位置の座標(スクリーン座標)を控えておく
ii) SetCursorPos()を使って「表示」ボタンの位置で mouse_eventでクリックイベントを発生させる
iii) そのあと ii)と同じように 「詳細」でmouse_eventを発生させる
こんな感じかな。
これを応用してできないでしょうか?
http://forum.nifty.com/fdelphi/samples/00650.html
レポート表示は
TOpenPictureDialogの表示メニューについて
https://www.petitmonte.com/bbs/answers?question_id=1923
$702Cを送ります。
いつか役に立つかもしれないで、ちょっと調査してみました。
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)
[補足]
> > CDN_INITDONE ではListViewのウィンドウハンドルが得られない様
> とのことで、FolderChange イベントで実行することにしました。
WM_NOTIFYメッセージのCode=CDN_INITDONE で、OnShow イベントが
発生するので、OnShow では、 'SHELLDLL_DefView' のハンドルが取得できません。
・・ということ。
わかる人にはわかる補足(^^ゞ
ツイート | ![]() |