怎樣可以限制 TOpenDialog 衹有在某個目錄下作用?例如,如果限制了目錄為 D:\Programs\Delphi,則 TOpenDialog 打開時衹顯示這個目錄及這個目錄下的所有子目錄,而且限制不能跳到 D:\Programs\Delphi 的其它上級目錄或其它磁盤去,怎樣才能實現?

解决方案 »

  1.   

    dlgOpen1FolderChange 在这下面写控制事件 比较字符串
      

  2.   


    我看了 FolderChange 這個事件,但似乎FolderChange是在Folder在改變後才觸發的,這樣的話判斷當前目錄還有用嗎?怎樣控制?
      

  3.   


    -----------
      改变前纪录一下当前位置 在foloderchange事件里 如果超过你限制范围 返回纪录的位置
      

  4.   

    還是不明白,你指的記錄是甚麼?我查到OpenDialog 中有Files 和 HistoryList 兩個List,但怎樣控制它跳到某個記錄?而改了這個記錄後OpenDialog會自己改變當前目錄?能給出兩行代碼嗎?
      

  5.   

    HistoryList 已经没什么用了 是以前老版本delphi   可以这样吗?   var
         OldStr:STRING;   dlgOpen1FolderChange  里做对比 如果超过范围则返回到 你指定的目录。
      

  6.   

    uses FileCtrl
    procedure TchmForm.Button1Click(Sender: TObject);
    var dir:string;
    begin
      SelectDirectory('test','c:\', dir);
    end;
    这是限制选择文件夹位置.限制选择文件要绕个弯子(我目前所能找到的办法)
    定义两个全局变量:
    var OpenDialog:TOpenDialog;
        dir:string;procedure TchmForm.Button1Click(Sender: TObject);
    begin
      dir:='c:\';
      OpenDialog:=TOpenDialog.Create(nil);
      OpenDialog.InitialDir := dir;
      OpenDialog.OnSelectionChange := mytest;
      OpenDialog.Execute;
    end;procedure TchmForm.mytest(Sender: TObject);
    begin
      if Pos(dir,LowerCase(OpenDialog.FileName))=0 then
      begin
        OpenDialog.Free;
        Button1.Click;
      end;
    end;结果是用户可以切换驱动器,但切换后,一旦他选择某个文件或文件夹,即切换到初始状态(无闪烁)
      

  7.   


    type
      TForm1 = class(TForm)
        Button1: TButton;
        OpenDialog1: TOpenDialog;
        procedure Button1Click(Sender: TObject);
        procedure OpenDialog1FolderChange(Sender: TObject);
      private
        { Private declarations }
        Busy: boolean;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure SetOpenDialogDir(hWnd: HWND; Path: string;var Busy:Boolean);
    const
      ID_FILENAME_98 = 1152;
      ID_FILENAME_WIN2K=1148;
      ID_OK = 1;
    var
      hFileName: THandle;
      hOK: THandle;
      Buff:string[255];
    begin
      if Busy then exit;
      Busy:=True;
      if Win32MajorVersion >= 5 then
      begin
        hFileName:= GetDlgItem(GetParent(hWnd), ID_FILENAME_WIN2K);
        hFileName:=FindWindowEx(hFileName,0,'ComboBox',nil);
        hFileName:=FindWindowEx(hFileName,0,'Edit',nil);
      end else hFileName := GetDlgItem(GetParent(hWnd), ID_FILENAME_98);
      hOK := GetDlgItem(GetParent(hWnd), ID_OK);
      GetWindowText(hFileName,@Buff[1],Length(Buff));
      if LowerCase(Buff)=LowerCase(Path) then exit;
      SetWindowText(hFileName, pchar(Path));
      SendMessage(hOK, WM_LBUTTONDOWN, MK_LBUTTON, MAKEWORD(0, 0));
      SendMessage(hOK, WM_LBUTTONUP, MK_LBUTTON, MAKEWORD(0, 0));
      Busy :=False;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      OpenDialog1.Execute;
    end;procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
    begin
      SetOpenDialogDir(OpenDialog1.Handle, 'D:\Programs\Delphi',Busy);
    end;
      

  8.   

    這個方法的確是簡接地有效,但是在轉換時并不是沒有閃爍的。我剛今天查了很多資料,我想這樣做,在FolderChange事件中用FindWindow找出OpenDialog中的那個SysListView32及那個dir combolist,遍歷所有SysListView32中的元素,把所有在指定目錄外的item 刪掉,對combolist也一樣,遍歷所有item,把在指定目錄外的元素刪掉。我測試了一下, 以 D:\programs\Delphi 為例,把所有名稱為不是Delphi的item 去掉,結果目錄就被定在Delphi中了。但是,我要的不是定在某個目錄下,而是允許這個目錄以及這個目錄下所有子目錄,因此,我要的是比較sysListview32 及 dir combolist中每個item的路徑,可以我衹能返回它們的display name,怎樣才能獲取相應的路徑?
    我查了查 win32 API,似乎有個DlgDirSelectComboBoxEx,但是它的第四個參數要求combolist的ID,我衹知道這個combolist的handle,怎樣取得它的ID?