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

Вниз

Позднее связывание   Найти похожие ветки 

 
WebErr ©   (2004-10-13 13:25) [0]

Чем оно лучше раннего связывания?
Я имею в виду ExcelApplication.


 
Skier ©   (2004-10-13 13:32) [1]

>WebErr ©   (13.10.04 13:25)  

> Чем оно лучше раннего связывания?

Можно писать всё что угодно, бо методы ищутся по имени...


 
Amoeba ©   (2004-10-13 13:34) [2]

Только тем, что не требуется библиотека типов (компонент является лишь оберткой над ней). А хуже тем, что быстродействие получается очень существенно более низким.


 
WebErr ©   (2004-10-13 13:38) [3]

А используются, насколько я понял, одинаково.
Только в позднем создание объекта - это CreateOLEObject("ExcelApplication").
В общем, вкратце, в чём существенные отличия при написании кода?


 
WebErr ©   (2004-10-13 13:58) [4]

Кое-что нашёл на seeYou.narod.ru, кому интересно - выкладываю:

uses comobj; //эта строка должна присутствовать обязательно  

procedure TForm1.Button1Click(Sender: TObject);
var
 exl: OleVariant;
 WorkBook, Sheet: Variant;
 fileName: String;
begin
 try
   //Получаем имя для будующего Excel-файла
   fileName:= ExtractFilePath(Application.EXEName)+"Sample1.xls";
   //Создаем объект интерфейса для доступа к серверу COM
   exl := CreateOleObject("Excel.Application");
   //Создаем книгу и обращаемся к первому листу
   WorkBook := exl.Application.WorkBooks.Add;
   Sheet := WorkBook.WorkSheets[1];
   //Записываем в первую ячейку значение "Проба"
   Sheet.Cells(1,1) := "Проба";
   //Сохраняем полученный файл
   exl.Application.ActiveWorkBook.Saveas(fileName);
 finally
   //Выгружаем сервер из памяти компьютера
   exl.Application.Quit;
 end;
end;


 
jack128 ©   (2004-10-13 14:20) [5]

WebErr ©   (13.10.04 13:38) [3]
в чём существенные отличия при написании кода

тем, что при раннем связовании доступен Code Insight, а при раннем нет. Тем, что при позднем связовании ты можешь указывать только те параметры медов, которые те нужны, а при позднем - обязан указать ВСЕ парамеры(а их может быть ОЧЕНЬ много)


 
jack128 ©   (2004-10-13 14:20) [6]

jack128 ©   (13.10.04 14:20) [5]
при раннем связовании доступен Code Insight, а при позднем нет.


 
KSergey ©   (2004-10-13 14:31) [7]

> [5] jack128 ©   (13.10.04 14:20)
> при позднем - обязан указать ВСЕ парамеры(а их может быть
> ОЧЕНЬ много)

Это бы пол-беды. Хуже то, что состав параметров может отличаться от версии к версии. Ну либо коннектиться к COM-объекту определенной версии (наверное?). Но тогда к какой?

> [2] Amoeba ©   (13.10.04 13:34)
> А хуже тем, что быстродействие
> получается очень существенно более низким.

А вот тут...
Не уверен за корректность своих опытов, но у меня плучалось одинаково. С точностью до погрешности измерений.

Может завести ветку и обсудить где я был не прав?


 
Суслик ©   (2004-10-13 14:32) [8]


> > [2] Amoeba ©   (13.10.04 13:34)
> > А хуже тем, что быстродействие
> > получается очень существенно более низким.

я тоже не согласен.
более низкое быстроедействие, но сущесвенным такое замедление назвать нельзя


 
WebErr ©   (2004-10-13 14:50) [9]

Мне объяснили, что я должен переделать код, где было раннее связывание, на код с поздним для того, чтобы не зависеть от версии Офиса установленного на путере клиента!
Кстати я попробовал следующий код и у меня вылезла CoInitialize error! Почему?

program ProjectOLE;

{$APPTYPE CONSOLE}

uses
 SysUtils, ComObj;

var
 xl: OleVariant;

begin
 xl := CreateOleObject("Excel.Application");
end.


 
Amoeba ©   (2004-10-13 14:54) [10]


> у меня вылезла CoInitialize error! Почему?

Потому, что не вызвал CoInitialize в КОНСОЛЬНОМ приложении.


 
WebErr ©   (2004-10-13 14:59) [11]

Где и как именно его вызывать и зачем оно надо?


 
WebErr ©   (2004-10-13 14:59) [12]

Где и как именно его вызывать и зачем оно надо?


 
WebErr ©   (2004-10-13 15:04) [13]

Выражусь точнее: в каком юните его искать, поскольку я понял что для консолного проекта оно иниц-ет COM модель.


 
WebErr ©   (2004-10-13 15:14) [14]

Бяки вы все. Не сказали бедолаге, что CoInitialize в ActiveX Unit"е.


 
jack128 ©   (2004-10-13 15:15) [15]

KSergey ©   (13.10.04 14:31) [7]
Это бы пол-беды. Хуже то, что состав параметров может отличаться от версии к версии. Ну либо коннектиться к COM-объекту определенной версии (наверное?). Но тогда к какой?

ну в офисе есть свойство Version

2 Суслик и KSergey ©   (13.10.04 14:31) [7]
Не уверен за корректность своих опытов, но у меня плучалось одинаково
теоретически - должна быть разница, равная времени вызова GetIDsOfNames..  Да, заведи ветку, я сейчас попробывал - у мя тоже в рамках погрешности разница.. Но я ранним связаванием пользуюсь, ножет накозячел, где нить..
WebErr ©   (13.10.04 14:59) [12]
ComObj


 
jack128 ©   (2004-10-13 15:16) [16]

jack128 ©   (13.10.04 15:15) [15]
Но я ранним связаванием РЕДКО пользуюсь,


 
WebErr ©   (2004-10-13 15:19) [17]


> jack128 ©   (13.10.04 15:15) [15]

Стопудово нет, иначе бы не было undefined identifier CoInitialize


 
jack128 ©   (2004-10-13 15:21) [18]

WebErr ©   (13.10.04 15:19) [17]
угу, я имел в виду CoInitializeEx - sorry


 
WebErr ©   (2004-10-13 15:32) [19]

Accepted


 
WebErr ©   (2004-10-13 15:34) [20]

Разделите со мной мою радость! 8)

program ProjectOLE;

{$APPTYPE CONSOLE}

uses
 SysUtils, ComObj, ActiveX;

var
 xl: OleVariant;

begin
 CoInitialize(nil);
 try
   xl := CreateOleObject("Excel.Application");
   xl.Visible := true;
   xl.WorkBooks.Open("O:\Users\Weber\Projects\OLE\Ïðèìåð.xls");
   sleep(5000);
 finally
   xl.Application.Quit;
 end;
end.

Спасибо всем большое, особенно Amoeba! 8)


 
KSergey ©   (2004-10-14 08:55) [21]

> jack128 ©   (13.10.04 15:15) [15]
> Это бы пол-беды. Хуже то, что состав параметров может отличаться
> от версии к версии. Ну либо коннектиться к COM-объекту определенной
> версии (наверное?). Но тогда к какой?
> ну в офисе есть свойство Version

Поздно уже ;) Когда подключился - что толку узнать версию? Чтобы сказать "простите, не вышло"? ;)

Вообще под версией я понимал другое: указывать не просто "Excel.Application", а "Excel.Application.10" ну или другую цифирю по вкусу. Хотя. это опять же про позднее связывание. А про раннее... Ну так подозреваю, что например TWord97 подключится к 97 версии (ну или как там она), т.к. в него прошит GUID именно этого COM-сервера. А, если я ничего не путаю, при изменении спецификации COM-сервера ему назначают другой GUID.

> Да, заведи ветку,

Хорошо.
Придумаю состав экспериментов - заведу.


 
jack128 ©   (2004-10-14 14:34) [22]

KSergey ©   (14.10.04 8:55) [21]
Когда подключился - что толку узнать версию? Чтобы сказать "простите, не вышло"? ;)


Подключился поздним проверил версию и подключился нужным ранним. Хотя бред, конечно.


> Вообще под версией я понимал другое

я понял. Именно эту цифру и выдает свойство Version

> А, если я ничего не путаю, при изменении спецификации
> COM-сервера ему назначают другой GUID.
да, конечно. Один из основопологающих принципов СОМ


 
Nurik   (2004-10-16 18:46) [23]

Вопрос не много не в тему но интересный.
Выполняется следующий код:
   ExcelApp := CreateOleObject("Excel.Application");
   ExcelApp.WorkBooks.Add(1);
   ExcelApp.WorkBooks[1].WorkSheets[1].Name := "Лист";
..............................
   pt:=ExcelApp.Workbooks[1].ActiveSheet.PivotTableWizard
       (SourceType :=1, SourceData:="Лист!A1:J10",
       TableDestination:="", TableName:="сводная1");
   pt.AddFields (RowFields:="Region");
   pt.PivotFields("Town").Orientation := 4;
   pt.PivotFields("Town").Function := 1;
и на последней строчке происходит ошибка. Думаю что слово Funсtion зарезервировано. Как выйти из положения?
Нашел функции OlePropertyGet и OlePropertySet но они не работают.


 
Nurik   (2004-10-16 18:47) [24]

Вопрос не много не по теме, но интересный.
Выполняется следующий код:
   ExcelApp := CreateOleObject("Excel.Application");
   ExcelApp.WorkBooks.Add(1);
   ExcelApp.WorkBooks[1].WorkSheets[1].Name := "Лист";
..............................
   pt:=ExcelApp.Workbooks[1].ActiveSheet.PivotTableWizard
       (SourceType :=1, SourceData:="Лист!A1:J10",
       TableDestination:="", TableName:="сводная1");
   pt.AddFields (RowFields:="Region");
   pt.PivotFields("Town").Orientation := 4;
   pt.PivotFields("Town").Function := 1;
и на последней строчке происходит ошибка. Думаю что слово Funсtion зарезервировано. Как выйти из положения?
Нашел функции OlePropertyGet и OlePropertySet но они не работают.


 
KSergey ©   (2004-10-18 07:40) [25]

> [23] Nurik   (16.10.04 18:46)
> и на последней строчке происходит ошибка.

Какая?? Что, постоянно всех переспрашивать надо?
А вообще, боюсь проблема не от резервированности слова. Что-то вы не то делаете.



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

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.044 c
1-1120341294
Flood_control
2005-07-03 01:54
2005.07.25
ShellListView специальные ограничения


1-1120689448
TListView
2005-07-07 02:37
2005.07.25
Как на заголовках столбцов в TListView нарисовать рисочки


1-1120819580
1+Random(9999)
2005-07-08 14:46
2005.07.25
Сокеты


1-1120335951
Дмитрий_05
2005-07-03 00:25
2005.07.25
Событие на добавление новой иконки на рабочий стол


1-1120728765
pasha_golub
2005-07-07 13:32
2005.07.25
Создание копии объекта