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
|
Ну вот, все вперед убежали...
Так что, это такой трудный вопрос?
или наоборот, слишком легкий и его игнорируют.
Лююдии, спецыыы, помогите, время поджимает, плииззз. |
|
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
лишнее это по-моему (а может и нет), но не стал.
Спасибо еще раз, терь время еще осталось для марафета.
Еще встретимся надеюсь, я ж — начинающий Удачи. |
|
|