Delphi Opendialog, ohne die Benutzer navigieren weg von dem anfänglich dir zu lassen
-
02-10-2019 - |
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
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;