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

Вниз

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

 
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 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.011 c
14-1120194170
Хинт
2005-07-01 09:02
2005.07.25
Изображение со спутника


1-1120652306
Dmitrij_K
2005-07-06 16:18
2005.07.25
TThread


3-1118710672
Rat
2005-06-14 04:57
2005.07.25
Как узнать, принадлежит ли эта колонка bookmark у?


4-1117215084
sofs
2005-05-27 21:31
2005.07.25
Порты


14-1120124105
stone
2005-06-30 13:35
2005.07.25
Hello, World. На разных языках





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