TFileOpenDialog en la aplicación FireMonkey

Estoy usando FireMonkey y quiero que el usuario seleccione un directorio usando la interfaz proporcionada por un TFileOpenDialog (encuentro que la interfaz SelectDirectory está desactualizada en el mejor de los casos, sí, incluso con la opción sdNewUI).

TFileOpenDialog con la opción [fdoPickFolders]

En primer lugar, ¿es una mala práctica incluir la unidad VCL.Dialogs (para usar un TFileOpenDialog) en una aplicación FireMonkey?

En segundo lugar, esto solo es posible con Windows Vista y superior. ¿Es esta la forma correcta de buscar versiones de Windows compatibles?

{IFDEF WIN32 or WIN64}
  if Win32MajorVersion >= 6 then
    // Create TOpenFileDialog with fdoPickFolders option

preguntado el 12 de junio de 12 a las 15:06

Su prueba para Vista up está bien. Personalmente no me molestaría con TFileOpenDialog y use IFileDialog directamente. -

Ummm... ¿Cómo haría esto con la opción fdoPickFolders? ¿No es IFileDialog solo la interfaz para un TOpenDialog/TSaveDialog estándar, o me estoy perdiendo algo? -

NO, IFileDialog es el diálogo de archivo para Vista, en todas sus formas. Todo lo demás es legado. Llamar IFileDialog.SetOptions paso FOS_PICKFOLDERS. -

2 Respuestas

Para referencia futura, use IFileDialog para crear un cuadro de diálogo de carpeta de Windows Vista y superior:

uses
  ShlObj, ActiveX;

...

var
  FolderDialog : IFileDialog;
  hr: HRESULT;
  IResult: IShellItem;
  FileName: PChar;
  Settings: DWORD;
begin
  if Win32MajorVersion >= 6 then
    begin
      hr := CoCreateInstance(CLSID_FileOpenDialog,
                   nil,
                   CLSCTX_INPROC_SERVER,
                   IFileDialog,
                   FolderDialog);

      if hr = S_OK then
        begin
          FolderDialog.GetOptions(Settings);
          FolderDialog.SetOptions(Settings or FOS_PICKFOLDERS);
          FolderDialog.GetOptions(Settings);
          FolderDialog.SetOptions(Settings or FOS_FORCEFILESYSTEM);
          FolderDialog.SetOkButtonLabel(PChar('Select'));
          FolderDialog.SetTitle(PChar('Select a Directory'));

          hr := FolderDialog.Show(Handle);
          if hr = S_OK then
            begin
              hr := FolderDialog.GetResult(IResult);

              if hr = S_OK then
                begin
                  IResult.GetDisplayName(SIGDN_FILESYSPATH,FileName);
                  ConfigPathEdit.Text := FileName;
                end;
            end;
        end;
    end;
end;

Respondido 22 ago 12, 09:08

if SelectDirectory('Select a directory', chosenDirectory, chosenDirectory) then

Respondido 18 Abr '19, 10:04

Si bien este código puede resolver la pregunta, incluyendo una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación, y probablemente resultaría en más votos a favor. Recuerde que está respondiendo la pregunta a los lectores en el futuro, no solo a la persona que pregunta ahora. Por favor editar su respuesta para agregar explicaciones y dar una indicación de las limitaciones y suposiciones que se aplican. - suraj rao

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.