Форум » GUI » Переход с BCC 5.5 на BCC 5.8 и BCC 7.30 » Ответить

Переход с BCC 5.5 на BCC 5.8 и BCC 7.30

Andrey: Что то непонятки пошли в новом компиляторе. Собираю часть проекта и линкую основную библиотеку. Выдаёт теперь ошибку сборки, а как исправить не знаю: Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland Error: Unresolved external 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::__nullref' referenced from D:\TEMP\TEST\TBRW_TABLE2.LIB|overlay Error: Unresolved external 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::__getRep(unsigned int, unsigned int)' referenced from D:\TEMP\TEST\TBRW_TABLE2.LIB|overlay Error: Unresolved external '__rwstd::__rw_stdexcept_BadAllocException' referenced from D:\TEMP\TEST\TBRW_TABLE2.LIB|overlay Error: Unresolved external '__rwstd::__rw_stdexcept_NoNamedException' referenced from D:\TEMP\TEST\TBRW_TABLE2.LIB|overlay Error: Unresolved external '__rwstd::rwse_OutOfRange' referenced from D:\TEMP\TEST\TBRW_TABLE2.LIB|overlay Error: Unresolved external '__rwstd::except_msg_string::except_msg_string(const char *, ...)' referenced from D:\TEMP\TEST\TBRW_TABLE2.LIB|overlay Error: Unresolved external 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char, std::char_traits<char>, std::allocator<char> >(const char *, const std::allocator<char>&)' referenced from D:\TEMP\TEST\TBRW_TABLE2.LIB|overlay hbmk2[form_Zaivka]: Error: Running linker. 2 Файл overlay.cpp в библиотеке Tbrw_Table2.lib прекрасно работал под BCC 5.51 А в 5.8 что-то конфликтует... Как быть ?

Ответов - 91, стр: 1 2 3 4 5 All

Andrey: Файл error.log невозможно скопировать на форум, если в путях используются русские буквы. Там в имени файла идут сразу кракозябы.... Как от этого избавиться ? Для MSVC ставил в батник так:[pre2] @echo off chcp 65001 echo ------- Assembly MSVC 2017 for 32 bits --------- call "D:\Program Files\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86 ....[/pre2]

PSP: Andrey пишет: Файл error.log невозможно скопировать на форум, если в путях используются русские буквы. Там в имени файла идут сразу кракозябы.... Как от этого избавиться ? И чё, проводник или Far не может открыть эту папку? Уверен?

Andrey: PSP пишет: И чё, проводник или Far не может открыть эту папку? Уверен? Фар открывает, а вот в error.log - сплошные кракозябы ! Вот так это выглядит: Как сделать чтобы вместо кракозяб были русские буквы ? Думаю если сделать другие языки - тоже будут кракозябы...


Andrey: Собрал свой большой проект - иконки (большая часть) перепутаны... Финиш.... На кнопках совершенно другие иконки, блин почему ? BCC 5.5 собирал нормально, если были дубликаты, то дубликаты отбрасывал. Блин... Опять хирургическая правка... У меня ресурсных файлов на 12 Мб - заново их разгребать нужно... Взял в последней версии МиниГуи поменял везде путь MG_BCC=c:\Bcc58 на MG_BCC=c:\Bcc55 Проги собираются нормально, иконки показываются правильно. Единственно когда запрашиваешь компилятор, то показывает: Harbour 3.2.0dev (r1909261630) Borland C++ 5.8.2 (32-bit) Harbour MiniGUI Extended Edition 19.10 (32-bit) Блин, остаюсь пока на BCC 5.5.1 И с лицензией проблема у меня будет тоже. Григорий - оставь библиотеки под BCC 5.5.1 , а кто хочет, пускай на другом работает. Хотя на хХарборе на сайте тоже выложен сейчас 5.8.2 http://www.xharbour.org/index.asp?page=download/windows/required_win А вообще то лучше перейти на MICROSOFT VISUAL STUDIO COMMUNITY 2017 там классная лицензия: https://visualstudio.microsoft.com/ru/license-terms/mlt553321/?rr=https%3A%2F%2Fwww.google.com.sg%2F

Dima: Andrey пишет: Взял в последней версии МиниГуи поменял везде путь MG_BCC=c:\Bcc58 на MG_BCC=c:\Bcc55 Чуйка у меня что версия 58 какая то кривая и взята не понятно где , сборщик ресурсов при запуске выдает такую же версию как в 55 Andrey пишет: Блин, остаюсь пока на BCC 5.5.1 Тоже поправлю "дороги"

Vlad04: Пресобрал с использованием IDE несколько программ на новой версии компилятора . Вроде всЁ работает. В одной программе появилась ошибка в строке SetProperty("DISP_Edit","Cmb_GRYP_SDOR","DisPlayEdit",.f.) Программу не пересобирал с февраля с.г., может ошибка и не связано с Борланд 58, а с изменениями внесенными в Харбоур.

Dima: Andrey пишет: А вообще то лучше перейти на MICROSOFT VISUAL STUDIO COMMUNITY 2017 А там не придется таскать с собой в чумадане доп. DLL от M$ ?

Andrey: Dima пишет: А там не придется таскать с собой в чумадане доп. DLL от M$ ? Нет. Я уже пробовал собирать Tsb_composite-vc17.exe на MSVC (это навороченный бровс, см. у Григория на сайте) Один ехе-ник и всё. Размер примерно одинаков, как и для BCC. Есть мост МиниГуи и C# для MSVC. BCC не поддерживается, так как С-компилятор старый и не по стандарту Си сделан.

Andrey: Фигня какая то получается... Собрал свой проект на сборку 19.10 (Update 1) только на BCC 5.5.1 У юзеров перестала открываться карточка. Прога тупо виснет и всё помогает только "снятие задачи" через Диспетчер задач. Вернул проект на предыдущую сборку, карточка открывается... [pre2]Free Open Source Software: Harbour 3.2.0dev (r1904111533) Free Compiler: Borland C++ 5.5.1 (32-bit) Free Gui library: Harbour MiniGUI Extended Edition 19.08 (32-bit) [/pre2] Беда что-то с BCC 5.8.2. Сборка проекта на BCC 5.8.2 идёт нормально только все иконки у меня в проекте перепутаны !!! Разбираться с этим нет времени, остаюсь на старом BCC 5.5.1. Можно ли получить либы МиниГуи на BCC 5.5.1 ?

Andrey: Что то макрос для базы в новом МиниГуи ( поставил последний 19.10 Update 2 ) перестал работать... Т.е. есть такое выражение cYear := HB_NtoS( YEAR((cAlias)->DateNach) ) cRet := cYear+'г. : ' + (cAlias)->&cPole Если (cAlias)->DateNach == CTOD("") то карточка вешается. В предыдущем Харборе это работало, возвращало " 0г. : " Вывод был через: [pre2] // Простая обработка ошибок bErrHandler := ERRORBLOCK( { | VAR | BREAK( VAR ) } ) BEGIN SEQUENCE // вывод LABEL RECOVER MG_Stop( cMsg , "ОШИБКА!" ) END SEQUENCE ERRORBLOCK( bErrHandler ) [/pre2]

gfilatov2002: Andrey пишет: Можно ли получить либы МиниГуи на BCC 5.5.1 ? Лови http://hmgextended.com/files/MISC/minigui-bcc55.zip

Andrey: Спасибо БОЛЬШОЕ ! Вопрос такой возник. Я пере собрал minigui.lib через C:\MiniGUI\SOURCE\BuildLib.bat Потом пере собрал BuildLib.bat через C:\MiniGUI\SOURCE\TsBrowse\BuildLib.bat Скомпилировал заново (удалил все OBJ) свой проект, но все равно в проекте выдаёт: [pre2]Borland C++ 5.8.2 (32-bit) [/pre2] Почему ? Что ещё нужно пере собрать ?

gfilatov2002: Andrey пишет: Что ещё нужно пере собрать ? Ничего Просто используй Харбор из предыдущей сборки 19.08

Andrey: gfilatov2002 пишет: Просто используй Харбор из предыдущей сборки 19.08 Там нет новых функций для примера MiniGUI\SAMPLES\BASIC\ButtonEx_DynamicMenu

Andrey: gfilatov2002 пишет: Лови http://hmgextended.com/files/MISC/minigui-bcc55.zip Установил эти либы. Скомпилировал заново (удалил все OBJ) свой проект, но все равно в проекте выдаёт: [pre2]Borland C++ 5.8.2 (32-bit) [/pre2] Почему так ?

gfilatov2002: Andrey пишет: Почему так Потому, что используемый для сборки программы Харбор был собран с помощью BCC 5.8.2 Как исправить, я уже написал выше: gfilatov2002 пишет: Просто используй Харбор из предыдущей сборки 19.08

Andrey: gfilatov2002 пишет: Как исправить, я уже написал выше: Блин, не понял с первого раза.... Извиняюсь. Спасибо !

Новичок: В смысле ? Устанавливать hmg-19.10-setup.exe ? или пока на 19.08 посидеть

Andrey: Новичок пишет: Устанавливать hmg-19.10-setup.exe ? или пока на 19.08 посидеть Решать нужно самому ! Andrey пишет: Взял в последней версии МиниГуи поменял везде путь MG_BCC=c:\Bcc58 на MG_BCC=c:\Bcc55 Проги собираются нормально, иконки показываются правильно.

Andrey: Новичок пишет: Устанавливать hmg-19.10-setup.exe ? или пока на 19.08 посидеть Забыл добавить. Пример-заготовка (универсальная менюшка на многие задачи) - папка MiniGUI\SAMPLES\BASIC\ButtonEx_DynamicMenu на версии 19.08 не соберётся....

Andrey: Andrey пишет: Собрал свой большой проект BCC 5.8 - иконки (большая часть) перепутаны... Финиш.... На кнопках совершенно другие иконки, блин почему ? BCC 5.5 собирал нормально, если были дубликаты, то дубликаты отбрасывал. Блин... Опять хирургическая правка... У меня ресурсных файлов на 12 Мб - заново их разгребать нужно... Это писал ещё 26.10.19. Дошли руки до картинок - разгрёб двойные ссылки на ресурсы, ошибок нет. Думал что теперь BCC 5.8 нормально будет показывать иконки... Фиг-вам Опять ерунда, иконки другие вместо нужных. Как исправить данную проблему ? P.S. Кол-во файлов *.rc - 37 штук, объём картинок в ресурсах примерно 19 Мбайт

Andrey: Кол-во файлов *.rc - 37 штук, объём картинок в ресурсах примерно 19 Мбайт Пробую собрать ехе-ник с помощью BCC 5.8 уже на главном меню вместо нужных иконок - показываются другие. Это как то лечится ? Как исправить данную проблему ? Есть более современный и бесплатный компилятор BCC 7.30 (32-bit), можно оттуда взять линковщик ? На сайте xHarbour Required tools for Windows есть же Embarcadero 32-bit BCC 7.40 Compiler (Evaluation Only!) Embarcadero 64-bit BCC 7.30 Compiler (Evaluation Only!) А какая лицензия на BCC 7.40 ? https://www.embarcadero.com/ru/free-tools/ccompiler Не совсем понятно - на сайте пишут Бесплатный компилятор C++ Лицензия на коммерческое использование - Один пользователь ???? Один пользователь на использование моей программы ? Или по другому трактуется ?

PSP: Andrey пишет: Лицензия на коммерческое использование - Один пользователь ???? Один пользователь на использование моей программы ? Или по другому трактуется ? Да пох! Параллельный импорт!))

Haz: На сколько я помню во всех версиях компилятор ресурсов 1 и тот же Скорее всего, проблема именно в нем. Рекомендую. Заменить brc на другой.

gfilatov2002: Andrey пишет: Один пользователь на использование моей программы ? Пользователь в данном контексте означает разработчик программы (т.е. можно свободно использовать компилятор одним разработчиком). Вот его определение в файле лицензии: [pre](c) "Customer" means the person installing or using the Licensed Material or for whose benefit the Licensed Material is being installed or used. [/pre]

Andrey: PSP пишет: Да пох! Параллельный импорт!)) gfilatov2002 пишет: (т.е. можно свободно использовать компилятор одним разработчиком). Тогда это классно ! Какое решение будет по переходу МиниГуи на новый компилятор ? Когда ждать то ?

gfilatov2002: Andrey пишет: Какое решение будет по переходу МиниГуи на новый компилятор ? Если будет интерес и поддержка такого перехода от пользователей библиотеки, то хоть завтра Ниже приведено содержание готового sfx архива с избранными (не всеми) примерами: [pre]------------------------------------------------------------- Minigui Ex Package (build date: 28.05.2023) ------------------------------------------------------------- Components versions: -------------------- Harbour MiniGUI Extended Edition 23.04 (Update 2) Harbour 3.2.0dev (r2305191429) Harbour Make (hbmk2) 3.2.0dev (r2023-05-19 14:29) Embarcadero C++ 7.30 for Win32 Copyright (c) 2012-2017 Embarcadero Technologies, Inc. [/pre]

Andrey: Народ, отзовитесь ! Кому интересен переход на Embarcadero C++ 7.30 ?

Haz: Andrey пишет: Народ, отзовитесь ! Кому интересен переход на Потенциально интересен, но пока не понимаю что это дает кроме циферек. Как показывает практика, новые циферки не только решают часть старых проблем, но часто приносят новые.

gfilatov2002: Haz пишет: пока не понимаю что это дает Согласен, поэтому и не торопился с обновлением, но время то идет... Кстати, есть один нюанс: вам НЕ удастся собрать Харбор для этого компилятора стандартным образом из-за проблем с библиотекой кодировки. Поэтому я применяю специальный режим сборки, а затем пересобираю утилиту hbmk2 с использованием исправленной библиотеки кодировки.

Andrey: Haz пишет: Потенциально интересен, но пока не понимаю что это дает кроме циферек. Одну проблему решает. Заменил в BCC 5.8 всё кроме bcc32.exe brc32.exe brcc32.exe cpp32.exe Т.е. записал новые версии Embarcadero Implib Version 3.4.0 Copyright (c) 1991-2016 Embarcadero Technologies, Inc. Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc. И о чудо... Иконки на кнопках правильные !!!

Andrey: Вторая проблема. Григорий, что мне делать ? Прога собирается на версии 23.04 (Update 2) с родным BCC 5.8 Compiler: Borland C++ 5.8.2 (32-bit) Харбор - Version: 3.2.0dev (r2305191429) - родной Built on: May 20 2023 Last ChangeLog entry: 2023-05-19 16:29 UTC+0200 Przemyslaw Czerpak ChangeLog ID: bed7485bc7df1a6d7545e867dc332269d1f75d85 Вылет идёт сразу при старте программы !!! Time from start: 0 days 0 hours 0 mins 1 secs Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA --------------------------------- Stack Trace --------------------------------- Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(181) in module: Source\main.prg ----------------------------- System Information ------------------------------ Available memory...: 9179 MB Current disk.......: W Free disk space....: 860383 MB Operating system...: Windows 10 10.0 MiniGUI version....: Harbour MiniGUI Extended Edition 23.04.2 (32-bit) ANSI Harbour version....: Harbour 3.2.0dev (r2305191429) Harbour built on...: May 20 2023 10:05:07 C/C++ compiler.....: Borland C++ 5.8.2 (32-bit) Multi Threading....: YES VM Optimization....: YES Если прогу собираею на версии 23.04 (Update 2) с родным BCC 5.8 Compiler: Borland C++ 5.8.2 (32-bit) Харбор - Version: 3.2.0dev (r2301231146) - взял с версии минигуи от 23.01 (Release) Built on: Jan 23 2023 Last ChangeLog entry: 2023-01-23 12:46 UTC+0100 Przemyslaw Czerpak ChangeLog ID: a6a86c100291b3ed33a2a0a680f0e5a17d627ce0 Вылета из программы НЕТ, работает отлично !!! Строка кода где вылетает вообще НЕПОНЯТКА ![pre2] WITH OBJECT This.Object ..... //!!! общее событие для вызова из других программ :Event(111, {|ow,ky,cdata| cdata := hb_defaultValue(cdata, "") _logfile(.t.,"----[ Событие 111 ]--- " + ProcNL() ) _logfile(.t.," ow=",ow,"xPar=",ky,"cdata=",cdata ) _logfile(.t.," ow:Name",ow:Name,"ow:Handle",ow:Handle ) OnWmCopyData(cData) Return Nil }) строка 181 .... [/pre2]

SergKis: Andrey Попробуй без конструкции WITH ... END WITH, т.е. все :Event(...) через переменную [pre2] o := This.Object ... o:Event(...) ... o:Event(111, {|ow,ky,cdata| cdata := hb_defaultValue(cdata, "") _logfile(.t.,"----[ Событие 111 ]--- " + ProcNL() ) _logfile(.t.," ow=",ow,"xPar=",ky,"cdata=",cdata ) _logfile(.t.," ow:Name",ow:Name,"ow:Handle",ow:Handle ) OnWmCopyData(cData) Return Nil }) [/pre2] ...

Andrey: SergKis пишет: Попробуй без конструкции WITH ... END WITH, т.е. все :Event(...) через переменную Нет, так же падает прога...

SergKis: Andrey пишет Попробуй ф-ю, перед строкой снятия, из примера, для объекта переменной o (TWNDDATA) [pre2] ////////////////////////////////////////////////////////////////////////////////// FUNCTION myDebugVar(oWnd,ky,xv) // variable output LOCAL cLog, cObj, cMsg, o, a, ob, nI, nJ, a2Dim, aName, aData, nPost := ky LOCAL aTmp, cTmp, xTmp, lTmp cObj := UPPER(xv) IF cObj == "BUTTON_1" cLog := GetStartUpFolder() + "\_msg.App-Cargo.log" DELETEFILE(cLog) _SetGetLogFile( cLog ) // new log file output name cMsg := " App.Cargo:" ? ProcNL(), "oWnd:Name =", oWnd:Name, oWnd,ky,xv ? " Объект App.Cargo доступен всегда в любом месте программы" ? " The App.Cargo object is always available anywhere in the program" o := App.Cargo ELSE cLog := GetStartUpFolder() + "\_msg.oWnd-Cargo.log" DELETEFILE(cLog) _SetGetLogFile( cLog ) // new log file output name cMsg := " oWnd:Cargo:" ? ProcNL(), "oWnd:Name =", oWnd:Name, oWnd,ky,xv ? " Объект окна доступен через переменную oWnd в функции или через App.Cargo:oWindow" ? " В данном случае App.Cargo:oWindow это главное окно этой программы" ? " The window object is available through the oWnd variable in the function or through App.Cargo:oWindow" ? " In this case, App.Cargo:oWindow is the main window of this program" o := oWnd:Cargo // we take data from the button that we put earlier ENDIF ? Repl("-",LINE_FILL) a2Dim := o:GetAll() // get an array with a key /*FOR nI := 1 TO Len(a2Dim) // this is a list of ALL keys and their values ? cMsg, nI, "Key =", a2Dim[nI][1], "Val =" IF VALTYPE(a2Dim[nI][2]) == "A" ?? HB_ValToExp(a2Dim[nI][2]) ELSEIF VALTYPE(a2Dim[nI][2]) == "C" ?? AtRepl( CRLF, a2Dim[nI][2], " | " ) ELSE ?? a2Dim[nI][2] ENDIF NEXT */ FOR EACH a IN a2Dim nI := hb_EnumIndex( a ) ? cMsg, nI, "Key =", a[1], "Val =" IF hb_IsArray(a[2]) IF Len(a[2]) > 0 .and. hb_IsArray(a[2][1]) ?? a[2] , " = {" FOR nJ := 1 TO LEN(a[2]) ?? HB_ValToExp(a[2][nJ]) + IIF( nJ==LEN(a[2]), "", "," ) NEXT ?? "}" ELSE ?? HB_ValToExp(a[2]) ENDIF ELSEIF hb_IsChar(a[2]) ?? AtRepl( CRLF, a[2], " | " ) ELSEIF hb_IsObject(a[2]) ob := a[2] ?? ob ?? ob:ClassName IF ob:ClassName $ "THMGDATA,TKEYDATA,TTHRDATA" // контейнеры ?? ob:GetAll() ; ?v ob:GetAll() ; ? ELSEIF ob:ClassName == "TSBROWSE" ?? ob:cParentWnd, ob:cControlName, ob:cAlias, ob:nLen aName := __objGetMethodList( ob ) //? HB_ValToExp(aName) ELSEIF ob:ClassName $ "TCNLDATA,TGETDATA,TSTBDATA,TTSBDATA" // контролы ?? ob:Name, ob:Type, ob:Index, ob:Handle ELSEIF ob:ClassName $ "TINIDATA" // ini file // см. примеры там вывод секций и их переменных ?? ob:cIni, ob:lIni, ob:lUtf8 ELSEIF ob:ClassName $ "TWNDDATA" // окно формы ?? ob:Name ?? ob:GETLISTTYPE() , HB_ValToExp( ob:GETLISTTYPE() ) ?? ob:CLIENTWIDTH, ob:CLIENTHEIGHT ? space(5) + "VARIABLE:" aName := __objGetMsgList( ob, .T., 2 ) aTmp := {} FOR nJ := 1 TO LEN(aName) ? SPACE(5) + ob:Name + ":" + a[1], Hb_NtoS(nJ), aName[nJ] lTmp := .F. cTmp := aName[nJ] xTmp := "protected" BEGIN SEQUENCE WITH {|e| break( e ) } xTmp := __objSendMsg( ob, cTmp ) lTmp := .T. END SEQUENCE IF lTmp // доступ есть AAdd(aTmp, {cTmp, xTmp}) ENDIF ?? "=", xTmp NEXT ? ? space(5) + "METHOD:" aName := __objGetMsgList( ob, .F. ) FOR nJ := 1 TO LEN(aName) ? SPACE(5) + ob:Name + ":" + a[1], Hb_NtoS(nJ), aName[nJ] NEXT //? //? space(5) + "!!! aVariable =", hb_valtoexp(aTmp) ? ? space(5) + "*** aVariable : {" FOR nI := 1 TO LEN(aTmp) ? " >", nI, aTmp[nI][1]+" =", HB_ValToExp(aTmp[nI][2]) NEXT ? " }" ? ELSE // TWNDDATA 'O' - окно формы // здесь только ф-ями про объекты из "Harbour для начинающих" на сайте А.Кресина aName := __objGetMethodList( ob ) //aData := __objGetValueList( ob, [aExcept] ) //aData := __objGetValueList( ob ) ? HB_ValToExp(aName) ? HB_ValToExp(aData) ? ob:CLIENTWIDTH, ob:CLIENTHEIGHT ? ob:GETLISTTYPE() ; ?v ob:GETLISTTYPE() ENDIF ELSE ?? a[2] ENDIF NEXT ? "..." cMsg := HB_MemoRead(cLog) AlertInfo(cMsg, "log file - " + cLog ) _SetGetLogFile( App.Cargo:cLog ) // вернём главное имя вывода лог-файла RETURN NIL [/pre2] убери AlertInfo и может модифицируй под ситуацию

Andrey: Сделал так: o := This.Object myDebugVar(o,"ky","xv") Лог положил к тебе...

SergKis: Andrey пишет Сделал так: o := This.Object myDebugVar(o,"ky","xv") Добавь o := This.Object This.Cargo := o myDebugVar(o,"ky","xv") т.к. This.Cargo у тебя не определен (Cargo окна) и валится на o := oWnd:Cargo // we take data from the button that we put earlier ? Repl("-",90) a2Dim := o:GetAll() // get an array with a key

SergKis: Andrey Был не прав, поторопился, надо не This.Cargo := o, а This.Cargo := oHmgData() This.Cargo:oMain := o

Andrey: Developed in : Harbour MiniGUI Extended Edition 23.04.3 (32-bit) ANSI xBase Compiler: Harbour 3.2.0dev (r2305191429) C Compiler: LLVM/Clang C 3.3.1 (36350.30c6854.779bede) (32-bit) Григорий, а почему такое странное наименование компилятора ? А где название Embarcadero C++ 7.30 ? Пока только победил сборку своего проекта.... Иконки все на месте, прога запускается сразу без сбоев. На на версии 23.04 (Update 2) с родным BCC 5.8 Compiler: Borland C++ 5.8.2 (32-bit) Харбор - Version: 3.2.0dev (r2305191429) - родной Вылет идёт сразу при старте программы !!! И ещё вот это непонятно при сборке:[pre2] C:\BCC102\Include\windows\sdk\imm.h:217:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma endregion ^ C:\BCC102\Include\windows\sdk\imm.h:225:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma region Desktop Family ^ C:\BCC102\Include\windows\sdk\imm.h:434:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma endregion ^ In file included from Source\overlay.cpp:8: C:\BCC102\Include\windows\sdk\windows.h:310:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma endregion ^ 1734 warnings generated. Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.[/pre2]

gfilatov2002: Andrey пишет: почему такое странное наименование компилятора ? А где название Embarcadero C++ 7.30 ? используй вместо функции hb_compiler() новую функцию hb_Ccompiler()

Dima: Andrey MINGW не пробовал ?

Andrey: Dima пишет: MINGW не пробовал ? Под него не было (может сейчас есть) библиотек и примеров средств защиты ключей HASP. Получаемый ехе-ник собирается BCC и lib от HASP (сейчас это продукт фирмы Sentinel HL HASP Gemalto) https://www.euromobile.ru/produkciya/aparatnje_kluchi_sentinel_hl_hasp-gemalto/ Есть ещё библиотеки от MS, но тоже пока руки не дошли.

Dima: Да , я забыл что у тебя Hasp...

Andrey: gfilatov2002 пишет: используй вместо функции hb_compiler() новую функцию hb_Ccompiler() А как предусмотреть использование этих разных функций для разных компиляторов BCC ? [pre2]IF version_BCC < ???? cVerBcc := hb_compiler() ELSE cVerBcc := hb_Ccompiler() ENDIF[/pre2]

gfilatov2002: Andrey пишет: как предусмотреть использование этих разных функций для разных компиляторов BCC ? Это - псевдо-функция, и она уже учитывает эту разницу

Dima: New: Added the useful pseudo-function hb_Ccompiler() for more accurate detection of the Borland/Embarcadero C++ compiler version. Перевод Добавлена ​​полезная псевдофункция hb_Ccompiler() для более точного определение версии компилятора Borland/Embarcadero C++.

Dima: gfilatov2002 Опередил ))

Andrey: Непонятки при сборке вместе с готовой своей my.lib Собрал my.lib новым компилятором, добавил в проект где использую. Не собирается зараза, выдаёт вот такое... [pre2]..... OBJ\use_LetoDb.c: OBJ\use_Postgres.c: OBJ\InetState.c: In file included from InetState.prg:162: C:\BCC102\Include\windows\sdk\windows.h:42:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma region Application Family or OneCore Family ^ In file included from InetState.prg:162: In file included from C:\BCC102\Include\windows\sdk\windows.h:199: In file included from C:\BCC102\Include\windows\sdk\windef.h:25: In file included from C:\BCC102\Include\windows\sdk\minwindef.h:15: In file included from C:\BCC102\Include\windows\sdk\specstrings.h:62: C:\BCC102\Include\windows\sdk\sal.h:718:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma region Input Buffer SAL 1 compatibility macros ^ C:\BCC102\Include\windows\sdk\sal.h:1482:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma endregion Input Buffer SAL 1 compatibility macros ^ In file included from InetState.prg:162: In file included from C:\BCC102\Include\windows\sdk\windows.h:199: In file included from C:\BCC102\Include\windows\sdk\windef.h:25: C:\BCC102\Include\windows\sdk\minwindef.h:19:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma region Application Family or OneCore Family ^ In file included from InetState.prg:162: [/pre2]... куча всего такого же и в конце вот это: [pre2]In file included from InetState.prg:162: C:\BCC102\Include\windows\sdk\windows.h:310:9: warning: unknown pragma ignored [-Wunknown-pragmas] #pragma endregion ^ 1761 warnings generated. OBJ\IniGetSetConfig.c: OBJ\table_f8dogExpSite.c: OBJ\_hbmkaut_1main.c: Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc. Fatal: Unable to open file '???E.OBJ' кракозябы hbmk2[2transfer_db]: Error: Running linker. 2[/pre2] Модуль - InetState.prg:162: исправленный \SAMPLES\Advanced\INET_CHECKER\InetState.prg[pre2] #pragma BEGINDUMP #include <windows.h> // строка 162 #include "hbapi.h" /***************************************************************************************** * MACRO DEFINITION FOR CALL DLL FUNCTION ******************************************************************************************/[/pre2] Как быть ?

SergKis: Andrey пишет Собрал my.lib новым компилятором, добавил в проект где использую. Если бы наоборот, то может быть и зашло. Я использовал lib собранную Bcc5.5 на hb 2.0 (лень переносить проект и отладку делать) в MiniGui с Bcc5.5 и с Bcc5.8 (hb из версии) - все ok!, правда использовал из lib только C ф-ии HB_FUNC (...) PS Lib из Bcc в сборках с msvc не использовал. Согласовывать тексты C из Bcc для msvc, для меня не подъемно, делал товарищ

SergKis: PS2 Попробуй в старом проекте выделить работу с каким то справочником (все собрано в одном prg, например) и получить hrb файл. В новом проекте подключить и запустить его работу. Hrb получать не ф-ей, а через hbmk2. Все внешние ф-ии подключи по REQUEST, какие то переведи в STATIC FUNCTION, даже если они будут дублироваться с др. STATIC FUNCTION в др. PRG

Andrey: Bcc5.5 и Bcc 5.8 и 7.30 сильно отличаются. OBJ собранные на 5.5/8 не собираются в 7.30 Да и между собой 5.5 и 5.8 не особо дружат... Я всегда удаляю OBJ и собираю проект с чистого листа. Методом тыка определил, что русские буквы в названии папок и файлов НЕ ДОПУСКАЮТСЯ если в проект добавляешь свою библиотеку! Если полностью исходники, то собирается и с русскими буквами. Убрал русские буквы и мой проект собрался нормально.

Andrey: А как в коде программы сделать проверку версий BCC ? Чтобы можно код под разными BCC собирать.

gfilatov2002: Andrey пишет: как в коде программы сделать проверку версий BCC ? Например, как в программе ниже использовать функцию BorlandVersion() [pre2] #include "hmg.ch" Function Main MsgDebug(BorlandVersion()) Return Nil function BorlandVersion() local cHexVer := hb_NumToHex( BorlandC() ) return SubStr( cHexVer, 1, 1 ) + "." + SubStr( cHexVer, 2 ) #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( BORLANDC ) { #ifdef __BORLANDC__ hb_retnl( __BORLANDC__ ); #else hb_retnl( 0 ); #endif } #pragma ENDDUMP [/pre2]

Andrey: Не совсем то... Но это тоже нужно ! Спасибо !!! Вот в коде нужно компилировать строки в зависимости от компилятора:[pre2] #define FR_PRIVATE 0x10 #define FR_NOT_ENUM 0x20 #include "minigui.ch" #include "hbdyn.ch" .... *-----------------------------------------------------------------------------* // для ВСС 5.5 Function AddFont(cFontFile) Return AddFontResourceEx( cFontFile, FR_PRIVATE+FR_NOT_ENUM, 0 ) Function RemoveFont(cFontFile) Return RemoveFontResourceEx( cFontFile, FR_PRIVATE+FR_NOT_ENUM, 0 ) DECLARE DLL_TYPE_INT AddFontResourceEx ( DLL_TYPE_LPCTSTR lpszFilename, DLL_TYPE_DWORD flag, DLL_TYPE_LPVOID pdv ) IN GDI32.DLL DECLARE DLL_TYPE_BOOL RemoveFontResourceEx ( DLL_TYPE_LPCTSTR lpFileName, DLL_TYPE_DWORD flag, DLL_TYPE_LPVOID pdv ) IN GDI32.DLL *-----------------------------------------------------------------------------* // ВСС 7.30 не поддерживает дополнительную библиотеку dll.lib //Поэтому этот код должен быть переписан с использованием библиотеки calldll Function AddFont(cFontFile) Return HMG_CallDLL ("GDI32.DLL", HB_DYN_CTYPE_INT, "AddFontResourceEx", cFontFile, FR_PRIVATE+FR_NOT_ENUM, 0) Function RemoveFont(cFontFile) Return HMG_CallDLL ("GDI32.DLL", HB_DYN_CTYPE_BOOL, "RemoveFontResourceEx", cFontFile, FR_PRIVATE+FR_NOT_ENUM, 0)[/pre2]

Andrey: По тестировал новый компилятор BCC 7.30 с MiniGUI Extended Edition 23.01.0 (32-bit) ANSI Всё в программе работает штатно, даже избавился от повисания программы (ошибка пропадания окна/то есть, то нет) ! Что понравилось: 1) Собирает ресурсы правильно (мои 20Мб картинок и иконок показывает в программе правильно) 2) Собранный ехе-ник работает шутрее чем на BCC 5.8 (индексация, создание объектов) 3) Быстрей собирается ехе-ник после правки одного-двух модулей, буквально собирается за несколько секунд. у меня ехе-ник весит 26 мб Какие недостатки - кракозябы в ошибках, вот экран: Это можно как то исправить ? Григорий, а пускай ошибки на английском ВСЕГДА пишутся. Это Будет лучше кракозябов ! Всё, остаюсь на новом BCC 7.30 ! Спасибо БОЛЬШОЕ Григорий !

gfilatov2002: Andrey пишет: ошибки на английском ВСЕГДА пишутся Да, это возможно сделать. Andrey пишет: Спасибо БОЛЬШОЕ Григорий Был рад помочь!

i3t4j6: Andrey пишет: Всё, остаюсь на новом BCC 7.30 ! Где его можно взять ?

Andrey: i3t4j6 пишет: Где его можно взять ? У Григория !

Andrey: Григорий, а как написать правильно в ресурсном файле для BCC 7.30 ? А то когда по ехе-нику свойство смотришь или в Менеджере задач, там кракозябы видны и нет по русскому имени программы. До этого стояло у меня так:[pre2] ... VALUE "ProductName", "Моя программа\000" VALUE "ProductVersion", "5.хх\000" VALUE "Comments", "Создано Мною <xxxx@gmail.com>\000" } } BLOCK "VarFileInfo" { VALUE "Translation", 0x0419 0x04E3 }[/pre2]

gfilatov2002: Andrey пишет: нет по русскому имени программы Для получения русских букв в имени программы надо заменить два файла в папке \BCC102\bin\ на аналогичные файлы из поставки ВСС 5.5: - brcc32.exe - rw32core.dll Проверено - работает

Andrey: Спасибо !

Andrey: Что-то сбоит в новой версии BCC 7.30 с MiniGUI Extended Edition 23.01.0 Вызываю окно MODAL (1), далее MODAL (2), далее MODAL (3). Делаю закрытие MODAL (3) и попадаю сразу в MODAL (1) .... Соответственно закрываю MODAL (1) и получаю ошибку - нет такой переменной на окне MODAL (2) Конечно НЕТ - нарушена очередность возвращения окон. Как это лечиться ? В 5.8 этого не было !!!

Andrey: Блин, вообще беда с окнами MODAL - теряются окна, нет правильного возврата из окон. Во всей проге такая же фигня...

Andrey: Создаю новую пробную сборку для своей проги. Для тестирования и возврата работоспособности своей проги. BCC 5.8 использовать не могу, иконки в проге другие становятся. Как для Минигуи 22.12 (Update 2) добавить в исходники команду от MiniGUI 23.04.4 [pre2]SET WINDOW MODAL PARENT HANDLE ON ? [/pre2] Ну и что там есть нужное и хорошее в 23.04.4 ? Харбор последний с февраля тоже не могу взять к себе в проект - ехе-ник просто не запускается... Пробовал поставить BCC 5.5 в MiniGUI-23.04.4 - не собирается, выдаёт ошибку компиляции: [pre2]Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external 'SwitchToThisWindow' referenced from C:\MINIGUI-23.04.4\LIB\MINIGUI.LIB|c_windowsAPI hbmk2[Ab4winDebug]: Error: Running linker. 2[/pre2] Это можно как то победить ?

SergKis: Andrey пишет Как для Минигуи 22.12 (Update 2) добавить в исходники команду от MiniGUI 23.04.4 SET WINDOW MODAL PARENT HANDLE ON Добавь в h_windows.prg [pre2] ... FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... _HMG_InplaceParentHandle := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() ) IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ... [/pre2]

Andrey: Не собирается. Ошибка на команде: SET WINDOW MODAL PARENT HANDLE ON [pre2]Source\main.prg(293) Error E0030 Syntax error "syntax error at 'WINDOW'" 1 error No code generated. hbmk2[Ab4winDebug]: Error: Running Harbour compiler (built-in). 1 [/pre2]

SergKis: Andrey SET WINDOW MODAL PARENT HANDLE ON ставить не надо - это команда препроцессора, изменение в h_windows.prg предполагает, что команда стоит всегда

Andrey: Понял, спасибо ! Всё равно не собирается, нехватка кучи функций... Добавил h_windows.prg к себе в проект - собралось. Ошибки такие же идут... Вешается прога и всё тут... Раньше вешалась на MODAL(3) - возврат на MODAL(2), теперь чуть больше MODAL(4) - возврат на MODAL(3) Т.е. при возврате с окна MODAL(4) на предыдущее окно, это окно есть на экране (благодаря функции To_Focus() ), а кнопки НЕДОСТУПНЫ ! Нажимает Esc - окно закрывается, второй вход в это же окно и о НЕ МОЖЕТ быть при возврате окно не вешается... При первом входе на 4,5 MODAL это происходит всегда !!! Как быть ? Юзера стонут... Раньше, в начале года такого не было...

Andrey: Разобрался я как бороться с зависанием. Но это так себе решение наверное. Везде в программе на окнах MODAL(2) (3) и т.д. нужно делать такой финт ! [pre2] DEFINE WINDOW ... ; ON INIT {|| myOnInitFSeek(...),; This.Get_Zero.Setfocus, _PushKey(VK_0), This.Buff.Setfocus } ; @ 0, 0 LABEL Buff VALUE "" ... INVISIBLE @ 10, 10 GETBOX Get_Zero VALUE "+" ... INVISIBLE @ nRow, nCol BUTTONEX Button_S1 .... ACTION {|nBtn| nBtn := 1, This.Enabled := .F., DoEvents(), _wPost(11, This.Index, {nBtn, This.Name}) } (This.Object):Event(11,{|obtn,ky,abtn| // объект,event,параметр получаем Local ow, cw, cn, lbtn, lwnd, aRet, nRet, cRet, aForm, hWnd Local nButton := abtn[1] // nButton Local cButton := aBtn[2] // This.Name lbtn := obtn:IsControl // переменная контрол\окно .T.\.F. lwnd := obtn:IsWindow // переменная окно\контрол .T.\.F. ow := obtn:Window // если lbtn == .T. окно берем так cw := ow:Name // аналог ThisWindow.Name cn := obtn:Name // аналог This.Name ? " === Start = :Event(11)", ProcNL() ? " === ", abtn, "abtn=", nButton, cButton, "Event - ky=", ky ? " === ", obtn:ClassName, lbtn, lwnd, cw, cn ? " === @", cw, _IsWindowActive(cw), _IsWindowDefined(cw), cn, _IsControlDefined(cn, cw) Darken2Open(ow:Handle) // затенение на окно This.Get_Zero.Setfocus ; _PushKey(VK_1) aRet := ButtonSpavki(aDim,nButton,cw) // вызов другого MODAL(3) IF ! To_Focus(cw, cn) AlertStop("Window not found ! " + cw, "ERROR") ENDIF Darken2Close(ow:Handle) // убрать затенение с окна This.Get_Zero.Setfocus ; _PushKey(VK_2) DO EVENTS .... IF _IsWindowDefined(cw) SET WINDOW THIS TO cw SetProperty( cw, cn, "Caption", cRet ) ? " === ThisWindow =", cw, ThisWindow.Name ? " === This =", cn, This.Name This.&(cn).Enabled := .T. // разблокировка кнопки This.Label_Buff.SetFocus() SET WINDOW THIS TO ELSE ? "==== *** ERROR *** WINDOW ["+cw+"] not found ! " ENDIF ? " === End = :Event(11)" ; ? " ..." Return Nil } ) (This.Object):Event(99, {|ow| _logfile(.t., ":Event(99)" + ProcNL(), ow:Name, _IsWindowDefined(ow:Name) ) ,; ow:Release() } ) END WINDOW[/pre2] И почему так с MODAL окнами происходит ? Причем последнее MODAL окно чаще всего с ТСБ ! Можно как то глобально вылечить ?

SergKis: Andrey пишет Можно как то глобально вылечить ? Убери окно Darken2Open(...), Darken2Close(...)

Andrey: Убрал. Некоторые глюки пропали, но другие не лечатся !

gfilatov2002: Andrey пишет: Пробовал поставить BCC 5.5 в MiniGUI-23.04.4 - не собирается, выдаёт ошибку компиляции: Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external 'SwitchToThisWindow' referenced from C:\MINIGUI-23.04.4\LIB\MINIGUI.LIB|c_windowsAPI hbmk2[Ab4winDebug]: Error: Running linker. 2 Это можно как то победить ? Благодарю за сообщение! Это будет исправлено в следующей сборке библиотеки

Andrey: Спасибо ! Буду ждать ! Есть ли какой отладчик посмотреть почему фокус на окне, а ввода на окне нет ? Т.е. висит окно, кнопки не работают, GETBOX не работает, горячие клавиши не работают F1, F2 Только ESC позволяет выйти из окна.

Andrey: После перехода на BCC 5.8 появились предупреждения. Помогите убрать их. Вот такое есть: [pre2]OBJ\util_MiniGui.c: Warning W8017 C:\MiniGUI-23.07\include\mgdefs.h 102: Redefinition of 'HB_STORC' is not identical + Full parser context + Source\\util_MiniGui.prg, line 1117: #include C:\MiniGUI-23.07\include\mgdefs.h мой код ------- #pragma BEGINDUMP #include <mgdefs.h> // строка 1117 #include <commctrl.h> #include "hbdate.h" HB_FUNC( DTP_SETDT ) { HWND hwnd; SYSTEMTIME sysTime; hwnd = ( HWND ) HB_PARNL( 1 ); if( HB_ISDATETIME( 2 ) ) { int iYear, iMonth, iDay, iHour, iMinute, iSecond, iMSec; hb_timeStampUnpack( hb_partd( 2 ), &iYear, &iMonth, &iDay, &iHour, &iMinute, &iSecond, &iMSec ); sysTime.wYear = ( WORD ) iYear; sysTime.wMonth = ( WORD ) iMonth; sysTime.wDay = ( WORD ) iDay; sysTime.wDayOfWeek = 0; sysTime.wHour = ( WORD ) iHour; sysTime.wMinute = ( WORD ) iMinute; sysTime.wSecond = ( WORD ) iSecond; sysTime.wMilliseconds = ( WORD ) iMSec; } else if( HB_ISDATE( 2 ) ) { //TODO } else { sysTime.wYear = ( WORD ) hb_parnidef( 2, 2005 ); sysTime.wMonth = ( WORD ) hb_parnidef( 3, 1 ); sysTime.wDay = ( WORD ) hb_parnidef( 4, 1 ); sysTime.wDayOfWeek = 0; if( hb_pcount() >= 7 ) { sysTime.wHour = ( WORD ) hb_parni( 5 ); sysTime.wMinute = ( WORD ) hb_parni( 6 ); sysTime.wSecond = ( WORD ) hb_parni( 7 ); sysTime.wMilliseconds = ( WORD ) hb_parni( 8 ); } else { sysTime.wHour = 0; sysTime.wMinute = 0; sysTime.wSecond = 0; sysTime.wMilliseconds = 0; } } SendMessage( hwnd, DTM_SETSYSTEMTIME, GDT_VALID, ( LPARAM ) &sysTime ); }[/pre2] Или вот ещё такое: [pre2]OBJ\menu_Achoice.c: Warning W8084 Source\\menu_Achoice.prg 361: Suggest parentheses to clarify precedence in function B_FUN_LISTVIEWAPPROXIMATEVIEWRECT ---- Вот код: #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include <commctrl.h> #define HB_STORNI( n, x, y ) hb_storvni( n, x, y ) // BAA HB_FUNC( LISTVIEWAPPROXIMATEVIEWRECT ) { int iCount = hb_parni(2); DWORD Rc; Rc = ListView_ApproximateViewRect( ( HWND ) hb_parnl(1), -1, -1, iCount); // строка 361 hb_reta( 2 ); HB_STORNI( LOWORD(Rc), -1, 1 ); HB_STORNI( HIWORD(Rc), -1, 2 ); } #pragma ENDDUMP[/pre2] Вот ещё такое: [pre2]OBJ\util_c_code.c: Warning W8084 Source\\util_c_code.prg 109: Suggest parentheses to clarify precedence in function hb_Ping2[/pre2] Вот код: [pre2]#pragma BEGINDUMP #include <hbapi.h> #include <winsock2.h> #include <iphlpapi.h> #include <icmpapi.h> int hb_Ping2( const char * cp ) { HANDLE hIcmpFile; unsigned long ipaddr = INADDR_NONE; // corrected by KDJ DWORD dwRetVal; char SendData[32] = "Data Buffer"; LPVOID ReplyBuffer; DWORD ReplySize; if( isalpha( cp[0] ) ) //host address is a name { WSADATA wsaData; int iResult; iResult = WSAStartup( MAKEWORD(2, 2), &wsaData ); // строка 109 if( iResult == 0 ) { struct hostent *remoteHost = gethostbyname( cp ); if( remoteHost != NULL ) ipaddr = *(unsigned long *) remoteHost->h_addr_list[0]; WSACleanup(); } } else ipaddr = inet_addr( cp ); if (ipaddr == INADDR_NONE) return 1; hIcmpFile = IcmpCreateFile(); if (hIcmpFile == INVALID_HANDLE_VALUE) return 2; ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData); ReplyBuffer = (VOID*) malloc(ReplySize); if (ReplyBuffer == NULL) { IcmpCloseHandle(hIcmpFile); return 3; } dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData), NULL, ReplyBuffer, ReplySize, 1000); free(ReplyBuffer); IcmpCloseHandle(hIcmpFile); if (dwRetVal == 0) return 4; /*GetLastError();*/ return 0; }[/pre2]

Andrey: Что-то фигня с русскими месяцами у меня. [pre2] aMonth := Array(12) FOR nI := 1 TO 12 aMonth[nI] := " " + LOWER( NTOCMONTH( nI ) ) + " " NEXT MsgDebug(hb_Ccompiler(), aMonth, SET(_SET_LANGUAGE), hb_CdpSelect() )[/pre2] Выходит вот так: Почему ?

SergKis: Andrey пишет Что-то фигня с русскими месяцами у меня. Рискну предположить, что в Region настройках у тебя ru1251, а в одно байтовой программе ставится UA1251 Для разных языков надо unicode версию hmg использовать, так для LV, DE, RU, EN, FR, ... языков надо, для UA, думаю тоже

Andrey: SergKis пишет: Рискну предположить, что в Region настройках у тебя ru1251, а в одно байтовой программе ставится UA1251 Там в начале программы указываю [pre2] SET LANGUAGE TO RUSSIAN SET CODEPAGE TO RUSSIAN[/pre2] В модуле TsbViewer.prg делаю [pre2] cSetCP := hb_SetCodepage() cSelCdp := hb_CdpSelect() cLngSel := Hb_LangSelect() ... DEFINE WINDOW &cForm AT nY,nX WIDTH nW HEIGHT nH TITLE cTitle ; ICON cIcon WINDOWTYPE STANDARD TOPMOST NOMAXIMIZE NOSIZE ; ON GOTFOCUS {|| App.Cargo:cFormGotFocus := This.Name, ; myLangRecover(cAlias,cSetCP,cSelCdp,cLngSel) } ; // возврат фокуса на форму .... FUNCTION myLangRecover(cAlias,cSetCP,cSelCdp,cLngSel) DO EVENTS hb_SetCodepage(cSetCP) hb_CdpSelect(cSelCdp) hb_LangSelect(cLngSel) IF LEN(cAlias) > 0 IF ( Select( cAlias ) > 0 ) dbSelectArea( cAlias ) ENDIF ENDIF DO EVENTS RETURN NIL[/pre2] Может это и не надо делать, но если языки в таблицах разные, то при возврате фокуса на таблицу - восстанавливаю язык какой был. Этот алгоритм взят с SAMPLES\Advanced\Tsb_5Win

SergKis: Andrey пишет При первом входе в эту функцию месяца правильные, потом фигню выдают Для работы с месяцами нужны разные названия их, со склонением, без, сокращенное название, + upper и все это для разных языков. Например, такой вариант можно делать, названия месяцев (и не только) держать в ресурсах программы в виде ini с секциями по нужным языкам и доставать варианты названия по необходимости из них. Пример тут (кому интересно) https://TransFiles.ru/hftxe Когда то делал пример отображения базы U04.DBF, которая в кодировке LV866 в тсб с перекодировкой на фонты с использованием CHARSET. В начало добавил примеры с яз. текстами в ini, сами ini в RES каталоге. Внимание ! Файл demo_ru866.prg набран в кодировке RU866 для FAR edit. Др. файлы в кодировке RU1251 Что ещё надо для правильного переключения языка ? Думаю, надо правильно ставить hb_CdpSelect(...) и исп. окна с контролами и фонтами, соответсвующими этой установке CDP

Andrey: Разобрался в данном случае, нужно просто использовать ТОЛЬКО одну функцию: [pre2] //hb_LangSelect(cLngSel) //hb_SetCodepage(cSetCP) hb_CdpSelect(cSelCdp)[/pre2] Тогда месяца выводятся правильно ! А как быть если база открыта в кодировке RU866, а само приложение в RU1251 ? При переключении на другое окно с базой UA866 и окном с другой кодировкой UA1251 - что будет ? Как в таком случае правильно менять языки вывода ?

SergKis: Andrey пишет А как быть если база открыта в кодировке RU866, а само приложение в RU1251 ? При переключении на другое окно с базой UA866 и окном с другой кодировкой UA1251 - что будет ? Это hb, с перекодировкой будет все ok! ты же уже использовал 1-ый пункт. Вопрос с GUI фонтами, т.к. они обеспечивают язык окон, контролов. Для одно байтовых программ надо исп. CHARSET указание языка, для команды SET FONT TO <fontname> , <fontsize> CHARSET берется из Region, для команд DEFINE FONT <name> ... без CHARSET то же. С указанным CHARSET в контролы окна надо подавать данные из hb соответствующей CDP. В программах unicode этого делать не надо. У меня все программы unicode и работа с языками сводится к замене данных из языкового ini. В примере выше я подгружал из ресурсов языковые ini в разные переменные, т.е. App.Cargo:oTextUtf := oGetIniText( "RU_text", , .T. ) App.Cargo:oTextEN := oGetIniText( "EN_text" ) cRes := Left( hb_CdpSelect(), 2 ) + cRes App.Cargo:oTextIni := oGetIniText( cRes ) В unicode программе, в зависимости от выбранного языка, работа ведется с одной переменной, т.е. cRes := "EN_text" ; App.Cargo:oText := oGetIniText( cRes ) cRes := "RU_text" ; App.Cargo:oText := oGetIniText( cRes ) cRes := "LV_text" ; App.Cargo:oText := oGetIniText( cRes ) ... App.Cargo:oText содержит данные в Utf8 PS Для UA1251, возможно, надо поставить hb_CdpSelect(...), сделать фонты, потом поставить RU1251 и так же сделать фонты. Потом на языковых окнах исп. соответствующие фонты. Для hb данных при переключении на яз. окно ставить свой hb_CdpSelect(...) ..., но это надо пробовать.

Andrey: SergKis пишет: но это надо пробовать. Попробовал... Хрень получается. Месяца и недели правильно выходят, но окно тогда остаётся в той кодировке, какое первое окно открыли. Т.е. смена кодировки окна не происходит.

SergKis: Andrey пишет Месяца и недели правильно выходят, но окно тогда остаётся в той кодировке, какое первое окно открыли. Т.е. смена кодировки окна не происходит. Надо для каждого языка свое окно, т.к. на нем и в контролах надо исп. свой языковый фонт при создании, т.е. для RU1251 свое окно, для UA1251 свое

Andrey: SergKis пишет: Надо для каждого языка свое окно, т.к. на нем и в контролах надо исп. свой языковый фонт при создании, т.е. для RU1251 свое окно, для UA1251 свое Так я это и делаю. Только если оба окна поднять и переключаться между ними, то язык не переключается !!! Выслал пример к тебе.

Andrey: SergKis пишет: Для hb данных при переключении на яз. окно ставить свой hb_CdpSelect(...) ..., но это надо пробовать. Это понятно что нужно ставить. Непонятно другое !!! Сделал проверку в TsbViewer.prg: [pre2]FUNCTION myLangRecover(cAlias,cSetCP,cSelCdp,cLngSel) LOCAL aMonth, nI aMonth := Array(12) FOR nI := 1 TO 12 aMonth[nI] := " " + LOWER( NTOCMONTH( nI ) ) + " " NEXT ? ProcNL(), cAlias,cSetCP,cSelCdp,cLngSel, hb_valtoexp(aMonth) // строка 447 DO EVENTS hb_SetCodepage(cSetCP) hb_CdpSelect(cSelCdp) hb_LangSelect(cLngSel) IF LEN(cAlias) > 0 IF ( Select( cAlias ) > 0 ) dbSelectArea( cAlias ) ENDIF ENDIF ? ProcNL(), hb_SetCodepage(), hb_CdpSelect(), hb_LangSelect() // строка 459 aMonth := Array(12) FOR nI := 1 TO 12 aMonth[nI] := " " + LOWER( NTOCMONTH( nI ) ) + " " NEXT ?? hb_valtoexp(aMonth) DO EVENTS RETURN NIL[/pre2] При первом входе в эту функцию месяца правильные, потом фигню выдают. Почему ? Что ещё надо для правильного переключения языка ? Почему ломается вывод месяцов на одном и том же языке - RU1251 ? Такой же результат будет и в отдельном примере !

SergKis: Andrey Смотри внимательно 1 строка hb_LangSelect() => ru.RU1251 2 строка hb_LangSelect() => ru.RU1251.RU1251 смотри ф-ю hb_LangSelect() https://github.com/Petewg/harbour-core/wiki/hb_L и задавай параметры правильно, т.е. hb_LangSelect("ru") или hb_LangSelect( , "RU1251") Почему ломается вывод месяцов на одном и том же языке - RU1251 ? Потому и ломается

Andrey: SergKis пишет: и задавай параметры правильно Сделал, всё равно НЕ РАБОТАЕТ !!! Отдельный пример к тебе положил.

SergKis: Andrey пишет Сделал, всё равно НЕ РАБОТАЕТ !!! в примере НЕ РАБОТАЕТ повтор вызова языка Разовая уст. языка (по списку) работает. Пример [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * */ #define _HMG_OUTLOG #define PROGRAM "Windows with different languages" #include "hmg.ch" REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 // русский язык REQUEST HB_CODEPAGE_UA1251, HB_CODEPAGE_UA866 // украинский язык REQUEST HB_LANG_BEWIN // белорусский язык /////////////////////////////////////////////////////////////////// INIT PROCEDURE Sets_EVN() LOCAL cFont := "DejaVu Sans Mono", nSize := 14 LOCAL cLog := "_msg.log" SET CODEPAGE TO RUSSIAN SET LANGUAGE TO RUSSIAN SET DATE TO GERMAN // это и есть SET DATE FORMAT "DD.MM.YYYY" SET EPOCH TO 2000 SET EXACT ON SET SOFTSEEK ON SET CENTURY ON // ООП используем SET OOP ON // new log filename for debug output _SetGetLogFile( cLog ) ; DELETEFILE(cLog) // основной Default фонт программы SET FONT TO cFont, nSize // фонт для HMG_Alert() и Alert...() ф-ий DEFINE FONT DlgFont FONTNAME cFont SIZE nSize RETURN /////////////////////////////////////////////////////////////////// PROCEDURE Main(...) LOCAL i FOR i := 0 TO 6 mySetLang( i ) NEXT Return FUNCTION mySetLang(nVal) LOCAL cSetCP, cSelCdp, cLngSel LOCAL o, cTmp, oIniLang, cIniLang IF nVal == 0 SET CODEPAGE TO ENGLISH SET LANGUAGE TO ENGLISH ELSEIF nVal == 1 SET CODEPAGE TO RUSSIAN SET LANGUAGE TO RUSSIAN ELSEIF nVal == 2 SET CODEPAGE TO UKRAINIAN SET LANGUAGE TO UKRAINIAN ELSEIF nVal == 3 SET LANGUAGE TO BYELORUSSIAN ELSEIF nVal == 4 SET CODEPAGE TO GERMAN SET LANGUAGE TO GERMAN ELSEIF nVal == 5 SET CODEPAGE TO SPANISH SET LANGUAGE TO SPANISH ELSEIF nVal == 6 SET CODEPAGE TO ITALIAN SET LANGUAGE TO ITALIAN ENDIF cSetCP := hb_SetCodepage() cSelCdp := hb_CdpSelect() cLngSel := hb_LangSelect() IF "be." $ cLngSel ; cTmp := lower("BEWIN") ELSE ; cTmp := lower(cSelCdp) ENDIF // --- Создадим ini языковый в .\RES, если ini нет cIniLang := ".\_" + cTmp + ".ini" IF ! hb_FileExists( cIniLang ) oIniLang := TIniData():New( , .T., .T. ) oIniLang:cIni := cIniLang o := oIniLang o:cCommentBegin := hb_LangName() o:cMonth := oHmgData() // [CMONTH] секция FOR nI := 1 TO 12 o:cMonth:Set( StrZero(nI, 2), lower( NTOCMONTH( nI ) ) ) NEXT o:cDow := oHmgData() // [CDOW] секция FOR nI := 1 TO 7 o:cDow:Set( hb_ntos(nI), lower( NTOCDOW( nI ) ) ) NEXT o:Write() ENDIF RETURN Nil [/pre2]

Andrey: SergKis пишет: Разовая уст. языка (по списку) работает. Да ! А потом при нажатии на форме доп.кнопок, меню и т.д. - НЕ РАБОТАЕТ ! Окно же не последнее, много чего потом делать нужно будет.

SergKis: Andrey Посмотри мой пример, сначала ставится[pre2] INIT PROCEDURE Sets_EVN() LOCAL cFont := "DejaVu Sans Mono", nSize := 14 LOCAL cLog := "_msg.log" SET CODEPAGE TO RUSSIAN SET LANGUAGE TO RUSSIAN ... потом повторно ставится FUNCTION mySetLang(nVal) LOCAL cSetCP, cSelCdp, cLngSel LOCAL o, cTmp, oIniLang, cIniLang IF nVal == 0 SET CODEPAGE TO ENGLISH SET LANGUAGE TO ENGLISH ELSEIF nVal == 1 SET CODEPAGE TO RUSSIAN SET LANGUAGE TO RUSSIAN ELSEIF nVal == 2 ...[/pre2] получаемый _ru1251.ini секции и данные в них правильные. А потом при нажатии на форме доп.кнопок, меню и т.д. - НЕ РАБОТАЕТ ! Думаю, оконный интерфейс по языку в однобайтовой сборке hmg должен действовать на всю программу, т.е. "новый" язык новый запуск exe с установкой этого языка.

Andrey: SergKis пишет: Думаю, оконный интерфейс по языку в однобайтовой сборке hmg должен действовать на всю программу, т.е. "новый" язык новый запуск exe с установкой этого языка. Конечно согласен с этим, но мне всегда хочется чуток расширить границы... и универсальности ... Допустим в моей большой программе нужно использовать печать на украинском языке в отдельном окне. Можно указать явно языки, тогда в окне месяца правильно показываются, НО если использовать НЕ MODAL окно для этого, то возможна потеря языка в основной программе.

SergKis: Andrey пишет Можно указать явно языки, тогда в окне месяца правильно показываются, НО если использовать НЕ MODAL окно для этого, то возможна потеря языка в основной программе. Используй для этих нескольких окон запуск своего же exe с параметром nMode > 0, Будет аналог STANDARD и ставишь нужный язык и голова не болит



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