Как работать с OLE объектом
Модератор: Модераторы
-
Джентельмен
- постоялец
- Сообщения: 162
- Зарегистрирован: 16.10.2005 10:47:26
- Откуда: Украина Донбасс Краматорск
- Контактная информация:
Как работать с OLE объектом
есть вот у меня OLE объект... под Windows... а что с ним делать? как мне из Lazarus к нему подключитса и использовать все его методы, свойства и т. д. ???
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Пока никак
. Почему? Ответ можно найти здесь http://freepascal.ru/forum/viewtopic.php?t=2339
Последний раз редактировалось SAK 22.09.2007 18:33:59, всего редактировалось 1 раз.
Не совсем так. http://www.geocities.com/michailgm/MgOle2ForFPC.zip
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Попробовал указанный компонент. EXE-шники приложенные для проверки работают, а вот после компиляции этих же примеров в Lazarus 0.9.22 (FPC 2.0.4) незначительно изменённых:
приводит к исключению на указанной строке. Причину пока не выяснил.
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
OC: TMgOleController;
begin
OC := TMgOleController.Create;
OC.CreateOleObject('Word.Application');
OC.SetProperty('Visible',[True]);
OC.Free; // <<<<< - исключение
end;{ TForm1 }
приводит к исключению на указанной строке. Причину пока не выяснил.
SAK писал(а):Попробовал указанный компонент. EXE-шники приложенные для проверки работают, а вот после компиляции этих же примеров в Lazarus 0.9.22 (FPC 2.0.4) незначительно изменённых:Код:
procedure TForm1.Button1Click(Sender: TObject);
var
OC: TMgOleController;
begin
OC := TMgOleController.Create;
OC.CreateOleObject('Word.Application');
OC.SetProperty('Visible',[True]);
OC.Free; // <<<<< - исключение
end;{ TForm1 }
приводит к исключению на указанной строке. Причину пока не выяснил.
Запускай Exe-шник не в среде Lazarus а под системой
таже проблема была, вроде с отладчиком не дружит
А пример вызова методов есть?
Беру пример из архива, меняб ворд на Excel.Application.
OC := TMgOleController.Create;
Пустой Эксель создаётся, при попыткее вызвать метод в помеченной строке в рантайме исключение.
И ешё при компиляции Lazarus 0.9.24 ругается
Или поработать с OLE невозможно никаким способом?
'WorkBooK.Add', Application.WorkBooK.Add не помогают
Беру пример из архива, меняб ворд на Excel.Application.
OC := TMgOleController.Create;
Код: Выделить всё
OC1 := TMgOleController.Create;
OC.CreateOleObject('Excel.Application');
OC.CallFunction('Add',[EmptyStr,0]);<-----
OC.SetProperty('Visible',[True]); Пустой Эксель создаётся, при попыткее вызвать метод в помеченной строке в рантайме исключение.
И ешё при компиляции Lazarus 0.9.24 ругается
MgOle2Auto.pas(103,16) Error: function header doesn't match the forward declaration "TMgOleController.GetActiveOleObjectByClassID(TGuid):IDispatch;Register"
Или поработать с OLE невозможно никаким способом?
'WorkBooK.Add', Application.WorkBooK.Add не помогают
yuray писал(а):Можно. Смотри здесь
Там только для ворда, а с екселем как работать?
Автор WordDll планирует создать ExсelDll.dll. Но что мешает Вам сделать это самостоятельно. Исходники WordDll открыты, можно по аналогии и для Excel разработать подобную dll.
Создать ДЛЛ не проблема, всё дело в лицензионной чистоте. Наличее лицензии на Делфи, в которой будет компилироватся ДЛЛ, снимает сам вопрос о работе с OLE-обектом.
Возьмите Turbo Delphi Explorer, скомпилируйте dll.
Все, проблем нет.
Все, проблем нет.
GrayEddy писал(а):Возьмите Turbo Delphi Explorer, скомпилируйте dll.
Все, проблем нет.
Да, проблем нет если бы не спортивный интерес.
Почему эту длл нельзя компильнуть в Lazarusе? Вот в чем вопрос.
- EmeraldMan
- постоялец
- Сообщения: 149
- Зарегистрирован: 16.10.2008 08:41:51
- Откуда: Белгород
- Контактная информация:
Я так понял в версии 0.9.26 уже настроили работу с OLE.
Вот только проблемка с русскими буквами.
Когда используем dll скомпилированную в Delphi то такая инструкция работает отлично
т.е. благодаря UTF8ToAnsi получаем в документе нормальный русский текст, но когда делаем тоже самое просто через Lazarus, получается абракадабра, а с английскими буквами все в порядке...
кто знает в чем дело?
Добавлено спустя 2 часа 18 минут 4 секунды:
Ура!!! Разобрался! Изучил модуль ComObj и там синим по белому написано "we can't pass pascal ansistrings to COM routines so we've to convert them
to/from widestring. This array contains the mapping to do so" - короче говоря надо использовать WideString.
И тогджа правильный код будет выглядеть так:
Потому как по умолчанию идёт просто string.
Уверен, что многие это и так понимали, но я сразу не догнал... Так что написал это для таких же непонятливых
Вот только проблемка с русскими буквами.
Когда используем dll скомпилированную в Delphi то такая инструкция работает отлично
Код: Выделить всё
Wrd := CreateOleObject('Word.Application');
Wrd.Documents.Add;
Wrd.Selection.TypeText(UTF8ToAnsi('Лазарус')); т.е. благодаря UTF8ToAnsi получаем в документе нормальный русский текст, но когда делаем тоже самое просто через Lazarus, получается абракадабра, а с английскими буквами все в порядке...
кто знает в чем дело?
Добавлено спустя 2 часа 18 минут 4 секунды:
Ура!!! Разобрался! Изучил модуль ComObj и там синим по белому написано "we can't pass pascal ansistrings to COM routines so we've to convert them
to/from widestring. This array contains the mapping to do so" - короче говоря надо использовать WideString.
И тогджа правильный код будет выглядеть так:
Код: Выделить всё
var s: widestring;
...
s := Utf8ToAnsi('Лазарус это классно');
Wrd := CreateOleObject('Word.Application');
Wrd.Documents.Add;
Wrd.Selection.TypeText(s); Потому как по умолчанию идёт просто string.
Уверен, что многие это и так понимали, но я сразу не догнал... Так что написал это для таких же непонятливых
-
ViruZ
- постоялец
- Сообщения: 175
- Зарегистрирован: 30.05.2005 17:41:12
- Откуда: Украина
- Контактная информация:
Наткнулся на грабли при попытке переноса функций из WordDll - создал тестовый пример - форма с Button, в обработчике OnClick код:
Если указанную строчку закомментировать, все работает. Пока еще не возможно присваивать значения свойствам или как это понимать?
Изменил обработчик
Каким образом можно присвоить значение свойству обьекта? Или пока еще подождать, когда работа с OLE-обьектами будет полностью реализована и продолжать разработку DLL&
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
s:=Utf8ToAnsi('Тест ворда из Лазаруса');
Wrd := CreateOleObject('Word.Application');
Wrd.Visible := true; //<==грабли тут
Wrd.Documents.Add;
Wrd.Selection.Font.Size := 20;
Wrd.Selection.TypeText(s);
Wrd.ActiveDocument.SaveAs('c:\test.doc');
Wrd.ActiveDocument.Close;
Wrd.Quit;
end;
Если указанную строчку закомментировать, все работает. Пока еще не возможно присваивать значения свойствам или как это понимать?
Изменил обработчик
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
s:=Utf8ToAnsi('Тест ворда из Лазаруса');
Wrd := CreateOleObject('Word.Application');
Wrd.Documents.Add;
Wrd.Selection.Font.Size := 20;//<==теперь грабли тут
Wrd.Selection.TypeText(s);
Wrd.ActiveDocument.SaveAs('c:\test.doc');
Wrd.ActiveDocument.Close;
Wrd.Quit;
end;
Каким образом можно присвоить значение свойству обьекта? Или пока еще подождать, когда работа с OLE-обьектами будет полностью реализована и продолжать разработку DLL&
