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

 
Неверный тип переменной Builder6->Excel, при экспорте проекта из ВСВ5 в ВСВ6
Adam
  Отправлено: 09.11.2005, 16:33


Ученик-кочегар

Группа: Участник
Сообщений: 4



Необходима помощь начинающему программисту.
Потребовалось сделать курсовую на С++Builder6
Сроки ... как всегда, нашел чужие исходники, но на ВСВ5.
Перекомпилил на шестой, даже сторонние компоненты встали (повозился). Все работает кроме :
при попытке вывести отчет в Excel выдается сообщение :
"Неверный тип переменной". Проверил, вроде все правильно,
хотя конечно что-то не правильно, но понять ЧТО, не могу.
Плиз, помогите вот кусок кода :
CODE

TForm1 *Form1;
Variant v;

.....

void toExcelCell(int Row,int Column, AnsiString data)
{
try {
Variant cur = v.OlePropertyGet("Cells", Row,Column);
cur.OlePropertySet("Value", data.c_str());
} catch(...) {; }
}

void __fastcall TForm1::RxSpeedButton6Click(TObject *Sender)
{
int a[22]={12,7,9,9,6,15,5,6,7,6,7,6,5,6,6,6,6,6,6,6,5,40};
int i,j,k=1;

v=Variant::CreateObject("Excel.application");
String Path=ExtractFilePath(Application->ExeName);
v.OlePropertyGet("WorkBooks").OleProcedure("Open",String(Path+"Otchet.xls"));

for (j=0; j<=DBGridEh1->Columns->Count-1; j++)
{
toExcelCell(6,k,DBGridEh1->Columns->Items[j]->Title->Caption);
for (i=1; i<=4; i++)
v.OlePropertyGet("Cells", 6,k).OlePropertyGet("Borders").OlePropertyGet("Item", i).OlePropertySet("LineStyle",9);
v.OlePropertyGet("Columns").OlePropertyGet("Item",k).OlePropertySet("ColumnWidth", a[j]);
k++; };
.....


В пятом все работает, проверял.

Отредактировано Adam — 10/11/2005, 08:39
Adam
Отправлено: 10.11.2005, 08:37


Ученик-кочегар

Группа: Участник
Сообщений: 4



Ну вот, все вперед убежали... sad.gif
Так что, это такой трудный вопрос?
или наоборот, слишком легкий и его игнорируют.
Лююдии, спецыыы, помогите, время поджимает, плииззз.
AVC
Отправлено: 10.11.2005, 10:00


Ветеран

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



QUOTE

В пятом все работает, проверял.

Позвольте вам не поверить (кроме того сам код ...).
Вот код, который действительно работает в пятом
CODE

#include <sysvari.h>
#include <utilcls.h>

void __fastcall toExcelCell(Variant v, int Row,int Column, AnsiString data)
{
try {
  Variant  cur = v.OlePropertyGet("Cells", Row,Column);
  cur.OlePropertySet("Value", data);
} catch(...) {; }
}

void __fastcall TF_Main::Button1Click(TObject *Sender)
{
AnsiString xlsfile = ExtractFilePath(Application->ExeName)+"Otchet.xls";
if (!FileExists(xlsfile)) return;
Variant app    = Variant::CreateObject("Excel.application");
Variant books  = app.   OlePropertyGet("Workbooks");
Variant book   = books. OleFunction("Open", ExtractFilePath(Application->ExeName)+"Otchet.xls");
Variant sheets = book.  OlePropertyGet("Worksheets");
Variant sheet  = sheets.OlePropertyGet("Item",1);

toExcelCell(sheet, 6,1,"aaa");
for (int i(1); i<=4; i++)
{ Variant v = sheet.OlePropertyGet("Cells", 6,1);
  v = v.OlePropertyGet("Borders");
  v = v.OlePropertyGet("Item", i);
  v.OlePropertySet("LineStyle",9);
}

app.OlePropertySet("Visible", true);
}

В какой строке в оригинале "Неверный тип переменной"?
Adam
Отправлено: 10.11.2005, 10:13


Ученик-кочегар

Группа: Участник
Сообщений: 4



В пятом действительно работает, она там и писАлась,
и предприятие, где она работает, не жаловалось.
Сегодня шестого под рукой нет, попробую найти
и исправить как у Вас.
Результат сообщу.
Не забывайте обо мне, плиз!
Спасибо.
avc*
Отправлено: 10.11.2005, 11:17


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







Приношу извинения и спасибо (нашел у себя древнюю ошибку, теперь все будет проще).
Так работает в шестерке
CODE


#include <sysvari.h>
#include <utilcls.h>

void __fastcall toExcelCell(Variant v, int Row,int Column, AnsiString data)
{
try {
  Variant  cur = v.OlePropertyGet("Cells", Row,Column);
  cur.OlePropertySet("Value", WideString(data));
} catch(...) {; }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString xlsfile = ExtractFilePath(Application->ExeName)+"Otchet.xls";
if (!FileExists(xlsfile)) return;
Variant app   = Variant::CreateObject("Excel.application");
Variant sheet = app.OlePropertyGet("Workbooks")
                  .OleFunction("Open", WideString(xlsfile))
                  .OlePropertyGet("Worksheets")
                  .OlePropertyGet("Item",1);

toExcelCell(sheet, 6,1,"aaa");
for (int i(1); i<=4; i++)
sheet.OlePropertyGet("Cells", 6,1).OlePropertyGet("Borders").OlePropertyGet("Item",i).OlePropertySet("LineStyle",9);

app.OlePropertySet("Visible", true);
}

Обработка ошибок и закрытие excel'я за вами.
Adam
Отправлено: 10.11.2005, 16:59


Ученик-кочегар

Группа: Участник
Сообщений: 4



БОЛЬШОЕ СПАСИБО !!!
Разобрался, изменилась... ну это... в OLE... параметры
(не могу пока правильно все называть)
Изменил только свое :

v.OlePropertyGet("WorkBooks").OleProcedure("Open",String(Path+"Otchet.xls"));

С вашей подсказки на :

v.OlePropertyGet("WorkBooks").OleFunction("Open",WideString(Path+"Otchet.xls")).OlePropertyGet("Worksheets").OlePropertyGet("Item",1);

и в принципе все правильно заработало, и не стал
загонять в параметры toExcelCell Variant v
лишнее это по-моему (а может и нет), но не стал.
Спасибо еще раз, терь время еще осталось для марафета.
Еще встретимся надеюсь, я ж — начинающий smile.gif Удачи.

Вернуться в Вопросы программирования в C++Builder