Delphi 7-selectdirectory无法编译

问题描述 投票:0回答:1

我正在尝试使用FileCtrl.SelectDirectory()的重载版本:

function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string; Options: TSelectDirExtOpts = [sdNewUI]; Parent: TWinControl = nil): Boolean; overload;

我想包含sdNewUI选项,但无法编译我的代码:

procedure TRecDataForm.DirButtonClick(Sender: TObject);
var
  sdNew: TSelectDirExtOpt;
begin
  chosenDirectory := 'C:\';
  if selectdirectory(chosenDirectory, [sdNewUI], 0) then
    DirLabel.Caption := chosenDirectory;
end;

那里有工作代码吗?

delphi-7
1个回答
1
投票
您的代码正在调用SelectDirectory()的第一个重载版本:

function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean;

但是它试图在sdNewUI参数中传递Options标志。该标志对于TSelectDirOpts无效,这就是为什么代码无法编译的原因。它仅对TSelectDirExtOpts有效,SelectDirectory()的第二个重载版本使用它:

function SelectDirectory(const Caption: string; const Root: WideString; var Directory: string; Options: TSelectDirExtOpts = [sdNewUI]; Parent: TWinControl = nil): Boolean; overload;

您的代码应改为这样:

procedure TRecDataForm.DirButtonClick(Sender: TObject); var chosenDirectory: string; begin chosenDirectory := 'C:\'; if SelectDirectory('Select a Directory', '', chosenDirectory, [sdNewUI], Self) then DirLabel.Caption := chosenDirectory; end;

UPDATE:原来在Delphi 2005中引入了TSelectDirExtOpts,这意味着您不能在Delphi 7中使用sdNewUI标志。因此,您将不得不省略添加的2个新参数。 SelectDirectory()的重载(在Delphi 7中确实存在):

procedure TRecDataForm.DirButtonClick(Sender: TObject); var chosenDirectory: string; begin chosenDirectory := 'C:\'; if SelectDirectory('Select a Directory', '', chosenDirectory) then DirLabel.Caption := chosenDirectory; end;
否则,您将必须使用:

  • TBrowseForFolder
      直接使用Win32 uses ..., StdActns; procedure TRecDataForm.DirButtonClick(Sender: TObject); var dlg: TBrowseForFolder; begin dlg := TBrowseForFolder.Create(nil); try dlg.RootDir := 'C:\'; if dlg.Execute then DirLabel.Caption := dlg.Folder; finally dlg.Free; end; end; 函数:
  • SHBrowseForFolder()
  • © www.soinside.com 2019 - 2024. All rights reserved.