[Makc] |
Отправлено: 04.07.2005, 07:00 |
|
Не зарегистрирован
|
Не могу понять, почему такой нехитрый код вызывает ошибку в третьей строке: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","Лицевая сторона") возвращает нужный лист) Вот цитата из справки VBQUOTE | 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 | Вообще есть очень хороший метод ActivateQUOTE | 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", "Лицевая сторона")) | Тоже выдаёт ошибку "Член группы не найден":
Но я НАШЁЛ наконец способ перелистнуть эту страницу вот таким кодом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'ем — никакой реакции от него не получаешь |
|
[Makc] |
Отправлено: 06.07.2005, 03:35 |
|
Не зарегистрирован
|
перед filename.xls два обратных слеша — один куда-то пропал |
|