![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление экземпляра объекта [D7, XP]
Burger © (2009-12-18 11:19:00)При работе с файлами Word начинаю работу так:
var
WordApp: OLEVariant;
...
{ Create the OLE Object }
try
WordApp := CreateOLEObject('Word.Application');
except
on E: Exception do
begin
E.Message := 'Word is not available.';
raise;
end;
end
не вдаваясь в дальнейшую с ним работу ...
В конце работы пытаюсь удалить WordApp
{ Quit Word }
WordApp.Quit;
WordApp := Unassigned;
Все взято из примеров. Однако компилятор выдает ошибку "Metod 'Unassigned' not supported by automation object. Та как его всеже уничтожить?
Burger (2009-12-21 13:05:00) [1]По долгому затишью складывается впечатление, что никто не работал с вордом из Delphi и не сталкивался с такой ситуацией. Методом тыка и прочих поисков нашел взаимосвязь с методом WordApp.CentimetersToPoints. По догадкам получается , что ворд хранит все значения настроек в поинтах (размеры листа, отступы и т.д), а визульно представляет в сантиметрах. Значит получается, что для представления в окне настроек он тоже перевод делает? И если учесть это обстоятельство, то для более грамотного представления примером нужно было бы тоже переводить данные в сантиметры или мм, но для этого дополнительно нужно тогда вычислить в чем идут настройки.
Burger (2009-12-20 20:21:00) [2]
> и спрашивать здесь, что автор имел в виду, менее целесообразно,
> чем у самого автора.
Собственно здесь и автор-то постольку поскольку нужен. В примере то идет явное обращение к объектам Word и при считывании данных получается вот такая петрушка.
Игорь Шевченко (2009-12-20 20:07:00) [3]
> Разыскивать автора книги и у него спрашивать?
Я пытаюсь намекнуть, что здесь книжку упомянутого автора наверное не все наизусть знают (я так точно не читал), и спрашивать здесь, что автор имел в виду, менее целесообразно, чем у самого автора.
Burger (2009-12-20 20:05:00) [4]
> Игорь Шевченко © (18.12.09 18:37) [19]
> А у Василия Корнякова спросить ?
Прочитал половину книги(касаемо Word) - нет там ответа. Кстати в этом же примере, рассмотренном в книге, на картинках те же цифры. Разыскивать автора книги и у него спрашивать? Чувствую здесь имеет место быть факт неоговореных преобразований значений.
Игорь Шевченко (2009-12-18 18:37:00) [5]
> Что это за цифры? Откуда такие взялись? Чему они соответствуют?
> ??
А у Василия Корнякова спросить ?
Burger (2009-12-18 17:39:00) [6]Я уже решил что тему можно закрывать, однако возникли трудности следующего порядка. Нашел для изучения книгу автор Василий Корняков "Программирование документов и приложений MS OFFISE в DELPHI". (На выходные будет чем заняться). Вместе с книгой идет диск, на котором имеются примеры, описанные в книге. Не удержался, чтобы не посмотреть. Так вот, по примеру я нашел ответ на свой вопрос, как обращаться к параметрам документа. Но что я вижу за цифпы? !!!
// В главном модуле
procedure TForm1.FormCreate(Sender: TObject);
begin
W:=CreateOleObject('Word.Application');
W.visible:=true;
end;
...
//второй модуль проекта
var
PageSetup:variant;
...
//инициализация значений во втором модуле
PageSetup:=Form1.W.ActiveDocument.PageSetup;
Orientation.ItemIndex:=PageSetup.Orientation;
VerticalAlignment.ItemIndex:=PageSetup.VerticalAlignment;
CheckBox1.Checked:=PageSetup.LineNumbering.Active;
PageWidth.Value:=PageSetup.PageWidth;
PageHeight.Value:=PageSetup.PageHeight;
TopMargin.Value:=PageSetup.TopMargin;
LeftMargin.Value:=PageSetup.LeftMargin;
В примере загружаем некий документ. Сразу захожу в его настройки параметров страницы. Ширина - 21, Высота- 29,7. Смотрю во втором модуле
PageWidth.Value = 595;
PageHeight.Value = 842;
(PageWidth и PageHeight - TSpinEdit)
Что касается отступов (верхний и левый) в параметрах страницы - 2 см
TopMargin.Value = 57
LeftMargin.Value = 85
(TopMarginи LeftMargin- TSpinEdit)
Что это за цифры? Откуда такие взялись? Чему они соответствуют??? Ничего не понимаю.
Burger (2009-12-18 15:54:00) [7]
> clickmaker © (18.12.09 15:44) [16]
> DelphiX - это не DelphiX. X - это номер версии
> в папке дельфи, короче
Теперь понятно. Буду разбираться
clickmaker (2009-12-18 15:44:00) [8]DelphiX - это не DelphiX. X - это номер версии
в папке дельфи, короче
clickmaker (2009-12-18 15:42:00) [9]> Установил DelphiX
какую?
Burger (2009-12-18 15:35:00) [10]
> clickmaker © (18.12.09 14:02) [11]
> \DelphiX\Ocx\Servers\WordX.pas
Установил DelphiX , но не нашел там ни указанного каталога, ни указанного файла.
Burger (2009-12-18 15:11:00) [11]
> Burger (18.12.09 12:48) [8]
Я извеняюсь. Неверно привел код. Как разобрался в деталях обозрел, что в данном случае был использован компонент WordDocument с закладки Servers/ И правильно было так :
WordDocument1.PageSetup.TopMargin:=100;
WordDocument1.PageSetup.BottomMargin:=90;
WordDocument1.PageSetup.LeftMargin:=90;
WordDcoument1.PageSetup.RightMargin:=50;
А у него такие свойства есть.
Просто в первом случае у меня WordApp: OLEVariant; и его инициализацию я делаю через WordApp := CreateOLEObject('Word.Application'); Так получилось, что продолжение своего вопроса я подкрепил куском кода из совсем другого примера. Прошу прощения, если ввел в заблуждение. А по совету [9] глянул... темный лес. Лучше буквари на "родном" поискать. Получается что в первом случае я пытался использовать связь с Word без использования компонентов с закладки Servers
zorik (2009-12-18 14:40:00) [12]Можно запустить макрос, повозится с тем что интересует (изменение (чтение) ширины полей страницы). А потом использовать текст макроса, подкоректировав его для Delphi
clickmaker (2009-12-18 14:02:00) [13]> Не подскажите где можно посмотреть как правильно обращаться
> к свойствам и какие конкретно свойства есть для управления
> файлом word
\DelphiX\Ocx\Servers\WordX.pas
Anatoly Podgoretsky (2009-12-18 13:56:00) [14]> Burger (18.12.2009 12:48:08) [8]
Во первых читать надо MSDN, а не любой источник.
Во вторых надо учитывать версию.
Демо (2009-12-18 13:07:00) [15]http://msdn.microsoft.com/en-us/library/dd146899.aspx
http://msdn.microsoft.com/en-us/library/bb244515.aspx
http://msdn.microsoft.com/en-us/library/bb244569.aspx
и т. д.
Burger (2009-12-18 12:48:00) [16]
> по хорошему нужны обе строчки, если только переменная WordApp
> - не локальная
Впринципе ее можно сделать и локальной, т.к. интересует кратковременный доступ к файлу Word для изменения его некоторых свойств. Тут главное понят как нужно делать правильно. Кстати, попутно хотелось бы спросить. Доступ к файлам Word смотрю по примерам. Так вот меня интересует изменение некоторых свойств, в частности параметров страницы. Нашел следующее:
Теперь о полях. Изменение (чтение) ширины полей страницы:
WordApp.PageSetup.TopMargin:=100;
WordApp.PageSetup.BottomMargin:=90;
WordApp.PageSetup.LeftMargin:=90;
WordApp.PageSetup.RightMargin:=50;
WordApp.PageSetup. - нет такого свойства. Ошибака та-же "Metod 'PageSetup' not supported by automation object. Не подскажите где можно посмотреть как правильно обращаться к свойствам и какие конкретно свойства есть для управления файлом word.
clickmaker (2009-12-18 12:35:00) [17]WordApp.Quit закрывает запущенный из программы экземпляр ворда, WordApp := Unassigned транслируется в вызов Release соотв. интерфейса, т.е. освобождает ссылку на него
по хорошему нужны обе строчки, если только переменная WordApp - не локальная
Burger (2009-12-18 12:28:00) [18]
> clickmaker © (18.12.09 12:14) [5]
Понятно, спасибо. Значит правильно будет WordApp := Unassigned; Или достаточно просто закрыть через WordApp.Quit; а экземпляр объекта уничтожится сам?
clickmaker (2009-12-18 12:14:00) [19]
> И при добавлении оной компилируется без ошибки, а в рантайм
> - ошибка ?
потому что это disp-interface, представленный как variant.
при работе с ним методы определяются только в процессе выполнения, т.н. "позднее связывание".
поэтому компилятор просто не может проверить правильность
Burger (2009-12-18 12:09:00) [20]А почему тогда когда в IDE побуквенно добавляешь название метода для "WordApp.Unass..." появляется function Unassigned. И при добавлении оной компилируется без ошибки, а в рантайм - ошибка ?