for (int Row = 0; Row < Grid1->RowCount; Row++)
for (int Col = 0; Col < Grid1->ColCount; Col++)
Sh.OlePropertyGet("Cells", Row + 1, Col + 1).OlePropertySet("Value",Grid1->Cells[Col][Row].c_str());
Проблемы с OLE в Builder XE
Код:
Остальной код не привожу, потому что проблема локализована тут(Зачем захламлять). Если важно, приведу весь код.
Симптомы:
В Excel переносится часть ячейки[0][0](например 3 из 6 символов), а в компиляторе открывается страничка "CPU" с асемблером. Если прыгать дальше стрелочкой "step over", то выдаст ошибку "Project имя faulted with message :'system exception (code 0xc0000374) at 0x771737b7'. Process Stopped. Use Step or Run to continue." Если нажимать дальше "Run", то переносит и другие ячейки, то же частично.
Кстати, пока писал пост, потыкал еще, заметил закономерность - переносит половину ячейки всегда.
Проблема в том, что в XE перешли в Unicode? Подскажите, пожалуйста:)
Цитата: Dreablin
Проблема в том, что в XE перешли в Unicode?
Наиболее вероятно.
Код:
for (int Row = 0; Row < Grid1->RowCount; Row++)
for (int Col = 0; Col < Grid1->ColCount; Col++)
Sh.OlePropertyGet("Cells", Row + 1, Col + 1).OlePropertySet("Value",WideString(Grid1->Cells[Col][Row]));
for (int Col = 0; Col < Grid1->ColCount; Col++)
Sh.OlePropertyGet("Cells", Row + 1, Col + 1).OlePropertySet("Value",WideString(Grid1->Cells[Col][Row]));
Или используй TApplicationExcel (по умолчанию пакет выключен)
Пусть используются символы другой длинны... но функция то должна отдавать всю ячейку...
И если это не так, то выходит эта ( и возможно другие функции из данной библиотеки) нельзя больше использывать - будут вызывать ошибки?
Подключается она заголовком "ole2.h". Возможно есть Ole3?
По поводу TApplicationExcel - яндекс ничего вразумительного не показывает(
Цитата: Dreablin
...
По поводу TApplicationExcel - яндекс ничего вразумительного не показывает(
По поводу TApplicationExcel - яндекс ничего вразумительного не показывает(
Сори попутал - TExcelApplication
Попробуй использоваьт не c_str а w_str (вроде).
Кстати TExcelApplication - компонент в закладке Servers ? у меня его нет.
среда - Embarcadero® C++Builder® XE Version 15.0.3890.34076 (Architect)
Project->Options->Packages там включить офис.
Код:
for (int Row = 0; Row < Grid1->RowCount; Row++)
for (int Col = 0; Col < Grid1->ColCount; Col++)
Sh.OlePropertyGet("Cells", Row + 1, Col + 1).OlePropertySet("Value",((AnsiString)Grid1->Cells[Col][Row]).c_str());
for (int Col = 0; Col < Grid1->ColCount; Col++)
Sh.OlePropertyGet("Cells", Row + 1, Col + 1).OlePropertySet("Value",((AnsiString)Grid1->Cells[Col][Row]).c_str());
Работает.
Сдается мне что с разными версиями RAD Studio и разыми офисами результаты будут разными :)
Но главное принцип понять - новый RAD юзает wchar, а функция принимает char простой. Именно поэтому .w_char и не должен был сработать. Наоборот нужно то приводить к char. В простом, понятном и много лет меня выручающим AnsiString.c_str() я уверен, он вернет то, что надо)
Поэтому что бы и как бы там не хранил RAD в своем Grid, я перевожу это в привычный формат, а оттуда в нужный.
Вообще думаю должно работать на любой версии, если они в ХЕ4 не решат AnsiString сделать intом...
UnicodeString::t_str()
Правда это в 2009-м RAD'е
Правда это в 2009-м RAD'е