Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];

Вниз

Удаление экземпляра объекта   Найти похожие ветки 

 
Burger   (2009-12-18 11:19) [0]

При работе с файлами 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. Та как его всеже уничтожить?


 
clickmaker ©   (2009-12-18 11:43) [1]


> Однако компилятор выдает ошибку "Metod "Unassigned" not
> supported by automation object

а там не так часом написано?
WordApp.Unassigned;


 
Burger   (2009-12-18 11:56) [2]

Конечно же правильно будет WordApp.Unassigned а строчка WordApp := Unassigned; скопирована как есть из примера DelphiWord. В тексте программы написано WordApp.Unassigned, однако ошибка выдается компилятором в момент закрытия формы.

procedure TForm1.FormDestroy(Sender: TObject);
begin
 WordApp.Quit;
 WordApp.Unassigned;
end;


 
clickmaker ©   (2009-12-18 12:02) [3]


> Конечно же правильно будет WordApp.Unassigned а строчка
> WordApp := Unassigned; скопирована как есть из примера DelphiWord

блин... в данном случае как раз-таки пример правильный.
нет такого метода, это константа, обозначающая не инициализированный variant


 
Burger   (2009-12-18 12:09) [4]

А  почему тогда когда в IDE побуквенно добавляешь название метода для "WordApp.Unass..." появляется function Unassigned. И при добавлении оной компилируется без ошибки, а в рантайм - ошибка ?


 
clickmaker ©   (2009-12-18 12:14) [5]


> И при добавлении оной компилируется без ошибки, а в рантайм
> - ошибка ?

потому что это disp-interface, представленный как variant.
при работе с ним методы определяются только в процессе выполнения, т.н. "позднее связывание".
поэтому компилятор просто не может проверить правильность


 
Burger   (2009-12-18 12:28) [6]


> clickmaker ©   (18.12.09 12:14) [5]

Понятно, спасибо. Значит правильно будет WordApp := Unassigned; Или достаточно просто закрыть через WordApp.Quit; а экземпляр объекта уничтожится сам?


 
clickmaker ©   (2009-12-18 12:35) [7]

WordApp.Quit закрывает запущенный из программы экземпляр ворда, WordApp := Unassigned транслируется в вызов Release соотв. интерфейса, т.е. освобождает ссылку на него
по хорошему нужны обе строчки, если только переменная WordApp - не локальная


 
Burger   (2009-12-18 12:48) [8]


> по хорошему нужны обе строчки, если только переменная 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.


 
Демо ©   (2009-12-18 13:07) [9]

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
и т. д.


 
Anatoly Podgoretsky ©   (2009-12-18 13:56) [10]

> Burger  (18.12.2009 12:48:08)  [8]

Во первых читать надо MSDN, а не любой источник.
Во вторых надо учитывать версию.


 
clickmaker ©   (2009-12-18 14:02) [11]

> Не подскажите  где можно посмотреть как правильно обращаться
> к свойствам и какие конкретно свойства есть для управления
> файлом word

\DelphiX\Ocx\Servers\WordX.pas


 
zorik ©   (2009-12-18 14:40) [12]

Можно запустить макрос, повозится с тем что интересует (изменение (чтение) ширины полей страницы). А потом использовать текст макроса, подкоректировав его для Delphi


 
Burger   (2009-12-18 15:11) [13]


> 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


 
Burger   (2009-12-18 15:35) [14]


> clickmaker ©   (18.12.09 14:02) [11]
> \DelphiX\Ocx\Servers\WordX.pas

Установил DelphiX , но не нашел там ни указанного каталога, ни указанного файла.


 
clickmaker ©   (2009-12-18 15:42) [15]

> Установил DelphiX

какую?


 
clickmaker ©   (2009-12-18 15:44) [16]

DelphiX - это не DelphiX. X - это номер версии
в папке дельфи, короче


 
Burger   (2009-12-18 15:54) [17]


> clickmaker ©   (18.12.09 15:44) [16]
> DelphiX - это не DelphiX. X - это номер версии
> в папке дельфи, короче

Теперь понятно. Буду разбираться


 
Burger   (2009-12-18 17:39) [18]

Я уже решил что тему можно закрывать, однако возникли трудности следующего порядка. Нашел для изучения книгу автор Василий Корняков "Программирование документов и приложений 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)

Что это за цифры? Откуда такие взялись? Чему они соответствуют??? Ничего не понимаю.


 
Игорь Шевченко ©   (2009-12-18 18:37) [19]


> Что это за цифры? Откуда такие взялись? Чему они соответствуют?
> ??


А у Василия Корнякова спросить ?


 
Burger   (2009-12-20 20:05) [20]


> Игорь Шевченко ©   (18.12.09 18:37) [19]
> А у Василия Корнякова спросить ?

Прочитал половину книги(касаемо Word) - нет там ответа. Кстати в этом же примере, рассмотренном в книге, на картинках те же цифры. Разыскивать автора книги и у него спрашивать? Чувствую здесь имеет место быть факт неоговореных преобразований значений.


 
Игорь Шевченко ©   (2009-12-20 20:07) [21]


>  Разыскивать автора книги и у него спрашивать?


Я пытаюсь намекнуть, что здесь книжку упомянутого автора наверное не все наизусть знают (я так точно не читал), и спрашивать здесь, что автор имел в виду, менее целесообразно, чем у самого автора.


 
Burger   (2009-12-20 20:21) [22]


> и спрашивать здесь, что автор имел в виду, менее целесообразно,
>  чем у самого автора.

Собственно здесь и автор-то постольку поскольку нужен. В примере то идет явное обращение к объектам Word и при считывании данных получается вот такая петрушка.


 
Burger   (2009-12-21 13:05) [23]

По долгому затишью складывается впечатление, что никто не работал с вордом из Delphi и не сталкивался с такой ситуацией. Методом тыка и прочих поисков нашел взаимосвязь с методом WordApp.CentimetersToPoints. По догадкам получается , что ворд хранит все значения настроек в поинтах (размеры листа, отступы и т.д), а визульно представляет в сантиметрах. Значит получается, что для представления в окне настроек он тоже перевод делает? И если учесть это обстоятельство, то для более грамотного представления примером нужно было бы тоже переводить данные в сантиметры или мм, но для этого дополнительно нужно тогда вычислить в чем идут настройки.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
15-1260739822
Юрий
2009-12-14 00:30
2010.02.21
С днем рождения ! 14 декабря 2009 понедельник


13-1124465855
FUNKy
2005-08-19 19:37
2010.02.21
DataSet + WebService + ASP.NET + Delphi 2005 = трабл


15-1257309727
xayam
2009-11-04 07:42
2010.02.21
Старые архивы для DMSearch на www.delphimaster.net


2-1261054211
Aleks
2009-12-17 15:50
2010.02.21
Программно ввести данные ТХТ в базу данных


2-1261068749
Б
2009-12-17 19:52
2010.02.21
Как установить размеры клиентской части окна?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский