代码之家  ›  专栏  ›  技术社区  ›  mjn anonym

Delphi中的SelectDirectory对话框如何动态验证突出显示的文件夹?

  •  4
  • mjn anonym  · 技术社区  · 14 年前

    是否可以根据验证规则启用/禁用“选择目录”对话框中的“确定”按钮,例如:

    • 如果突出显示的文件夹名称为“config”,则启用“确定”按钮。
    • 如果突出显示的文件夹包含名为“.project”的文件和名为“.settings”的文件夹,请启用“确定”按钮。

    ?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Rob Kennedy dkackman    14 年前

    如果你使用 ShBrowseForFolder API函数。我想德尔菲有一个 SelectDirectory 包装该函数的版本,尽管包装器可能无法提供足够的访问权限来处理该函数。你需要包括 callback function 对于 lpfn 带有此签名的参数:

    function BrowseCallbackProc(Wnd: HWnd; uMsg: UInt; lParam, lpData: LParam): Integer; stdcall;
    

    当选择更改时,对话框将调用您提供的函数 bffm_SelChanged 作为 uMsg 参数。第三个参数将是表示当前选择的pidl,因此您可能需要调用 ShGetPathFromIDList 以确定字符串名称。您可以通过将消息发送回对话框的窗口句柄来控制“确定”按钮。 Wnd 参数。例如:

    SendMessage(Wnd, bffm_EnableOK, 0, 0); // disable the button
    SendMessage(Wnd, bffm_EnableOK, 0, 1); // enable the button
    

    不要忘记重新启用按钮 好的 为无效选择禁用后的选择。

    如果有效选择的条件是目录应包含具有特定名称的文件,请确保包含 bif_BrowseIncludeFiles 标记以便人们可以查看文件。

        2
  •  5
  •   RRUZ    14 年前

    作为对@rob优秀答案的补充。

    请参见此代码。

    uses  ShlObj;
    
    function BrowseCallbackProc(hwnd: HWND; MessageID: UINT; lParam: LPARAM; lpData: LPARAM): Integer; stdcall;
    var
        DirName:  array[0..MAX_PATH] of Char;
        pIDL   :  pItemIDList;
    begin
      case  MessageID    of
        BFFM_INITIALIZED:SendMessage(hwnd, BFFM_SETSELECTION, 1, lpData);
        BFFM_SELCHANGED :begin
                            pIDL := Pointer(lParam);
                            if  Assigned(PIDL) then
                            begin
                              SHGetPathFromIDList(pIDL, DirName);
                              if DirectoryExists(DirName) then
                               if (ExtractFileName(DirName)='config') then    //you can add more validations here
                                SendMessage(hwnd, BFFM_ENABLEOK, 0, 1) //enable the ok button
                               else
                                SendMessage(hwnd, BFFM_ENABLEOK, 0, 0) //disable the ok button
                              else
                              SendMessage(hwnd, BFFM_ENABLEOK, 0, 0);
                            end
                            else
                              SendMessage(hwnd, BFFM_ENABLEOK, 0, 0);
                         end;
      end;
    
      Result := 0;
    end;
    
    function SelectFolderDialogExt(Handle: Integer; var SelectedFolder: string): Boolean;
    var
      ItemIDList: PItemIDList;
      JtemIDList: PItemIDList;
      DialogInfo: TBrowseInfo;
      Path: PAnsiChar;
    begin
      Result := False;
      Path   := StrAlloc(MAX_PATH);
      SHGetSpecialFolderLocation(Handle, CSIDL_DRIVES, JtemIDList);
      with DialogInfo do
      begin
        pidlRoot      := JtemIDList;
        //ulFlags       := BIF_RETURNONLYFSDIRS;     //only select directories
        hwndOwner     := GetActiveWindow;
        SHGetSpecialFolderLocation(hwndOwner, CSIDL_DRIVES, JtemIDList);
        pszDisplayName := StrAlloc(MAX_PATH);
        lpszTitle       := PChar('Select a folder');
        lpfn            := @BrowseCallbackProc;
        lParam            := LongInt(PChar(SelectedFolder));
      end;
    
      ItemIDList := SHBrowseForFolder(DialogInfo);
    
      if (ItemIDList <> nil) then
        if SHGetPathFromIDList(ItemIDList, Path) then
        begin
          SelectedFolder := Path;
          Result         := True;
        end;
    end;
    

    执行

    if SelectFolderDialogExt(Handle, SelectedDir) then
      ShowMessage(SelectedDir);
    
    推荐文章