再加300分,共500分求完满解答:怎样取WORD文件的标题? ( 积分: 200 )

  • 主题发起人 主题发起人 lhc4000
  • 开始时间 开始时间
L

lhc4000

Unregistered / Unconfirmed
GUEST, unregistred user!
在文件夹中,我们把鼠标移到Word类型的文件上时,会提示包括“类型、作者、标题、修改日期、大小”的信息,或者查看该文件属性时,在“摘要”栏也会显示“标题”等内容,<br><br>现在的问题是: 怎样在Delphi中用程序取出文件的“标题”——不是文件名——要求不要通过什么操作(控制)Word来完成,直接用Delphi通过什么API之类的技术实现。<br>烦请知道的大虾、中虾、小虾回答……
 
在文件夹中,我们把鼠标移到Word类型的文件上时,会提示包括“类型、作者、标题、修改日期、大小”的信息,或者查看该文件属性时,在“摘要”栏也会显示“标题”等内容,<br><br>现在的问题是: 怎样在Delphi中用程序取出文件的“标题”——不是文件名——要求不要通过什么操作(控制)Word来完成,直接用Delphi通过什么API之类的技术实现。<br>烦请知道的大虾、中虾、小虾回答……
 
关注!我也想知道这个问题!
 
建议你看看VBA之类的函数,应该可以找到。
 
DELPHI里的OFFICE组件可以读取WORD的这些信息,具体用法可以参看WORD里的VBA帮助!
 
有点头绪,但还没找到准确的方法。请继续出谋献策
 
楼主不是要求只用 API 么,用 VBA 地球人都知道了。
 
heihei,我还不知道所以我是《〈〈〈〈〈〈〈〈〈〈〈〈〈〈
 
或者换个角度:<br>  谁知道用什么命令(API)可以让Windows显示那个提示?知道的话,也许发送一个消息就可以让Windows亲口告诉我们了。
 
我只知道server中的excel可以新建个excel设置caption不知道能不能获取
 
这个应该属于COM的问题吧,应该是实现了某个接口,直接调用就可以的.<br>同样,如果你安装了WinRAR软件,你可以看看RAR文件的属性有个特殊的标签,显示RAR的内容.
 
在Delphi7,Win 2000下编译运行通过.<br>楼主别忘了给分哦 &nbsp;:)<br><br><br>uses<br> &nbsp;Comobj;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>const<br> &nbsp;wdPropertyTitle &nbsp; = $00000001;<br> &nbsp;wdPropertySubject = $00000002;<br> &nbsp;wdPropertyAuthor &nbsp;= $00000003;<br> &nbsp;wdPropertyKeywords = $00000004;<br> &nbsp;wdPropertyComments = $00000005;<br> &nbsp;wdPropertyTemplate = $00000006;<br> &nbsp;wdPropertyLastAuthor = $00000007;<br> &nbsp;wdPropertyRevision = $00000008;<br> &nbsp;wdPropertyAppName = $00000009;<br> &nbsp;wdPropertyTimeLastPrinted = $0000000A;<br> &nbsp;wdPropertyTimeCreated = $0000000B;<br> &nbsp;wdPropertyTimeLastSaved = $0000000C;<br> &nbsp;wdPropertyVBATotalEdit = $0000000D;<br> &nbsp;wdPropertyPages &nbsp; = $0000000E;<br> &nbsp;wdPropertyWords &nbsp; = $0000000F;<br> &nbsp;wdPropertyCharacters = $00000010;<br> &nbsp;wdPropertySecurity = $00000011;<br> &nbsp;wdPropertyCategory = $00000012;<br> &nbsp;wdPropertyFormat &nbsp;= $00000013;<br> &nbsp;wdPropertyManager = $00000014;<br> &nbsp;wdPropertyCompany = $00000015;<br> &nbsp;wdPropertyBytes &nbsp; = $00000016;<br> &nbsp;wdPropertyLines &nbsp; = $00000017;<br> &nbsp;wdPropertyParas &nbsp; = $00000018;<br> &nbsp;wdPropertySlides &nbsp;= $00000019;<br> &nbsp;wdPropertyNotes &nbsp; = $0000001A;<br> &nbsp;wdPropertyHiddenSlides = $0000001B;<br> &nbsp;wdPropertyMMClips = $0000001C;<br> &nbsp;wdPropertyHyperlinkBase = $0000001D;<br> &nbsp;wdPropertyCharsWSpaces = $0000001E;<br>var<br> &nbsp;vWord, vDoc, docBuiltInProps, typeDocBuiltInProps: Variant;<br>begin<br> &nbsp;if not OpenDialog1.Execute then<br> &nbsp; &nbsp;Exit;<br> &nbsp;vWord := CreateOleObject('Word.Application'); //创建Word线程<br> &nbsp;try<br> &nbsp; &nbsp;//打开要操作的文件<br> &nbsp; &nbsp;vDoc := vWord.Documents.Open(OpenDialog1.FileName);<br> &nbsp; &nbsp;docBuiltInProps := vDoc.BuiltInDocumentProperties;<br> &nbsp; &nbsp;memo1.Lines.Add(format('%s : %s', ['页数',<br> &nbsp; &nbsp; &nbsp;vDoc.BuiltInDocumentProperties[wdPropertyPages].Value]));<br> &nbsp; &nbsp;memo1.Lines.Add(format('%s : %s', ['作者',<br> &nbsp; &nbsp; &nbsp;vDoc.BuiltInDocumentProperties[wdPropertyAuthor].Value]));<br> &nbsp; &nbsp;memo1.Lines.Add(format('%s : %s', ['标题',<br> &nbsp; &nbsp; &nbsp;vDoc.BuiltInDocumentProperties[wdPropertyTitle].Value]));<br> &nbsp;finally<br> &nbsp; &nbsp;vDoc.Close(True); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //关闭文并保存<br> &nbsp; &nbsp;vWord.Quit(False); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//退出Word<br> &nbsp;end;<br>end;
 
楼上的,可以通过,谢谢啊!好代码!<br><br>好象速度有些慢啊![?][?]
 
速度應該是比較慢,因為把word文件給打開了.有沒有不用打開就可以查詢到這些信息的代碼啊.
 
wr960204:<br> &nbsp; 非常感谢你的参与!不过,也非常sorry, 不能给你加分,因为你调用了Word,不符合我的要求。<br><br>yayongm:<br> &nbsp; 可否再继续明示?
 
实现两个接口IQueryInfo,IPersistFile<br>IQueryInfo中的函数<br>function GetInfoTip(dwFlags: DWORD;var ppwszToip: PWideChar): HResult;stdcall; &nbsp;//重要的函数<br>function GetInfoFlags(out pdwFlags: DWORD): HResult;stdcall;<br>function IsDirty: HResult;stdcall;<br><br>IPersistFile接口的函数<br>function Load(pszFileName: POleStr;dwMode: LongInt): HResult;stdcall; &nbsp;//重要的函数<br>function Save(pszFileName: POleStr;fRemember: Bool): HResult;stdcall;<br>function SaveCompleted(pszFileName: POleStr): HResult;stdcall;<br>function GetCurFile(out pszFileName: POleStr): HResult;stdcall;<br>function GetClassID(out ClassID: TCLSID): HResult;stdcall;<br><br><br>这是windows外壳扩展,只能使用com。<br>如果不想通过Shell,就必须打开文件,手工分析文件信息
 
//费了半天劲,研究出这些。。用脚本对象实现的,参考了FOLDER.HTT和别人的相关代码.by YP<br><br>uses ShlObj, ComObj;<br><br>{$R *.dfm}<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;ObjShell, objFolder, objFolderItem: OLEVariant;<br> &nbsp;i: Integer;<br> &nbsp;s1, s2: string;<br>begin<br> &nbsp;ListBox1.Clear;<br> &nbsp;objShell := CreateOLEObject('Shell.Application');<br> &nbsp;objFolder := objShell.NameSpace('d:/');<br> &nbsp;objFolderItem := objFolder.ParseName('郑州新能源照明科技软件功能说明书.doc');<br><br> &nbsp;for i := 0 to 100 do //这个数值未经考证,微软网站的事例好像随便写了个34,我看不够用,就自作主张了。<br> &nbsp;begin<br> &nbsp; &nbsp;ListBox1.Items.Add(objFolder.GetDetailsOf(0, i) + ': ' + objFolder.GetDetailsOf(objFolderItem, i));<br> &nbsp; &nbsp;if objFolder.GetDetailsOf(0, i) = '标题' then //底下的随便啦 ,嫌空行多的话,填充listbox时就过滤掉就行<br> &nbsp; &nbsp; &nbsp;ShowMessage(objFolder.GetDetailsOf(objFolderItem, i));<br> &nbsp;end;<br>end;<br>你的需求,你自己改吧。<br>//要是还不满意,可以考虑以下几个接口<br> &nbsp;: IShellFolder;<br> &nbsp;: IShellDetails;<br>其实核心是一样的,只是调用接口不同,但绝没有创建word'对象,资源管理器就是这样读取的。呵呵。<br><br>没事的话,我去领分啊,在哪里啊???分呢??
 
如果要查MSDN的话,直接找GetDetailsOf函数就好了,这个是核心,无论什么脚本对象,FSO对象,SHELL接口,其实都是调用的它。<br>微软的相关例子:http://www.microsoft.com/china/technet/community/scriptcenter/filefolder/scrff64.mspx
 
shangshang的方法非常合我意,非常好用,在没装Word的系统上也准确无误!<br>高手,高手!佩服,佩服! <br><br>其余的分请到领取 http://www.delphibbs.com/delphibbs/dispq.asp?lid=3143505
 
接受答案了.
 
后退
顶部