Форум » [x]Harbour » Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка" » Ответить

Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка"

Sergy: Добрый день, уважаемые коллеги. Большое спасибо за море справочной информации по переходу, но нужно ещё пнуть меня в нужном направлении. Итак, установил Harbour 3.0 + BCC 5.5.1 ==>> 3.2.0 +minGW скомпилировал и запустил традиционный "Hello, world!" Дело перешло к проекту, из-за которого собственно и речь. Компилируется что через hbmk2, что самим харбором - без ошибок, всего с парой предупреждений, что меня немало удивило. Возникли ошибки на этапе линковки: [more]Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_HB_FUN_ENVPARAM' referenced from D:\HB\TRADE100.OBJ Error: Unresolved external '_HB_FUN_INKEYTRAP' referenced from D:\HB\TRADE226.OBJ Error: Unresolved external '_HB_FUN_DISKFREE' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_DISKTOTAL' referenced from D:\HB\TRADE222.OBJ Error: Unresolved external '_HB_FUN_BIOSDATE' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONTICK' referenced from D:\HB\TRADE.OBJ Error: Unresolved external '_HB_FUN_FT_ONIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_FT_IAMIDLE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_TRAPANYKEY' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_KEYSEND' referenced from D:\HB\TRADE200.OBJ 1) Так понимаю, это ошибки из-за того, что не находятся некоторые функции из активно используемых CT3/Nanforum Toolkit ? Что делать с ними ? Отказываться ? Или есть заменители ? Error: Unresolved external '_HB_FUN_STACKFREE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLILOCTOT' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCUSE' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCAVL' referenced from D:\HB\TRADE200.OBJ Error: Unresolved external '_HB_FUN_BLISTCTOT' referenced from D:\HB\TRADE200.OBJ 2) Это - ошибки из-за вызовов встроенных в Blinker функций, без них легко обойтись в принципе... Error: Unresolved external '_HB_FUN_STRNUM2ARRAY' referenced from D:\HB\TRADE208.OBJ Error: Unresolved external '_HB_FUN_CMJS_EXTRACTPARAMS' referenced from D:\HB\TRADE206.OBJ Error: Unresolved external '_HB_FUN_SELECTSTOCKS' referenced from D:\HB\TRADE220.OBJ Error: Unresolved external '_HB_FUN_APPLYSERTCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYCARGOCHAGES' referenced from D:\HB\TRADE221.OBJ Error: Unresolved external '_HB_FUN_APPLYPRICECHAGES' referenced from D:\HB\TRADE221.OBJ 3) А вот это - самое странное - это мои функции, причем некоторые из них вызываются многократно из других модулей. Например ApplyCargoChanges является STATIC в самом модуле TRADE221 - почему линковщик ее не видит, наряду с парой Apply... других ? SelectStocks активно используется в других модулях - но там линкер почему-то ошибок не видит... [/more] Help, please - что делать и куды бечь ?

Ответов - 285, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Dima: Sergy пишет: где ? как именно ? Паша придет скажет я не помню ;)

Sergy: Есть ли способ проверить существование текущего GET-объекта ? Чтобы потом сделать проверку наподобие такой: VALTYPE(oGet:varGet() == "N") ?

Dima: Sergy пишет: Есть ли способ проверить существование текущего GET-объекта ? а зачем если ты объявишь Set key (46 код) на эту педаль и будешь слать в буфер точку ?


Sergy: Dima пишет: а зачем если ты объявишь Set key (46 код) на эту педаль и будешь слать в буфер точку ? а если там текстовое поле и нужна запятая ?

Dima: Sergy Если мы говорим о цифровой панели и о кнопке DEL c точкой , то при нажатии этой педали всегда должна биться точка если включен NumLock не зависимо от раскладки клавы. Или я что то не понял ? :)

Sergy: Dima пишет: Если мы говорим о цифровой панели и о кнопке DEL c точкой , то при нажатии этой педали всегда должна биться точка если включен NumLock не зависимо от раскладки клавы. Или я что то не понял ? :) Да, именно о ней. Но разве INKEY() этой запятой чем-то отличается от запятой, набранной на стандартной клавиатуре? Ведь иногда нужна именно запятая. ... пойду проверю... upd: не отличаются. И в том и другом случае код 44. Эти кнопки, кстати о птичках, легко отличал TRAPANYKEY() И на его основе (кроме макросов), такая замена была-бы сделана в три строчки кода...

Dima: Sergy пишет: Есть ли способ проверить существование текущего GET-объекта ? Чтобы потом сделать проверку наподобие такой: VALTYPE(oGet:varGet() == "N") ? Ваял что то ваял я , смотри как можно проанализировать но есть затык [pre2] Proc Main local acc:=0 local acc1:=" " cls setmode(25,80) set key 28 to test @ 0,0 get acc @ 1,0 get acc1 read RETURN ************ FUNCTION test() LOCAL n := 0 ,i WHILE ! Empty( ProcName( n ) ) n++ if procname(n)=="HBGETLIST:READMODAL" for i=1 to len(__GETLISTACTIVE()) ? __GETLISTACTIVE()[ i ],i * вот тут можно проверять по идее Valtype(__GETLISTACTIVE()[13]) твоя текущая переменная в GET * но зараза все время выдает "C" , похоже не там копаю или не так........ next endif ENDDO RETURN NIL [/pre2]

Dima: Все разобрался Функция Test [pre2] FUNCTION test() LOCAL n := 0 ,i WHILE ! Empty( ProcName( n ) ) n++ if procname(n)=="HBGETLIST:READMODAL" if valtype(GetActive():varGet())=="N" hb_keyins(".") exit endif endif ENDDO RETURN NIL [/pre2] Упрощаем ;) [pre2] FUNCTION test() if GetActive()#NIL if valtype(GetActive():varGet())=="N" hb_keyins(".") endif endif return nil [/pre2] ЗЫ Set key вешаем на точку или куда хотел.

Sergy: Dima пишет: FUNCTION test() if GetActive()#NIL if valtype(GetActive():varGet())=="N" hb_keyins(".") endif endif return nil Красиво. Осталось разрешить ввод собственно запятой, когда она нужна.

Sergy: Три часа бился, вот что вышло: [pre2] В начале программы ставим SETKEY(44,{||CommaReplace()}) // замена запятой на точку в цифровых полях FUNC CommaReplace() STATIC kb32,kb44 LOCAL key := LastKey() IF (key==44) // запятая ? IF (GetActive() # NIL) .AND. (VALTYPE(GetActive():varGet()) == "N") HB_KeyIns(".") // что и требовалось ELSE kb44 := SETKEY(44,SETKEY(32)) // пустой обработчик пробела подойдет kb32 := SETKEY(32,kb44) // бывш.обработчик 44, т.е. сама функция HB_KeyIns(",") // возвращаем запятую на место ENDIF ELSEIF (key==32) // нажат пробел, нужно восст. обработчик запятой SETKEY(32,kb32) // восст. сохраненного обработчика пробела (по сути, пустой) SETKEY(44,kb44) // восст. обработчика запятой (по сути - вызов этой функции) HB_KeyIns(" ") // возвращаем пробел на место ENDIF RETURN NIL Т.е. все работает так: если юзер нажимает запятую, там, где именно она и нужна - текущий обработчик выключается до тех пор, пока юзер не нажмет пробел. Как только будет нажат пробел (а его чаще всего вводят в текстовых полях), обработчик запятой ставится на место. [/pre2] Все было-бы проще, если-бы удалось запустить Харборовскую функцию SETKEY() с описанным третьим параметром: [pre2]SETKEY(44,{||HB_KeyIns(".")},; {||GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N"}) [/pre2] Третий параметр как раз задает условное выполнение кодового блока, переданного вторым параметром. Но у меня он полностью игнроруется, не могу понять почему. Пробовал HB_SETKEY() - тоже самое, ноль эмоций. Поэтому пока так, пока кто-нить не предложит лучший вариант.

Dima: Sergy пишет: SETKEY(44,{||HB_KeyIns(".")},; {||GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N"}) а так ? HB_SETKEY(44,{|| if(GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N",HB_KeyIns("."),"")})

Sergy: Dima пишет: а так ? HB_SETKEY(44,{|| if(GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N",HB_KeyIns("."),"")}) в таком случае мы никогда не увидим запятую - при любом ее нажатии будет отрабатываться блок кода я ведь не зря мучался три часа с примером в пред. сообщении

SergKis: может так: [pre2] HB_SETKEY(44,{|o| o:= GetActive(), if(o # NIL, if(VALTYPE(o:varGet())=="N", HB_KeyIns("."), o:Insert(",")), "")}) где: Text Entry Methods insert() Inserts characters into the editing buffer: insert(<cChar>) --> self Inserts <cChar> into the editing buffer at the current cursor position, shifting the existing contents of the buffer to the right. The cursor is then placed one position to the right of the inserted string. [/pre2]

Sergy: SergKis пишет: может так: ... o:Insert(",") У меня попытка вставки запятой через буфер клавиатуры вызывала очередной вызов обработчика запятой. Что разумеется приводило к зависанию программы. Нужно будет попробовать.

Dima: При нажатии запятой в этом случае в GET вставляется пробел почему то

Sergy: Dima пишет: При нажатии запятой в этом случае в GET вставляется пробел почему то +1

SergKis: Dima пишет: При нажатии запятой в этом случае в GET вставляется пробел почему то пробел не вставляется, вставляется "" и позиция каретки +1, т.е. в tget.prg method insert( cChar ) для ... ::cBuffer := Left( SubStr( ::cBuffer, 1, ::nPos - 1 ) + cChar + SubStr( ::cBuffer, ::nPos ), ::nMaxEdit ) cChar == "" а не "," . что есть печально.

Dima: SergKis пишет: что есть печально. да не все еще отточено в Harbour а метода твоя была супер

SergKis: Dima а так работает: [pre2] hb_SetKey(44, {|| MyTest44(GetActive()) }, {|| GetActive() != NIL}) ... FUNC myTest44( o ) IF o:pos > 1 o:buffer := left(subs(o:buffer, 1, o:pos-1)+','+subs(o:buffer, o:pos+1), len(o:buffer)) ELSE o:buffer := ','+subs(o:buffer, 2) ENDIF o:varPut(o:buffer) o:display() RETURN [/pre2]

Sergy: SergKis пишет: а так работает: теперь курсор не сдвигается с места после установки запятой Но за идею - спасибо. Вот что получилось в итоге (upd @22:00) [pre2] FUNC CommaRepl(oGet) // меняем запятую на точку IF (VALTYPE(oGet:VarGet()) == "C") // текст ? IF (VAL(oGet:VarGet()) # 0) // а по сути цифра ? PutInKbd(".") // меняем на точку ELSE // не цифра, соотв. нужна запятая // тк банальный :Insert(",") пока глючит, извращаемся так: IF oGet:pos > 1 oGet:buffer := LEFT(SUBSTR(oGet:buffer, 1, oGet:pos-1)+','+; SUBSTR(oGet:buffer, oGet:pos+1), LEN(oGet:buffer)) ELSE oGet:buffer := ','+SUBSTR(oGet:buffer, 2) ENDIF oGet:VarPut(oGet:buffer) oGet:Display() oGet:pos += 1 // перемещаем каретку вправо ENDI ELSE // цифра, дата и тп... PutInKbd(".") // меняем на точку ENDIF RETURN [/pre2]



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