怎样在openfiledialog打开时自动选中某个文件?(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
注意是选中文件,不仅仅是在edit框里显示文件名.<br>并且,如果该文件不在视野里,还要把它MakeVisible
 
那要是该文件不存在呢?
 
当然我事先已经确定该文件存在了
 
不知道,如果实在没好办法,那只好模拟键盘或鼠标输入了(也麻烦!) :-(
 
我知道大概方法:<br>先findwindow找到listview句柄,然后用sendmessage先让它查找某一个caption,<br>然后让它选择该item.<br><br>但是我第一步就卡壳了,无法找到listview的句柄.
 
找hwnd:<br>在opendialog的 OnFolderChange 事件(注意每变一次目录就会调用一次,<br>如果你只需要运行一次,那只能用一个变量指示一下只执行一次)<br>不要在onshow事件(因为我发现nt下在onshow事件里面还找不到这个窗口)<br><br>var h:HWND;<br><br>h:=GetDlgItem(GetParent(OpenDialog1.Handle),1121);<br><br>坏消息:<br>我发现它是 SHELLDLL_DEFVIEW 类,<br>我发 listview 的消息控制它:失败。<br>我发 listbox 的消息控制它:失败。
 
Pipi.兄:<br><br>》1121<br>&nbsp; 你是如何知道的? &nbsp;
 
》1121 &nbsp;你是如何知道的? &nbsp;<br><br>用winsight32先找到那个类似listview的窗口, GetDlgCtrlId 得到该<br>控制的id,当然这不一定有用,是0 的话肯定没用,然后检查一下在<br>父窗口中是否唯一的id,是的话就可以使用了。<br><br>control id在delphi是没有用上的,很多人都不熟悉。<br>不过纯用api,或者以前用owl,或者用resource创建对话框就要用它了。
 
关注 〉〉
 
&gt;&gt;在opendialog的 OnFolderChange 事件<br>我原先没注意到这个问题,估计可能就是卡在这里了.<br><br>&gt;&gt;我发现它是 SHELLDLL_DEFVIEW 类,<br>它应该有一个子窗体,类名是"SysListView32", pipi再试一试看.<br>我这两天可能没时间干这个了.
 
var<br> h:HWND;<br> f: LV_FINDINFO ;<br> i:integer;<br>begin<br>h:=GetDlgItem(GetParent(OpenDialog1.Handle),1121);<br>h:=GetWindow(h,GW_CHILD);<br>f.flags:=LVFI_STRING ;<br>f.psz:='project1.exe';<br>i:=ListView_FindItem(h,-1,f);<br>if(i&gt;=0)then<br>&nbsp; begin<br>&nbsp; SetWindowLong(h, GWL_STYLE,GetWindowLong(h, GWL_STYLE) or LVS_SHOWSELALWAYS);<br>&nbsp; &nbsp; &nbsp;//缺省的listview在失去焦点时不显示selection,这里使它显示<br>&nbsp; ListView_SetItemState(h,i,LVIS_SELECTED ,LVIS_SELECTED );<br>&nbsp; end;<br>end;<br>
 
习习,我也刚搞出来,准备进来给大家报喜,没想到pipi抢到前头了..<br>我的做法和pipi基本一致,共大家参考:<br><br>var hparent,hlist:hwnd;<br>&nbsp; Info: TLVFindInfo;<br>&nbsp; Index: Integer;<br>begin<br>&nbsp; hparent:=getparent(odlg.handle);<br>&nbsp; hlist:=findwindowex(hparent,0,'SHELLDLL_DefView',nil);<br>&nbsp; hlist:=findwindowex(hlist,0,'SysListView32',nil);<br><br>&nbsp; with Info do<br>&nbsp; begin<br>&nbsp; &nbsp; flags := LVFI_STRING or 0 or LVFI_WRAP;<br>&nbsp; &nbsp; psz := PChar('res.zip');<br>&nbsp; end;<br>&nbsp; Index := ListView_FindItem(hlist, 0, Info);<br><br>&nbsp; windows.setfocus(hlist); &nbsp;//给他设置焦点<br>&nbsp; ListView_EnsureVisible(Hlist, index div 5,false); &nbsp;//强制visible<br>&nbsp; ListView_SetItemState(Hlist, Index, LVIS_SELECTED+LVIS_FOCUSED, LVIS_SELECTED+LVIS_FOCUSED);<br><br>&nbsp; caption:=inttostr(index);<br>end;<br><br>不过现在还有几点疑问:<br>1.ListView_EnsureVisible(Hlist, index div 5,false); &nbsp;//强制visible<br>&nbsp; 这句话,必须把index div 5才有效,我猜是因为那个listview每列显示5行的缘故,<br>&nbsp; 那么我如何判断每列显示6,7...行的情况?<br>&nbsp; (不过这个问题如果困难就算了,因为好像opendialog初始化都是5行的 :-))<br><br>2.如果当前windows资源管理器设置"隐藏已知文件类型后缀名",那么"xxx.exe"<br>&nbsp; 在opendialog里面显示的是"xxx",这样用find就找不到了,请问怎样处理这种情况?
 
第二个疑问补充: 我应该可以先判断当前资源管理器是否是"隐藏后缀名",<br>如果是,再检查要查找的文件是否为已经登记的"后缀名",如是则用"xxx"<br>来find,如果不是,就用"xxx.xxx"来判断.<br>&nbsp;
 
好像不是这么简单,比如,如果同一目录下有"res","res.zip"两个文件,<br>如果系统设置为"隐藏后缀名",那么你用findcaption找到的是 "res"这个<br>文件,而不是"res.zip",我如果知道那一个才是我要找的文件呢?<br><br>看看openfiledialog的OnIncludeItem事件有没有帮助?
 
前面问题的300分归pipi所有了.<br><br>关于第二个疑问,我追加300分.
 
看来后面300分也要归我了。cakk可不要食言啊<br><br>下面看到的是第0个(就是第一个,从0开始) 文件的全路径名字(包括目录、文件名、扩展名)<br><br>(h是listview的hwnd)<br><br>item.mask:=LVIF_PARAM ;<br>item.iItem:=0; &nbsp; &nbsp;//第0个文件<br>item.iSubItem:=0;<br>ListView_GetItem(h,item);<br>SHGetPathFromIDList(PItemIDList(item.lParam),buf);<br>ShowMessage(buf); &nbsp;//看到 fullpath name<br>
 
直接使用OpenDialog1.FileName也可得到全名。
 
还是Pipi.的方法好,不选中都可以。
 
后退
顶部