【发布时间】: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 之外使用。