【问题标题】:Retrieving Extended File Properties via delphi通过 delphi 检索扩展文件属性
【发布时间】:2014-06-09 23:01:02
【问题描述】:

当您在 Windows 资源管理器中右键单击文件并从菜单中选择“属性”时,会出现一个对话框,显示该文件的基本属性。

我正在尝试获取文件夹中 word 文件的这些属性(关键字、cmets、标题...)。

我修改了我在某处找到的代码,它在 vba(MSWord office 宏)中运行良好:

Private Sub CommandButton1_Click()

Dim arrHeaders(35)

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("C:\Scripts")

For i = 0 To 34
  arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
Next

For Each FileName In objFolder.Items
  For i = 0 To 34
    MsgBox i & vbTab & arrHeaders(i) & ": " & objFolder.GetDetailsOf(FileName, i)
  Next
Next

End Sub

所以我试图让它在 delphi 的 object pascal 中工作。我仍然缺少一些语法。

我能够转换一半的语法:

procedure TFormAFDetails.Button1Click(Sender: TObject);
var
  ObjShell, ObjFolder : Variant;
  FileProp : array of string;
  FName : String;
  I, J : Integer;
begin
    SetLength(FileProp, 35);
    ObjShell := CreateOleObject('Shell.Application');
    ObjFolder := ObjShell.NameSpace('C:\Scripts');

    for I := 0 to 34 do
      FileProp[I] := ObjFolder.GetDetailsOf(ObjFolder.Items,I);

    for FName in ObjFolder.Items do
    begin
      for J := 0 to 34 do
        ShowMessage(FileProp[J]+' : '+ObjFolder.GetDetailsOf(FName,J));
    end;
end;

“for - in - do”部分不会像它说的那样起作用

//for -in statement can't operate on collection type 'variant' 

谁能帮帮我?

【问题讨论】:

  • 我不确定你真的想翻译这段代码。为什么要硬编码幻数 35?为什么要使用Shell.Application 来枚举文件?
  • @DavidHeffernan,我知道如何使用 Word.application 获取这些详细信息。但在这种情况下,我必须打开一个 word 文件,然后传递代码WordApp.ActiveDocument.BuiltInDocumentProperties[1].Value;,但我不想打开 word 文件只是为了获取这些信息。所以我找到了 Shell.Application 方法。为什么是幻数 35,因为这里提到了 35 个文件属性link
  • 嗯,这不是唯一的方法。
  • @DavidHeffernan,我愿意接受建议......
  • FWIW,还有其他文章提到文件属性编号最多为 40。我认为这取决于所使用的操作系统。 W2k 可能只有 35 个。网络上有很多示例可以了解如何使用 GetDetailsOf(),也可以在 Word 之外使用。

标签: vba delphi word-2010


【解决方案1】:

您提出的问题的答案是:

for I := 0 to ObjFolder.Items.Count-1 do
begin
  FName := ObjFolder.Items.Item(I);
  ....
end;    

虽然代码看起来有点奇怪,尤其是使用魔法值 35。

【讨论】:

  • 我同意 35 看起来很奇怪,但这就是他们在 linkthanx 上所说的很多,我认为它有效...让我运行一些测试..for J := 0 to 34 do ShowMessage(IntToStr(J)+' '+FileProp[J]+' : '+ ObjFolder.GetDetailsOf(ObjFolder.Items.Item(I),J)); thanx
  • 它工作完美!谢谢你的专业知识:)
猜你喜欢
  • 2015-03-13
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多