Delphi 如何在TCustomFileDialog中获取当前选择?

Delphi 如何在TCustomFileDialog中获取当前选择?,delphi,Delphi,我有一个TFileOpenDialog,其中连接了一个OnSelectionChange事件,试图根据所选内容采取某些操作。每次更改shell视图框中的选定项时,它都会激发,但FileName属性似乎总是包含最近选定的文件的名称 如果选择文件夹,文件名属性不会更新。我理解这是因为文件夹不是文件 显然,FileName是错误的。很明显,里面有些东西知道当前实际选择了什么。我该怎么做呢?我设法弄明白了 var item: IShellItem; filename: PChar; begin

我有一个
TFileOpenDialog
,其中连接了一个
OnSelectionChange
事件,试图根据所选内容采取某些操作。每次更改shell视图框中的选定项时,它都会激发,但
FileName
属性似乎总是包含最近选定的文件的名称

如果选择文件夹
文件名
属性不会更新。我理解这是因为文件夹不是文件


显然,
FileName
是错误的。很明显,里面有些东西知道当前实际选择了什么。我该怎么做呢?

我设法弄明白了

var
  item: IShellItem;
  filename: PChar;
begin
  DialogBox.Dialog.GetCurrentSelection(item);
  if item = nil then
  begin
    //nothing is selected; handle appropriately
  end
  else begin
    item.GetDisplayName(SIGDN_FILESYSPATH, filename);
    //handle appropriately
  end;
end;

我设法弄明白了

var
  item: IShellItem;
  filename: PChar;
begin
  DialogBox.Dialog.GetCurrentSelection(item);
  if item = nil then
  begin
    //nothing is selected; handle appropriately
  end
  else begin
    item.GetDisplayName(SIGDN_FILESYSPATH, filename);
    //handle appropriately
  end;
end;

我设法弄明白了

var
  item: IShellItem;
  filename: PChar;
begin
  DialogBox.Dialog.GetCurrentSelection(item);
  if item = nil then
  begin
    //nothing is selected; handle appropriately
  end
  else begin
    item.GetDisplayName(SIGDN_FILESYSPATH, filename);
    //handle appropriately
  end;
end;

我设法弄明白了

var
  item: IShellItem;
  filename: PChar;
begin
  DialogBox.Dialog.GetCurrentSelection(item);
  if item = nil then
  begin
    //nothing is selected; handle appropriately
  end
  else begin
    item.GetDisplayName(SIGDN_FILESYSPATH, filename);
    //handle appropriately
  end;
end;
procedure TMyForm.DialogBoxSelectionChange(发送方:ToObject);
变量
HRes:HRESULT;
Attr:DWORD;
开始
如果DialogBox.ShellItem为零,则
开始
HRes:=DialogBox.ShellItem.GetAttributes(SFGAO\u文件系统或SFGAO\u文件夹,Attr);
如果成功(HRes),则
开始
如果(Attr和SFGAO_文件夹)=0,则
开始
//必须是文件,根据需要显示信息
出口
结束;
结束;
结束;
//根据需要清除信息。。。
结束;
程序TMyForm.DialogBoxSelectionChange(发送方:ToObject);
变量
HRes:HRESULT;
Attr:DWORD;
开始
如果DialogBox.ShellItem为零,则
开始
HRes:=DialogBox.ShellItem.GetAttributes(SFGAO\u文件系统或SFGAO\u文件夹,Attr);
如果成功(HRes),则
开始
如果(Attr和SFGAO_文件夹)=0,则
开始
//必须是文件,根据需要显示信息
出口
结束;
结束;
结束;
//根据需要清除信息。。。
结束;
程序TMyForm.DialogBoxSelectionChange(发送方:ToObject);
变量
HRes:HRESULT;
Attr:DWORD;
开始
如果DialogBox.ShellItem为零,则
开始
HRes:=DialogBox.ShellItem.GetAttributes(SFGAO\u文件系统或SFGAO\u文件夹,Attr);
如果成功(HRes),则
开始
如果(Attr和SFGAO_文件夹)=0,则
开始
//必须是文件,根据需要显示信息
出口
结束;
结束;
结束;
//根据需要清除信息。。。
结束;
程序TMyForm.DialogBoxSelectionChange(发送方:ToObject);
变量
HRes:HRESULT;
Attr:DWORD;
开始
如果DialogBox.ShellItem为零,则
开始
HRes:=DialogBox.ShellItem.GetAttributes(SFGAO\u文件系统或SFGAO\u文件夹,Attr);
如果成功(HRes),则
开始
如果(Attr和SFGAO_文件夹)=0,则
开始
//必须是文件,根据需要显示信息
出口
结束;
结束;
结束;
//根据需要清除信息。。。
结束;


每当选择因任何原因发生更改时,
文件名
属性将使用当前选定的文件进行更新。那么,实际问题是什么?请提供一个例子。@RemyLebeau:正如我在问题中所写的,实际的问题是它是用当前选定的文件更新的,但是如果您选择了一个文件夹,则
FileName
属性不会更新。这与我正在做的工作有关。我可以重新考虑这个问题。但我认为它的行为符合设计要求。
TFileOpenDialog
用于打开文件(名称为hense),因此它当然不会报告选定的文件夹。为什么你会期望它呢?如果要选择文件夹,则必须改用
SelectDirectory()
(或直接使用
SHBrowseForFolder()
)。在
OnSelectionChange
事件中,可以使用查找当前选择的项目类型。请记住,
TFileOpenDialog
可以显示的不仅仅是文件系统项,
IShellItem
可以表示非文件系统项,但是
FileName
属性只支持文件系统项。
FileName
属性会在选择因任何原因发生更改时使用当前选定的文件进行更新。那么,实际问题是什么?请提供一个例子。@RemyLebeau:正如我在问题中所写的,实际的问题是它是用当前选定的文件更新的,但是如果您选择了一个文件夹,则
FileName
属性不会更新。这与我正在做的工作有关。我可以重新考虑这个问题。但我认为它的行为符合设计要求。
TFileOpenDialog
用于打开文件(名称为hense),因此它当然不会报告选定的文件夹。为什么你会期望它呢?如果要选择文件夹,则必须改用
SelectDirectory()
(或直接使用
SHBrowseForFolder()
)。在
OnSelectionChange
事件中,可以使用查找当前选择的项目类型。请记住,
TFileOpenDialog
可以显示的不仅仅是文件系统项,
IShellItem
可以表示非文件系统项,但是
FileName
属性只支持文件系统项。
FileName
属性会在选择因任何原因发生更改时使用当前选定的文件进行更新。那么,实际问题是什么?请提供一个例子。@RemyLebeau:正如我在问题中所写的,实际的问题是它是用当前选定的文件更新的,但是如果您选择了一个文件夹,则
FileName
属性不会更新。这与我正在做的工作有关。我可以重新考虑这个问题。但我认为它的行为符合设计要求。
TFileOpenDialog
用于打开文件(名称为hense),因此它当然不会报告选定的文件夹。为什么你会期望它呢?如果要选择文件夹,则必须改用
SelectDirectory()
(或直接使用
SHBrowseForFolder()
)。在
OnSelectionChange
事件中,可以使用查找当前选择的项目类型。请记住,
TFileOpenDialog
可以显示的不仅仅是文件系统项,
IShellItem
可以表示非文件系统项,但是
FileName
属性仅支持