C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Мистическая проблема! Помогите пожалуйста, Происходит ошибка не понятной природы!
[Makc]
  Отправлено: 04.07.2005, 07:00


Не зарегистрирован







ohmy.gif Не могу понять, почему такой нехитрый код вызывает ошибку в третьей строке:
CODE
       OleContainer->Run();
       Variant Range = OleContainer->OleObject.OlePropertyGet("WorkSheets", "Лицевая сторона").OlePropertyGet("Range", "A1:B2");
       Range.OleProcedure("Select");
       OleContainer->Close();
Если вы не знакомы с контейнерами, то этот код эквивалентен нижеследующему, но здесь ошибка будет уже во второй строке:
CODE
       Variant Range = App.OlePropertyGet("WorkSheets", "Лицевая сторона").OlePropertyGet("Range", "A1:B2");
       Range.OleProcedure("Select");
olegenty
Отправлено: 04.07.2005, 07:35


Ветеран

Группа: Модератор
Сообщений: 2412



а как звучит эта ошибка "непонятной природы"?
[Makc]
  Отправлено: 04.07.2005, 08:56


Не зарегистрирован







Более не информативной ошибки и придумать нельзя:
QUOTE
Project Project1.exe raised exception class EOleSysError with message 'Ошибка'.
Вообще говоря этот код задумавался с целью "перелистнуть страницу" в OLE-контейнере. Может это можно сделать проще :huh:
olegenty
Отправлено: 04.07.2005, 10:11


Ветеран

Группа: Модератор
Сообщений: 2412



и нужно сделать проще. посмотри св-во типа "ActiveSheet" да и установи его в нужное значение посредством OlePropertySet
[Makc]
  Отправлено: 04.07.2005, 10:44


Не зарегистрирован







CODE
OleContainer->OleObject.OlePropertySet("ActiveSheet", "Лицевая сторона")
Способ получился бы красивый — но выдаётся ошибка "Член группы не найден". Думаю, что ошибка в том, что это свойство ReadOnly (такой лист точно есть т.к. OlePropertyGet("WorkSheets","Лицевая сторона") возвращает нужный лист) Вот цитата из справки VB
QUOTE
ActiveSheet. Returns an object that represents the active sheet (the sheet on top) in the active workbook or in the specified window or workbook. Returns Nothing if no sheet is active. Read-only
Вообще есть очень хороший метод Activate
QUOTE
Activate. Makes the current sheet the active sheet. Equivalent to clicking the sheet's tab.
Но после его вызова лист не меняется. Возможно дело в том что сервер после работы закрывается, но как же тогда поступать?

Кстати, может Вы знаете как можно сделат невидимыми границы ячеек (как в предпечатном просмотре)?
olegenty
Отправлено: 04.07.2005, 10:53


Ветеран

Группа: Модератор
Сообщений: 2412



да ты туда должен не строку передать "Лицевая сторона", а Variant, содержащий указатель на интерфейс этого листа, что-то типа
CODE

OleContainer->OleObject.OlePropertySet("ActiveSheet", OleContainer->OleObject.OlePropertyGet("WorkSheets", "Лицевая сторона"))
[Makc]
Отправлено: 06.07.2005, 03:32


Не зарегистрирован







CODE
OleContainer->OleObject.OlePropertySet("ActiveSheet", OleContainer->OleObject.OlePropertyGet("WorkSheets", "Лицевая сторона"))
Тоже выдаёт ошибку "Член группы не найден":
Но я НАШЁЛ наконец способ перелистнуть эту страницу smile.gif вот таким кодом
CODE
OleContainer->Run();
OleContainer->OleObject.OlePropertyGet("WorkSheets",Page->Caption.c_str()).OleProcedure("Activate");
OleContainer->DoVerb(ovShow);
OleContainer->Close();
Похоже вся проблема была в том, что страница перелистывалась по вызову Activate, но прорисовки просто не происходило, а глагол ovShow заставляет его всё-таки прорисоваться.
Теперь проблема обстоит совсем в другом: метод OleContainer->SaveAsDocument(GetCurrentDir()+"\filename.xls"); вызываемый сразу после приведённого кода сохраняет файл, FAR-ом даже удаётся просмотреть что там внутри, но когда открываешь этот файл eXcel'ем — никакой реакции от него не получаешь sad.gif
[Makc]
Отправлено: 06.07.2005, 03:35


Не зарегистрирован







перед filename.xls два обратных слеша — один куда-то пропал smile.gif

Вернуться в Технологии COM/DCOM, ActiveX