Форум » 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: Спасибо !

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(...) ..., но это надо пробовать.



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