![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Word и тип документа
BerkeleyMan © (2005-09-21 12:45:00)Когда я открываю какой-нибудь документ в MS Word, то через Файл - Свойства вижу его тип.
Порылся в Microsoft Office Word 2003 Visual Basic Reference и не смог найти такое свойство у Document Object.
Где оно прячется?
Спасибо заранее.
k2 (2005-09-27 05:29:00) [1]не уверена,то што ворд отображает на своей вкладке свойств обязательно должно быть доступно и пользователям в виде свойства, возможно это комбинация, поисследуйте:
ActiveDocument.SaveFormat
WordApplication.FileConverters
BerkeleyMan (2005-09-26 12:08:00) [2]Нет, все-таки опять не то, мисс.
Для вордовских файлов это хорошо, но не DOC-ом единым жив юзер.
Представьте себе MS Works-документ (без расширения), который прекрасно открывается Вордом через офисные конвертеры.
Ворд для него проставляет Тип.
Поэтому здесь хранилища не подойдут, здесь нужна OLE-автоматизация и только она!
Но вот вопрос: в каком свойстве искать этот тип? Должен же он куда-то прописываться...
k2 (2005-09-26 11:10:00) [3]Переименовала, сделала
Memo1.Lines.Add(GetDocType('d:\examples\doc1'));
без открытия получила "Документ Microsoft Office Word"
чем не устраивает? :)
BerkeleyMan (2005-09-26 10:48:00) [4]Нет, этот тип проставляется на основе расширения файла.
А вот, допустим, я переименую вордовский файл в файл без расширения и открою его в Ворде. Тот без труда распознает его, откроет как положено и выведет в поле Тип: Microsoft Word 97-2003 Документ
k2 (2005-09-26 05:44:00) [5]а вы про этот тип :) если чесно немножко не понимаю зачем он нужен изнутри ворда, снаружи его можно посмотреть так:
function GetDocType(FileName: TFileName): String;
const
FMTID_SummaryInformation: TGUID = '{F29F85E0-4FF9-1068-AB91-08002B27B3D9}';
var
Storage: IStorage;
ole_type: PWideChar;
cf: Word;
begin
OleCheck(StgOpenStorage(StringToOleStr(FileName), nil, STGM_DIRECT or STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, Storage));
if Succeeded(ReadFmtUserTypeStg(Storage, cf, ole_type)) then
Result := ole_type
else
Result := '';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines.Add(GetDocType('d:\examples\doc1.doc'));
end;
если интересно вообще о всех свойствах в качестве примера можно поискать по "dsofile" на майкрософте, и либо использовать готовую библиотеку либо реализовать свое по примеру
ещё один вариант: читать свойство из реестра
BerkeleyMan (2005-09-23 18:20:00) [6]Теперь он выводит следующее:
1. Title =
2. Subject =
3. Author = Kit and Jeff
4. Keywords =
5. Comments =
6. Template = Normal
7. Last author = Kit and Jeff
8. Revision number = 1
9. Application name = Microsoft Office Word
10. Unspecified error
11. Creation date = 7/8/2005 10:08:00 AM
12. Last save time = 7/8/2005 10:11:00 AM
13. Total editing time = 3
14. Number of pages = 2
15. Number of words = 63
16. Number of characters = 240
17. Security = 0
18. Category =
19. Format =
20. Manager =
21. Company =
22. Number of bytes = 53760
23. Number of lines = 19
24. Number of paragraphs = 5
25. Unspecified error
26. Unspecified error
27. Unspecified error
28. Unspecified error
29. Hyperlink base =
30. Number of characters (with spaces) = 301
Но где же тип документа?
k2 (2005-09-23 04:56:00) [7]>BerkeleyMan (23.09.05 00:50) [9]
неправда ваша :) только свойств, которым не присвоено, либо для них не сформировано значение
uses ..., Word9_TLB, ComObj;
...
procedure TForm1.Button1Click(Sender: TObject);
var
WApp: WordApplication;
built_props, item: OleVariant;// IDispatch;
i: WdBuiltInProperty; // или integer
str: string;
begin
WApp := GetActiveOleObject('Word.Application')as WordApplication;
built_props := WApp.ActiveDocument.BuiltInDocumentProperties;
for i := 1 to built_props.count do begin
item := built_props.item[i];
str := IntToStr(i) + '. ' + VarToStr(item.name)+' = ';
try
str := str + VarToStr(item.value);
except
//todo: гасим исключение втихушку, если нужно обрабатывать
//отсутствие значения свойства, то добавить сюда
end;
Memo1.Lines.Add(str);
end;
end;
BerkeleyMan (2005-09-23 00:50:00) [8]Он выдает "Member not found" на все тридцать айтемов (BuiltInDocumentProperties.Count = 30)
YurikGL (2005-09-22 23:00:00) [9]
> BerkeleyMan (22.09.05 22:49) [7]
Когда выдается сообщение Member not found. J чему равно?
BerkeleyMan (2005-09-22 22:49:00) [10]при этом:
DocItem := WD.ActiveDocument.BuiltInDocumentProperties.Item(J);
YurikGL (2005-09-22 22:37:00) [11]
> Выдается сообщение Member not found.
при каком j ?
BerkeleyMan (2005-09-22 21:28:00) [12]Спасибо.
WD.ActiveDocument.BuiltInDocumentProperties.Count вернул мне 30.
Когда я прохожусь циклом:
for J := 1 to WD.ActiveDocument.BuiltInDocumentProperties.Count do
DocItem := WD.ActiveDocument.BuiltInDocumentProperties.Item(J);
Выдается сообщение Member not found.
Что я делаю не так?
k2 (2005-09-22 13:05:00) [13]Microsoft Office Word 2003 Visual Basic Reference ->Objects->Document Object->Properties->BuiltInDocumentProperties Property или CustomDocumentProperties Property в зависимости от того какая именно вкладка Свойств интересует
BerkeleyMan (2005-09-22 12:06:00) [14]Простите, ничего не понял. В каком конкретном свойстве?
k2 (2005-09-22 08:53:00) [15]точнее DocumentProperties (BuiltIn и Custom) ну да там уже по справке
k2 (2005-09-22 08:48:00) [16]ActiveDocument.CustomDocumentProperties