Delphi 如何在TFileDialog.OnTypeChange事件中获取piFileType

Delphi 如何在TFileDialog.OnTypeChange事件中获取piFileType,delphi,delphi-2010,Delphi,Delphi 2010,如何在FileDialog OnTypeChange事件中获取FileDialog的FileTypeIndex function TFileDialogEvent.OnTypeChange(const pfd: IFileDialog): HResult; stdcall; var iCaption: string; iFilename: PWideChar; begin {Get the current filename} pfd.GetFileName(iFilename

如何在FileDialog OnTypeChange事件中获取FileDialog的FileTypeIndex

function TFileDialogEvent.OnTypeChange(const pfd: IFileDialog):
  HResult; stdcall;
var
  iCaption: string;
  iFilename: PWideChar;
begin
  {Get the current filename}
  pfd.GetFileName(iFilename);
  {Get the classname of the dialog to set the caption}
    if FClassName = 'TIEWin7FileOpenDialog' then
      iCaption := 'Open- ' + iFilename
    else
      iCaption := 'Save As- ' + iFilename;
    pfd.SetTitle(PWideChar(iCaption));
    FileTypeIndex := pfd.GetFileTypeIndex(???);
end;
要添加的文档包含答案。该方法的C++签名是:

HRESULT GetFileTypeIndex(
  [out]  UINT *piFileType
);
这可以翻译为德尔福:

function GetFileTypeIndex(out FileType: UINT): HRESULT;
也就是说,
ShlObj
中的Delphi翻译将参数声明为
var
,这在语义上是不正确的。碰巧这并不重要

把它们放在一起,您的代码应该如下所示:

OleCheck(pfd.GetFileTypeIndex(FileTypeIndex));
注意,我添加了一些错误检查。你也应该。问题中的代码调用三种不同的COM方法,并且在每种情况下都无法检查错误。

文档中包含答案。该方法的C++签名是:

HRESULT GetFileTypeIndex(
  [out]  UINT *piFileType
);
这可以翻译为德尔福:

function GetFileTypeIndex(out FileType: UINT): HRESULT;
也就是说,
ShlObj
中的Delphi翻译将参数声明为
var
,这在语义上是不正确的。碰巧这并不重要

把它们放在一起,您的代码应该如下所示:

OleCheck(pfd.GetFileTypeIndex(FileTypeIndex));

注意,我添加了一些错误检查。你也应该。您问题中的代码调用了三种不同的COM方法,在每种情况下都无法检查错误。

您可以使用该属性。

您可以使用该属性。

var FileTypeIndex:UINT;如果成功,则开始(pfd.GetFileTypeIndex(FileTypeIndex)),然后{完成}结束。这在MSDN文档中应该很清楚。仍然需要第二个问题的答案。。。我为此提出了一个新问题。@Bill我从这里删除了第二个问题,因为你在另一个问题中提出了这个问题。@Bill-什么是TFileDialog?
var FileTypeIndex:UINT;如果成功,则开始(pfd.GetFileTypeIndex(FileTypeIndex)),然后{完成}结束。这在MSDN文档中应该很清楚。仍然需要第二个问题的答案。。。我为此提出了一个新问题。@Bill我从这里删除了第二个问题,因为你在另一个问题中提出了这个问题。@Bill-什么是TFileDialog?