ユーザーが初期ディレクトリに限定されている(Windows 7で)開いているダイアログを作成しようとしています。開いたダイアログで、optionsEXを[ofExNoPlacesBar]に設定しました。これにより、すばやく移動するフォルダーとディレクトリを選択できるバーが削除されますが、ユーザーはブレッドクラムアドレスツールを使用してレベルを上げ、別のディレクトリを入力できます。ディレクトリを変更するには、[ファイル名]テキストボックスに入力します。
ありがとうございました
ユーザーが初期ディレクトリに限定されている(Windows 7で)開いているダイアログを作成しようとしています。開いたダイアログで、optionsEXを[ofExNoPlacesBar]に設定しました。これにより、すばやく移動するフォルダーとディレクトリを選択できるバーが削除されますが、ユーザーはブレッドクラムアドレスツールを使用してレベルを上げ、別のディレクトリを入力できます。ディレクトリを変更するには、[ファイル名]テキストボックスに入力します。
ありがとうございました
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;
( 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;
別の開くダイアログを使用する (フォルダー ナビゲーションなしでファイル リスト ボックスのみのフォームを自分で作成する) か、最初のディレクトリと一致しないパスを単に監査し、実際にファイルを開くことを拒否します。
「FileOpenDialog」には、ブール型パラメーターを持つOnFolderChanging
タイプのイベントがあります。このパラメーターを false に設定すると、目的が果たされると思います。TFileDialogFolderChangingEvent
CanChange
編集:
レミーのコメントによる使用例(私が正しく理解した場合);
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;
以下も機能しますが、パスのバリエーションに対してより脆弱です (以下の Andreas のコメントを参照してください)。
procedure TForm1.FileOpenDialog1FolderChanging(Sender: TObject;
var CanChange: Boolean);
begin
CanChange := SameFileName(TFileOpenDialog(Sender).FileName,
TFileOpenDialog(Sender).DefaultFolder);
end;