Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2014, 17:17   #1
HJPotter
Новичок
Джуниор
 
Регистрация: 09.06.2014
Сообщений: 5
По умолчанию Не работает позднее связывание в XE3

Доброго дня.

Есть проект написанный в Delphi XE,
где обращение к Excel основано на позднем связывании.
В XE3 проект, понятное дело, компилируется без ошибок,
но во время исполнения выдает ошибки обращения к методам Excel.

Это как-нибудь лечится без перехода на раннее связывание?
HJPotter вне форума Ответить с цитированием
Старый 09.06.2014, 17:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Текст ошибок в студию.
Если метод не найден, то значит не Делфи тут виновато а просто такого метода в этой версии оффиса в доступности для OLE Automation уже нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2014, 18:20   #3
HJPotter
Новичок
Джуниор
 
Регистрация: 09.06.2014
Сообщений: 5
По умолчанию

Сама ошибка:
Метод PasteSpecial из класса Range завершен неверно.

Прмерный код написал ниже:
Код:
const
  xlPasteFormats = $FFFFEFE6;
  xlPasteSpecialOperationNone = $FFFFEFD2;
var
  vRange1: OLEVariant;
  vRange2: OLEVariant;
begin
....
  vRange1.Copy(EmptyParam);
  vRange2.PasteSpecial(
        xlPasteFormats, 
        xlPasteSpecialOperationNone, 
        False,              
        False);
...
end;
>> такого метода в этой версии оффиса в доступности для OLE Automation уже нет

В том-то и дело, что есть.
Проект скомпилированный в Delphi XE работает без вопросов.

Все что нашел в inet по этой теме: http://www.add-in-express.com/forum/...ID=1&TID=11377

Но я не могу преобразовать все вызовы в раннее связывание.

И это не единственный метод, который не работает,
но некоторые работают нормально.

Кстати, в XE5 та же проблема.

Stilet

Ты правда из Краматорска?

Вот полный "не работающий" пример:

Код:
procedure TForm2.Button1Click(Sender: TObject);
const
  xlPasteFormats = $FFFFEFE6;
  xlPasteSpecialOperationNone = $FFFFEFD2;
var
  sFile: string;
  vApp   : Variant;
  vBook  : Variant;
  vSheet : Variant;
  vRange1: Variant;
  vRange2: Variant;
begin
  sFile  := 'c:\temp\test.xls';
  vApp   := createOleObject('Excel.Application');
  vBook  := vApp.WorkBooks.open(FileName:=sFile, ReadOnly:=false);
  try
  vSheet := vBook.sheets.Item[1];

  vRange1:=vSheet.Range['A1'];
  vRange2:=vSheet.Range['B1'];
  vRange1.Copy(EmptyParam);
  // Следующий метод вызывает ошибку.
  vRange2.PasteSpecial(
        TOLEEnum(xlPasteFormats),
        TOLEEnum(xlPasteSpecialOperationNone),
        False,
        False);
  finally
    vBook.save;
    vBook.close;
    vApp.quit;
    vApp:=unassigned;
  end;
end;

Последний раз редактировалось Stilet; 09.06.2014 в 19:53.
HJPotter вне форума Ответить с цитированием
Старый 09.06.2014, 19:56   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Проект скомпилированный в Delphi XE работает без вопросов.
Хм... А если поменять OleVarian на обычный Variant?
Я с такой проблемой в лазарусе столкнулся.
Цитата:
Ты правда из Краматорска?
Да правда. И у нас стреляют. но это уже оффтоп.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2014, 21:45   #5
HJPotter
Новичок
Джуниор
 
Регистрация: 09.06.2014
Сообщений: 5
По умолчанию

Цитата:
А если поменять OleVarian на обычный Variant?
В последнем примере как раз обычный variant используется, не помогает.
Вариант с явным указанием имен параметров (см. ниже) тоже не работает.

vRange2.PasteSpecial(Paste := xlPasteFormats );

Цитата:
Да правда. И у нас стреляют. но это уже оффтоп.
Я из Москвы.
Беспредел, который у вас происходит, нам во всех деталях показывают.
Непонятно только почему всё этими репортажами и заканчивается.
Уже стыдно за Россию становится.
HJPotter вне форума Ответить с цитированием
Старый 09.06.2014, 22:52   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В последнем примере как раз обычный variant используется, не помогает.
Вариант с явным указанием имен параметров (см. ниже) тоже не работает.
Что-ж... Если в одной версии Делфи скомпиленное работает, а в другой нет - значит это проблема версий. Максимум что могу посоветовать - не использовать createOleObject, а пользоваться компонентами доступа к Оффису из палитры самого Делфи. Должны быть такие.
Хотя честно признаюсь - я бы выбрал не xls а xml для сохранения данных, передаваемых потом в Экзель. Т.е. создать XML файл, а потом открыть его в экзеле - ИМХО самый простой путь. API Оффиса качалось от версии к версии, и по разным компиляторам по разному воспринималось.
Вообще лучше бы ты озвучил задачу - зачем тебе понадобилось данные через OLE передавать в оффис. Уверен что решить ее можно гораздо эффективнее, чем то что ты делаешь сейчас.
Цитата:
Беспредел, который у вас происходит, нам во всех деталях показывают.
Ниче вам не показывают. Мой тебе совет: хочешь знать правду - не смотри ящик. Все равно по нему брешут и те и другие. И это оффтоп не нужно тут продолжать сей разговор.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2014, 23:53   #7
HJPotter
Новичок
Джуниор
 
Регистрация: 09.06.2014
Сообщений: 5
По умолчанию

Цитата:
я бы выбрал не xls а xml для сохранения данных
Задача состоит не в сохранении данных.
Необходимо построить отчет по запросу из базы данных,
а в Excel хранится шаблон отчета - внешний вид, расположение и формат ячеек
полей для одной записи запроса к БД.
Программа считывает эту информацию, дублирует представление для каждой
записи и заполняет её реальными значениями.
И таких отчетов уже много, а я хотел перейти на более старшую версию Delphi.
HJPotter вне форума Ответить с цитированием
Старый 10.06.2014, 02:17   #8
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Раньше для таких отчетов использовали xlReport, но он перестал поддерживаться, хотя по Сети ходят советы под адаптацию исходников под новые версии Delphi. Если xlReport работает, можно подсмотреть в его исходниках, как он это делает. Если правильно помню, он использовал какой-то хитрый механизм, вроде DDE вместо OLE.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 10.06.2014, 08:08   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И таких отчетов уже много
Ясно... Значит оправданно.
Ну если у тебя одна Делфи норм работает а вторая косячит, то можно только развести руками...
Максимум что тебе посоветую не использовать PasteSpecial(). Переноси данные другими методами. Используй cell. Или range
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.06.2014, 14:47   #10
HJPotter
Новичок
Джуниор
 
Регистрация: 09.06.2014
Сообщений: 5
По умолчанию

Вот так работает (см. ниже), т.е. все параметры должны иметь тип oleVariant.
Причем true и false можно передавать напрямую.
Решение подходит для всех проблемных методов.

vRange2.PasteSpecial(
oleVariant(xlPasteFormats),
oleVariant(xlPasteSpecialOperationN one),
False,
False);
HJPotter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Позднее связывание в COM сервере lexaltd Общие вопросы Delphi 2 01.11.2013 12:32
Excel-Autocad позднее связывание gsg Microsoft Office Excel 6 21.10.2013 16:58
meta-дата и позднее связывание Voipp C# (си шарп) 1 04.07.2013 18:03
Позднее связывание и полиморфизм Delphi iCaesy Помощь студентам 14 09.10.2011 23:55
Позднее связывание _Art_ Общие вопросы C/C++ 1 19.12.2009 12:53