Delphi opendialogユーザーにイタリタル監督からナビゲートすることなく
-
02-10-2019 - |
質問
ユーザーが初期ディレクトリに限定されている[Windows 7で)オープンダイアログ(Windows 7)を作成しようとしています。オープンダイアログでは、OptionSexを[ExnoplacesBar]に設定しました。これにより、フォルダとディレクトリを選択できるようにするバーを削除します。ディレクトリを変更するためのファイル名テキストボックスに。
ありがとうございました
解決
Delphi 2009+を使用している場合、 TFileOpenDialog
. 。これを使用して設定します
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;
どこ
var
FInitiated: boolean;
(正確に1つあるはずであることに注意してください FInitiated
あたり TFileOpenDialog
. 。だから、場合 FileOpenDialog
のプライベートメンバーです TForm3
, 、 させて FInitiated
のプライベートメンバーになります TForm3
同じように。)
ユーザーエクスペリエンスを改善するために、おそらく使用するでしょう
procedure TForm3.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := not FInitiated;
if not CanChange then beep;
end;
また
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;
他のヒント
別のオープンダイアログ(フォルダーナビゲーションなし、ファイルリストボックスのみを持つフォームを作成します)を使用するか、単に初期監督と一致しないパスの監査を行い、実際にファイルを開くことを拒否します。
「filependialog」には OnFolderChanging
タイプのイベント TFileDialogFolderChangingEvent
ブール値があります CanChange
パラメーター。このパラメーターをfalseに設定すると、目的が役立つと思います。
編集:
レミーのコメントによる使用の例(私が正しく理解した場合)。
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;
以下も機能しますが、パスのバリエーションに対してより脆弱です(以下のアンドレアスのコメントを参照)。
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
TFileOpenDialog(Sender).DefaultFolder);
end;