Delphi OpenDialog sin dejar que el usuario navegar lejos de la dir inicial
-
02-10-2019 - |
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
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;