Pregunta

Estoy intentando crear un diálogo abierto (en Windows 7) donde el usuario se limita al directorio inicial. En el diálogo abierto yo he dado la optionsEX a [ofExNoPlacesBar] y que elimina la barra que les permitiría seleccionar carpetas y directorios para ir a rápidamente, pero el usuario puede utilizar la herramienta de pan dirección de miga para subir un nivel y escriba un directorio diferente en el cuadro de texto de nombre de archivo a los directorios de cambio.

Gracias

¿Fue útil?

Solución

Si está utilizando Delphi 2009+, hay una TFileOpenDialog. Utilice esta, y un conjunto

procedure TForm3.FileOpenDialog1FolderChange(Sender: TObject);
begin
  FInitiated := true;
end;

procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := not FInitiated;
end;

procedure TForm3.btnOpenClick(Sender: TObject);
begin
  FInitiated := false;
  FileOpenDialog1.DefaultFolder := 'C:\MyFolder\';
  FileOpenDialog1.Execute;
end;

donde

var
  FInitiated: boolean;

(Tenga en cuenta que no debe haber exactamente un FInitiated por TFileOpenDialog. Por lo tanto, si FileOpenDialog es un miembro privado de TForm3, deja FInitiated ser un miembro privado de TForm3 también.)

Para mejorar la experiencia del usuario, es probable que use

procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := not FInitiated;
  if not CanChange then beep;
end;

o

procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := not FInitiated;
  if not CanChange then
    MessageBox(Handle, PChar('Directory selection is not allowed.'), PChar(Caption), MB_ICONINFORMATION);
end;

Otros consejos

Utilice un diálogo abierto diferente (hacer una forma a sí mismo sin la navegación por carpetas, solamente un cuadro de lista de archivos), o simplemente de auditoría para un camino que no coincida con el directorio inicial y se niegan a abrir realmente el archivo.

El 'FileOpenDialog' tiene un OnFolderChanging evento de tipo TFileDialogFolderChangingEvent que tienen un parámetro CanChange booleano. Yo esperaría que el establecimiento de este parámetro en false serviría a los fines.

editar uso
Ejemplo como por los comentarios de Remy (si he entendido correctamente);

procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
var
  Dlg: TFileOpenDialog;
  DefFolder: IShellItem;
  iOrder: Integer;
begin
  CanChange := False;
  Dlg := Sender as TFileOpenDialog;
  if Succeeded(SHCreateItemFromParsingName(PWideChar(WideString(Dlg.DefaultFolder)), nil, IShellItem, DefFolder)) then
  try
    CanChange := Dlg.ShellItem.Compare(DefFolder, SICHINT_ALLFIELDS, iOrder) = S_OK;
  finally
    DefFolder := nil;
  end;
end;

La continuación también funciona, pero más vulnerable a las variaciones de trayectoria (ver los comentarios de Andreas abajo);

procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
                            TFileOpenDialog(Sender).DefaultFolder);
end;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top