Domanda

Sto cercando di creare un dialogo aperto (in Windows 7) in cui l'utente si limita alla directory iniziale. Nella finestra di dialogo aperta Ho impostato l'optionsEX a [ofExNoPlacesBar] e che rimuove la barra che avrebbe permesso loro di selezionare le cartelle e directory per andare rapidamente, ma l'utente può utilizzare lo strumento pane indirizzo briciola per salire di un livello e digitare una directory diversa nella casella di testo il nome del file alle directory di modifica.

Grazie

È stato utile?

Soluzione

Se si utilizza Delphi 2009+, c'è un TFileOpenDialog. Utilizzare questo, e insieme

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;

dove

var
  FInitiated: boolean;

(Si noti che non ci dovrebbe essere esattamente un FInitiated per TFileOpenDialog. Quindi, se FileOpenDialog è un membro privato di TForm3, lascia FInitiated essere un membro privato di TForm3 pure.)

Per migliorare l'esperienza degli utenti, probabilmente userai

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;

Altri suggerimenti

Usa un dialogo aperto diverso (fare un modulo da soli senza navigazione dei documenti, solo una casella di riepilogo di file), o semplicemente di controllo per un percorso che non corrisponde la directory iniziale e rifiuti effettivamente aprire il file.

Il 'FileOpenDialog' ha un OnFolderChanging evento di tipo TFileDialogFolderChangingEvent che hanno un parametro CanChange booleano. Mi aspetto l'impostazione di questo parametro su false servirebbe allo scopo.

modifica utilizzo
Esempio secondo i commenti di Remy (se ho capito bene);

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;

Il sotto anche funziona, ma più vulnerabile alle variazioni di percorso (vedi commenti Andreas' in basso);

procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
                            TFileOpenDialog(Sender).DefaultFolder);
end;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top