0

FileCtrl.SelectDirectory を使用して、「フォルダーを開く」ダイアログを表示します。ただし、ユーザーがブラウジングを開始するパスを入力できないため、不満です。たとえば、ユーザーがクリップボードに既にパスを持っている場合、そこに到達するまで多くのフォルダーをナビゲート (開く) ために 12 秒を無駄にする代わりに、それをダイアログに入力できるはずです。

FileCtrl.SelectDirectory が行うこととまったく同じように見えるこのコードを見つけました。ダイアログをさらに構成できるようになると思いました。そうではありません。

では、ユーザーがパスを入力できる SelectDirectory に編集ボックスを表示するにはどうすればよいでしょうか?

私が今持っている解決策は、私自身のダイアログボックスです。TDirectory と TListBox を使用してゼロから構築されます。とても便利な。しかし、Embarcadero のファイル管理コントロール (TDirectory、TListBox) を使用しているため、非常に時代遅れに見えます。


明確にするために: FileCtrl.SelectDirectory のようなものが欲しいのですが、ユーザーがパスを入力できる extact TEdit またはクラムバー (ある場合) が必要です。例:ここに画像の説明を入力

4

5 に答える 5

2

パラメータSelectDirectory()を持つのオーバーロードされたバージョンを使用すると、内部的に呼び出されます (他のオーバーロードでは代わりにカスタム VCL Win3.1 スタイルのダイアログが表示されます)。パラメータに渡す変数に初期値を割り当てると、初期選択フォルダとして渡されます。パラメータでフラグを指定することもできます。ただし、編集ボックスは完全なパスを入力するためのものではありません。ただし、直接呼び出す場合は、独自のコールバック関数を提供できるため、たとえば、ダイアログがイベントを送信したときに、ダイアログの編集ボックスからテキストを取得し、ダイアログ ウィンドウにメッセージを送信して正しい場所に移動できます。道。RootSHBrowseForFolder()DirectorySHBrowseForFolder()sdShowEditOptionsSHBrowseForFolder()BFFM_VALIDATEFAILEDBFFM_SETSELECTION

あなたが本当に求めているのは、IFileDialog代わりに Vista+ ダイアログによって提供されるカスタマイズです。このIFileDialogCustomizeインターフェイスを使用して、編集ボックスやボタンなどのカスタム コントロールをダイアログに追加し、IFileDialogControlEventsインターフェイスを実装して、ボタンのクリックなど、それらのコントロールでさまざまなアクションがいつ発生するかを知ることができます。これを使用して、カスタム編集ボックスまたはクリップボードで有効なパスを確認し、検出された場合は、IFileDialog.SetFolder()メソッドを介してそのパスに移動するようにダイアログに指示できます。

于 2013-10-21T18:26:38.287 に答える
1

Jedi VCS の TJvDirectoryEdit がそれを行います。調べる。

ここにいくつかの写真があります:

ここに画像の説明を入力

ここに画像の説明を入力

于 2013-10-21T19:40:08.343 に答える
0

私が正しく理解していれば、これがあなたの解決策になると思います。

 procedure TForm1.Button1Click(Sender: TObject);
 var
  opendialog : Topendialog;
 begin
   openDialog := TOpenDialog.Create(self);
   openDialog.InitialDir := GetCurrentDir; {This can also be what is on the clipboard}
   openDialog.Options := [ofFileMustExist];
   openDialog.Filter := 'Text Document |*.txt'; {This is the type of file the user must open}
   openDialog.FilterIndex := 1;
   opendialog.execute;
end;

このコードは、単純な開くダイアログを作成して表示します。ユーザーが選択したパスは次のとおりです。

opendialog.filename
于 2013-10-21T18:46:33.257 に答える
0

@daveaの答えは大丈夫ですが、古い(WinXP)ダイアログスタイルしか表示されません。

だから、これは私が今使っているコードです。Win Vista 以降では新しいスタイルのダイアログが表示され、Win XP では古いスタイルが表示されます。

{$WARN SYMBOL_PLATFORM OFF}
{$IFDEF MSWindows}

function SelectAFolder(VAR Folder: string; CONST Options: TFileDialogOptions= [fdoPickFolders, fdoForceFileSystem, fdoPathMustExist, fdoDefaultNoMiniMode]): Boolean;   { Keywords: FolderDialog, BrowseForFolder}    { Works with UNC paths }
VAR Dlg: TFileOpenDialog;
begin
 { Win Vista and up }
 if OS_IsWindowsVistaUp then
  begin
   Dlg:= TFileOpenDialog.Create(NIL);   { Class for Vista and newer Windows operating systems style file open dialogs }
    TRY
      Dlg.Options       := Options;         
      Dlg.DefaultFolder := Folder;
      Dlg.FileName      := Folder;
      Result            := Dlg.Execute;
      if Result
      then Folder:= Dlg.FileName;
    FINALLY
      FreeAndNil(Dlg);
    END;
  end
 else
   { Win XP or down }
   Result:= vcl.FileCtrl.SelectDirectory('', ExtractFileDrive(Folder), Folder, [sdNewUI, sdShowEdit, sdNewFolder], nil);

 if Result
 then Folder:= Trail(Folder);
end;
{$ENDIF}
{$WARN SYMBOL_PLATFORM On}

{ Keywords: FolderDialog, BrowseForFolder}
于 2016-09-16T10:04:25.300 に答える