Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.21;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
2-1261234069
serhiyiv
2009-12-19 17:47
2010.02.21
TListView


15-1260328586
Kerk
2009-12-09 06:16
2010.02.21
Лицемерие :)


4-1229348213
Wadimka
2008-12-15 16:36
2010.02.21
Есть чужое приложение и есть на нем непонятные кнопки


15-1260401856
Германн
2009-12-10 02:37
2010.02.21
Маленькая offtop шутка.


8-1203148371
nuflin
2008-02-16 10:52
2010.02.21
чем шейдеры 3 отличаются от шейдеров 1(2) ????