Frage

Ich versuche, einen offenen Dialog (in Windows 7) zu schaffen, in dem der Benutzer auf das ursprüngliche Verzeichnis beschränkt ist. Auf dem offenen Dialog ein Niveau Ich habe die optionsEX auf [ofExNoPlacesBar] und dass die entfernt die Bar, die sie wählen Ordner und Verzeichnisse gehen, um schnell lassen würden, aber der Benutzer kann und geben Sie ein anderes Verzeichnis verwenden, um das Brotkrümel-Adresse Werkzeug gehen gesetzt in den Dateinamen Textfeld zu ändern Verzeichnisse.

Danke

War es hilfreich?

Lösung

Wenn Sie mit Delphi 2009+ gibt es eine TFileOpenDialog. Verwenden Sie diese Option, und Satz

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;

Dabei steht

var
  FInitiated: boolean;

(Hinweis, dass es genau ein FInitiated pro TFileOpenDialog sein. Also, wenn FileOpenDialog ein privates Mitglied TForm3 ist, lassen FInitiated ein privates Mitglied TForm3 als gut.)

, um die Benutzerfreundlichkeit zu verbessern, werden Sie wahrscheinlich verwenden

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

oder

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;

Andere Tipps

Verwenden Sie einen anderen offenen Dialog (machen eine Form, sich ohne Ordnernavigation, nur ein Dateilistenfeld) oder einfach Audit für einen Pfad der anfänglichen dir und Müll nicht passend, um tatsächlich die Datei zu öffnen.

Die 'FileOpenDialog' hat eine OnFolderChanging Ereignis des Typs TFileDialogFolderChangingEvent die einen boolean CanChange Parameter. Ich würde erwarten, dass diese Parameter auf false gesetzt würde den Zweck dienen.

Bearbeiten
Beispiel für die Verwendung als pro Remy Kommentare (wenn ich das richtig verstanden);

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;

Die unten auch funktioniert, aber anfälliger für Pfadvariationen (Andreas Kommentare siehe unten);

procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
  var CanChange: Boolean);
begin
  CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
                            TFileOpenDialog(Sender).DefaultFolder);
end;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top