Форум » [x]Harbour » OEMTOANSI » Ответить

OEMTOANSI

Avseev1949: Возникла необходимость передать данные в EXCEL Программа консольная HARBOUR база ДОС Для передачи исрользую OLE В начале программы устонавливаю HB_LANG_RU866 HB_CODEPAGE_RU866 HB_LANGESELECT("RU866") HB_SETCODEPAGE("RU866") Просматривается база TBROWSE (перетранслированна из CLIPPER) Формируется таблица EXCEL Таблица формируется нормально Заголовки колонок формирую из заголовок колонок BROWSERa HB_OENTOANSI(oColumn:Header) В таблице EXCEL заголовки колонок выдаются неправильно Проверил oColumn:Header - таблица ДОС Проверил oColumn:Header после перекодировки коды символов не соответсвуют таблице WINDOWS Если в редакторе(FAR) сформировать константу а потом выполнить HB_OENTOANSI(CONST) то преобразует нормально В чем может быть причина.Спасибо

Ответов - 5

Петр: Avseev1949 пишет: Заголовки колонок формирую из заголовок колонок BROWSERa HB_OENTOANSI(oColumn:Header) А если сформировать просто как oColumn:Header?

Avseev1949: Пробовал не помогает Смотрел в иходниках OemToCharBuffA вроде вызов идет к ней. Если не ошибаюсь, но в MSDN ее описания не нашел. может это функция HARBOUR пытался разобраться как это все работает.

Петр: Это функция из user32.dll Маленький пример желательно бы.. Если в редакторе(FAR) сформировать константу а потом выполнить HB_OENTOANSI(CONST) то преобразует нормально Т.е. исходники у вас в CP866? А как вы oColumn:Header устанавливаете ?


Avseev1949: Исходники в CP866 oBrow - Tbrowse OбЪект aColumn - Количество колонок На экран заголоки колонок отображаются нормально For nCol := 1 To Len( aColumn ) oCol := oBrow:GetColumn(aColumn[nCol]) cStr := HB_OEMTOANSI(oCol:Heading) //cStr := oCol:Heading //ДЛЯ ПРОВЕРКИ КОДОВ //uData := STR(ASC(Substr(cStr,1,1))) uData := cStr uData := StrTran( uData, Chr(13)+Chr(10), Chr( 10 ) ) cText += uData + Chr( 9 ) Next БЕЗ HB_OEMTOANSI ВЫДАЕТ КОДЫ ДОС С HB_OEMTOANSI ПЕРЕКОДИРУЕТ НО ПРИ ПЕРЕДАЧЕ В EXCEL МУСОР

Петр: Avseev1949 пишет: БЕЗ HB_OEMTOANSI ВЫДАЕТ КОДЫ ДОС С HB_OEMTOANSI ПЕРЕКОДИРУЕТ НО ПРИ ПЕРЕДАЧЕ В EXCEL МУСОР К сожалению, этот пример не самодостаточный. Проверить как он работает в программе трудно. К тому же у меня возникли вопросы о целесообразности использования промежуточной переменной uData и функции StrTran в цикле. Вот написал по быстрому, исходники в CP866 Все работает нормально. [pre2]REQUEST DBFCDX REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 STATIC s_oBrowse PROCEDURE Main() LOCAL aStruct := { { "CHAR1", "C", 25, 0 }, { "CHAR2", "C", 25, 0 } } // CLEAR SCREEN hb_setCodePage( "RU866" ) dbCreate( "mytest", aStruct, "DBFCDX", .T. , "MYALIAS" ) MYALIAS -> ( dbAppend() ) MYALIAS -> CHAR1 := "Значение #11" MYALIAS -> CHAR2 := "Значение #12" MYALIAS -> ( dbAppend() ) MYALIAS -> CHAR1 := "Значение #13" MYALIAS -> CHAR2 := "Значение #14" MYALIAS -> ( dbCommit() ) s_oBrowse := BrowseCreate() hb_setTermCP( "RU866", "RU1251", .T. ) ExportToExcel() dbCloseAll() dbDrop( "mytest" ) RETURN /** */ STATIC FUNCTION BrowseCreate() LOCAL oB, oC // oB := TBrowseDB( , , , ) oC := TBColumnNew( "Столбец #1", { || MYALIAS -> CHAR1 } ) oB:addColumn( oC ) oC := TBColumnNew( "Столбец #2", { || MYALIAS -> CHAR2 } ) oB:addColumn( oC ) RETURN oB /** */ STATIC PROCEDURE ExportToExcel() LOCAL oExcel, oWorkBook, oAS, nI LOCAL oColumn := s_oBrowse:GetColumn( 1 ) LOCAL cStr := oColumn:Heading IF !hb_isObject( s_oBrowse ) .OR. s_oBrowse:ClassName != "TBROWSE" RETURN ENDIF IF ( oExcel := win_oleCreateObject( "Excel.Application" ) ) != NIL oWorkBook := oExcel:WorkBooks:Add() oAS := oExcel:ActiveSheet() FOR nI := 1 TO s_oBrowse:colCount() oColumn := s_oBrowse:GetColumn( nI ) cStr := oColumn:Heading oAS:Cells( 1, nI ):Value := hb_oemToAnsi( cStr ) NEXT MYALIAS -> ( dbGoTop() ) nI := 3 DO WHILE !Eof() oAS:Cells( nI, 1 ):Value := hb_oemToAnsi( MYALIAS -> CHAR1 ) //? oAS:Cells( nI, 1 ):Value oAS:Cells( nI, 2 ):Value := hb_oemToAnsi( MYALIAS -> CHAR2 ) //? oAS:Cells( nI, 2 ):Value dbSkip( + 1 ); nI++ ENDDO FOR nI := 1 TO s_oBrowse:colCount() oAS:Columns( nI ):AutoFit() NEXT oExcel:Visible := .T. //oExcel:Quit() ELSE Alert( "Error: MS Excel not available. [" + win_oleErrorText() + "]" ) ENDIF [/pre2]



полная версия страницы