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

Вниз

Можно ли ( и как) пользоваться COM или OLE-технологией в Д3 (Word   Найти похожие ветки 

 
Winni   (2005-07-06 17:25) [0]

К сожалению, вынужден ограничиваться Делфи3 (память компов < 64Mb). Можно ли в этом случае применить основные свойства и методы объекта WordApplication (Word2000.pas, WordXP.pas) или что-нибудь вроде этого?

В Д3 нормально работает следующий текст:
.....
  V: OLeVariant;

var
 Form1: TForm1;

implementation uses ComObj;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
V:= CreateOleObject("Word.Application");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
V.Caption := "MyWord";
V.Visible := true;
end;
...
Но я не нашел, можно ли далее программно делать что-нибудь с V.

Пытался подобраться с другой стороны - используя Word_TLB.pas.
Однако в этом случае модуль (Office_TLB) не компилируется:

procedure Change(const Ctrl: CommandBarComboBox); stdcall;
(Error: ... Undecleared indifier:  CommandBarComboBox )

Может быть, используется слишком новая версия Word.olb ?


 
just_me   (2005-07-06 18:43) [1]

Скорее слишком старая версия модуля экспорта type library, вхолящая в поставку Delphi3
Что же касается работы через OLeVariant (позднее связывание), то так можно работать даже в Delphi2. При этом вся функционадьность доступна. В последне время по VBA появилось масса информации, в том числе и книг, так что читать есть где. Ну, и не стоит забывать про MS Visual Basic Help, доступный в среде офиса - там в принципе есть все нужное


 
YurikGL ©   (2005-07-06 19:02) [2]


> Но я не нашел, можно ли далее программно делать что-нибудь
> с V.

http://www.delphimaster.ru/cgi-bin/anketa.pl?id=1084962208

Для того что-бы узнать, как что-то сделать из Delphi во Word-e надо во Word-е зайти в меню сервис/макрос/начать запись... Потом сделать во Word-e то, что надо сделать из Delphi и закончить запись макроса. И наконец сервис/макрос/макросы...выбираем записанный...изменить и смотрим, как он устроен. После этого первод синтаксиса VBA в синтаксис Delphi осуществляется просто и непринужденно.
Еще одним хорошим инструментом получения знаний являются компоненты типа TWordApplication. Кидаем его на форму, в любом операторе набираем WordApplication1., нажимаем ctrl+пробел и внимательно читаем. Смысл доступных функций и свойств обычно понятен интуитивно.


 
just_me   (2005-07-06 19:32) [3]

> Еще одним хорошим инструментом получения знаний являются компоненты типа TWordApplication

TWordApplication в Делфи3?


 
Winni   (2005-07-06 20:41) [4]

Спасибо !
Но в принципе все это мне известно. Когда работаю в D7, D6,то
удобно пользоваться справками типа VBAWRD9.chm, VBAWd10.chm и расшифровкой макросов. Но в Д3 чаще это не срабатывает. Но буду еще искать. Правда, нашел еще кое-что, которое работает

V.Caption := "MyWord";
V.Visible := true;
V.application.documents.add;
V.application.activedocument.range.insertAfter("Привет, привет");

Но здесь добавилось Application. Может в ем вся соль ?
(Добыто с сайта http://alex-co.com.ru/forum/ (Архангельский А.Я))


 
just_me   (2005-07-06 20:46) [5]

Это совершенно не зависит от версии Делфи! С таким же успехом можно использовать офисные СОМ сервера с помощью VB, VB/JScript. А вот объектная модель офисов разных версий может отличвться.


 
Winni   (2005-07-06 21:52) [6]

Добрый день !

> Это совершенно не зависит от версии Делфи!
- Наверное, это так и тогда появляются большие надежды.
Получается, что начитавшись VBAWRD9.chm и Word2000.pas я могу
использовать все методы и свойства. Это очень интересно, буду пробовать. Спасибо.


 
YurikGL ©   (2005-07-06 21:52) [7]


> just_me   (06.07.05 19:32) [3]
> > Еще одним хорошим инструментом получения знаний являются
> компоненты типа TWordApplication
>
> TWordApplication в Делфи3?

Что мешает посмотреть в фаре Word2000.pas ?


 
Winni   (2005-07-07 12:28) [8]

Добрый день !
И все-таки разница есть. В Д3 не описан EmptyParam => заменяю на UnAssigned. Но вставка рисунка, которая нормально проходит на Д7, здесь не получается. Во время исполнения при выполнении Shapes.AddPicture получаю сообщение: Одно из значений, переданных этому методу или свойству, выходит из допустимого диапазона. Если же присвоить численные значения Left,Top, Width,Height, то сообщения нет, но картинка не появляется.

{ ранее выполнено:
V:= CreateOleObject("Word.Application");
DirName:=ExtractFilePath(Application.EXEName);
}

Вот текст процедуры:
procedure TForm1.Button2Click(Sender: TObject);
Var Template, NewTemplate, DocumentType,
   Visible: OleVariant; NumRows,NumColumns,ii,jj: Integer;
   R22,PN,PNA: OleVariant; FName: WideString;
   DefaultTableBehavior: OleVariant; AutoFitBehavior: OleVariant;
   LinkToFile,SaveWithDocument,Left,Top, Width,Height,Anchor : OleVariant;
begin
V.Caption := "MyWord";
V.Visible := true;
V.application.documents.add;
V.application.activedocument.range.insertAfter("Привет, привет");

 try
     FName := DirName+"Logo.gif";  //Загружаем картинку-логотип в документ.
     Anchor :=  V.application.Selection.Range;  LinkToFile:=False;
     SaveWithDocument:=True;
     Left := UnAssigned; Top:= UnAssigned;
     Width:= UnAssigned; Height:= UnAssigned;
     V.application.activedocument.Shapes.AddPicture(FName,// имя файла с картинкой
      LinkToFile, //Связь с картинкой ( отсутствует)
      SaveWithDocument, //Сохранять вместе с документом? (Да)
      Left, Top, Width , Height, //Эти параметры не заданы.
      Anchor );
 except
  showmessage("Сервер отключен");
end;
end;


 
just_me   (2005-07-07 14:45) [9]

И все-таки разницы нет! Создайте, например, новый текстовый файл с именем test.js и поместите в него такой код:
  var wObj = new ActiveXObject("Word.Application");
  wObj.Visible = true;
  wObj.Caption = "MyWord";
  wObj.Visible = true;
  wObj.application.documents.add();
  wObj.application.activedocument.range(0,1).insertAfter("Hello, Hello");
  var a = wObj.application.Selection.Range;
  wObj.application.activedocument.Shapes.AddPicture("G:\\test.bmp", false, true, 0, 0, 100, 100, a);

Это аналог дельфового кода и он делает именно то, что вам нужно. А выход за диапазон координат и размеров возможно связан с тем, что они, согласно справке по VBA, мерятся в points


 
Winni   (2005-07-07 17:04) [10]

Спасибо !
Однако здесь я оплошал в другом - забыл, что Ворд бывает в режиме "Обычный" а чтобы рисовал - нужна "Разметка страницы" или "Веб". Так что работает и .js и мой код в Д3. Пришлось только автоматизировать перключение в режим "Разметка страницы". Для этого записал макрос, перевел в делфи, учел, что Д3( без Word2000.pas) не понимает wdPrintView, узнал, что это = 3 и все сработало. Пойду дальше. Но все же мне непонятно, как это работает без интерфейсного модуля Word2000. Где хранятся имена свойств и методов. Может, в реестре. Или буду искать описание OLE-технологии, пока ничего полезного не нашел.


 
just_me   (2005-07-07 17:18) [11]

Это и называется "позднее связывание". Эта информация нигде в этом случае не хранится, клиент вызывает сервер на свой страх и риск. При этом перед реальным вызовом СОМ-среда ищет в метаданных сервера функцию с заданным именем и найдя определяет ее индекв и вызывает по этому индексу. Количество, порядок и типы параметров заранее также не проверяются и вызов может быть отвергнут с возвратом ошибки.
BTW не все так трагично, можно попробовать поимпортить библиотеку типов конкретного Ворда и поредактировать получившийся pas-файл, дабы добиться компилируемости. Грубо говоря выкинуть какие-то описания, непонятные для Д3. Ясно, что функциональность пострадает, но может оставшейся как раз хватит.


 
Winni   (2005-07-07 20:12) [12]

Да, стоит попробовать. Вначале я об этом писал - что не компилируется в Д3 Word_TLB.pas, причем не понимает Д3  CommandBarComboBox. Попытаюсь выкинуть и буду надеяться, что не увязну в этом деле. Спасибо.



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

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

Наверх





Память: 0.49 MB
Время: 0.012 c
15-1148727021
guest2006
2006-05-27 14:50
2006.06.18
Помогите перевести C++ на Delphi


2-1149154940
De
2006-06-01 13:42
2006.06.18
Почему не компелиться?


2-1148765656
IAH
2006-05-28 01:34
2006.06.18
Как динамически менять имя метода/свойста?


15-1148044646
dimodim-furyz
2006-05-19 17:17
2006.06.18
Java 2 J2me у кого есть есть инфа?


2-1148890598
Barsky
2006-05-29 12:16
2006.06.18
Код ошибки при отправки на SMTP (Indy 9)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский