Автор | Сообщение |
|
| |
Пост N: 86
Зарегистрирован: 08.07.06
|
|
Отправлено: 11.08.13 18:47. Заголовок: Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка"
Добрый день, уважаемые коллеги. Большое спасибо за море справочной информации по переходу, но нужно ещё пнуть меня в нужном направлении. Итак, установил Harbour 3.0 + BCC 5.5.1 ==>> 3.2.0 +minGW скомпилировал и запустил традиционный "Hello, world!" Дело перешло к проекту, из-за которого собственно и речь. Компилируется что через hbmk2, что самим харбором - без ошибок, всего с парой предупреждений, что меня немало удивило. Возникли ошибки на этапе линковки: Скрытый текст 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 активно используется в других модулях - но там линкер почему-то ошибок не видит...
| Help, please - что делать и куды бечь ?
|
|
|
Ответов - 285
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|
| |
Пост N: 3440
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.08.13 15:25. Заголовок: Sergy пишет: где ? ..
Sergy пишет: Паша придет скажет я не помню ;)
|
|
|
|
| |
Пост N: 192
Зарегистрирован: 08.07.06
|
|
Отправлено: 22.08.13 15:36. Заголовок: Есть ли способ прове..
Есть ли способ проверить существование текущего GET-объекта ? Чтобы потом сделать проверку наподобие такой: VALTYPE(oGet:varGet() == "N") ?
|
|
|
|
| |
Пост N: 3441
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.08.13 15:42. Заголовок: Sergy пишет: Есть л..
Sergy пишет: цитата: | Есть ли способ проверить существование текущего GET-объекта ? |
| а зачем если ты объявишь Set key (46 код) на эту педаль и будешь слать в буфер точку ?
|
|
|
|
| |
Пост N: 193
Зарегистрирован: 08.07.06
|
|
Отправлено: 22.08.13 15:54. Заголовок: Dima пишет: а зачем..
Dima пишет: цитата: | а зачем если ты объявишь Set key (46 код) на эту педаль и будешь слать в буфер точку ? |
| а если там текстовое поле и нужна запятая ?
|
|
|
|
| |
Пост N: 3443
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.08.13 16:07. Заголовок: Sergy Если мы говор..
Sergy Если мы говорим о цифровой панели и о кнопке DEL c точкой , то при нажатии этой педали всегда должна биться точка если включен NumLock не зависимо от раскладки клавы. Или я что то не понял ? :)
|
|
|
|
| |
Пост N: 195
Зарегистрирован: 08.07.06
|
|
Отправлено: 22.08.13 16:31. Заголовок: Dima пишет: Если мы..
Dima пишет: цитата: | Если мы говорим о цифровой панели и о кнопке DEL c точкой , то при нажатии этой педали всегда должна биться точка если включен NumLock не зависимо от раскладки клавы. Или я что то не понял ? :) |
| Да, именно о ней. Но разве INKEY() этой запятой чем-то отличается от запятой, набранной на стандартной клавиатуре? Ведь иногда нужна именно запятая. ... пойду проверю... upd: не отличаются. И в том и другом случае код 44. Эти кнопки, кстати о птичках, легко отличал TRAPANYKEY() И на его основе (кроме макросов), такая замена была-бы сделана в три строчки кода...
|
|
|
|
| |
Пост N: 3444
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.08.13 17:12. Заголовок: Sergy пишет: Есть л..
Sergy пишет: цитата: | Есть ли способ проверить существование текущего GET-объекта ? Чтобы потом сделать проверку наподобие такой: VALTYPE(oGet:varGet() == "N") ? |
| Ваял что то ваял я , смотри как можно проанализировать но есть затык 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
|
|
|
|
| |
Пост N: 3445
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.08.13 18:03. Заголовок: Все разобрался Функц..
Все разобрался Функция Test 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 Упрощаем ;) FUNCTION test() if GetActive()#NIL if valtype(GetActive():varGet())=="N" hb_keyins(".") endif endif return nil ЗЫ Set key вешаем на точку или куда хотел.
|
|
|
|
| |
Пост N: 196
Зарегистрирован: 08.07.06
|
|
Отправлено: 22.08.13 21:57. Заголовок: Dima пишет: FUNCTI..
Dima пишет: цитата: | FUNCTION test() if GetActive()#NIL if valtype(GetActive():varGet())=="N" hb_keyins(".") endif endif return nil |
| Красиво. Осталось разрешить ввод собственно запятой, когда она нужна.
|
|
|
|
| |
Пост N: 197
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 00:22. Заголовок: Три часа бился, вот ..
Три часа бился, вот что вышло: Скрытый текст
В начале программы ставим 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 Т.е. все работает так: если юзер нажимает запятую, там, где именно она и нужна - текущий обработчик выключается до тех пор, пока юзер не нажмет пробел. Как только будет нажат пробел (а его чаще всего вводят в текстовых полях), обработчик запятой ставится на место.
| Все было-бы проще, если-бы удалось запустить Харборовскую функцию SETKEY() с описанным третьим параметром: SETKEY(44,{||HB_KeyIns(".")},; {||GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N"}) Третий параметр как раз задает условное выполнение кодового блока, переданного вторым параметром. Но у меня он полностью игнроруется, не могу понять почему. Пробовал HB_SETKEY() - тоже самое, ноль эмоций. Поэтому пока так, пока кто-нить не предложит лучший вариант.
|
|
|
|
| |
Пост N: 3448
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 11:10. Заголовок: Sergy пишет: SETKEY..
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("."),"")})
|
|
|
|
|
| |
Пост N: 198
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 12:18. Заголовок: Dima пишет: а так ?..
Dima пишет: цитата: | а так ? HB_SETKEY(44,{|| if(GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N",HB_KeyIns("."),"")}) |
| в таком случае мы никогда не увидим запятую - при любом ее нажатии будет отрабатываться блок кода я ведь не зря мучался три часа с примером в пред. сообщении
|
|
|
|
| постоянный участник
|
Пост N: 228
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.08.13 14:17. Заголовок: может так: HB_SETKE..
может так: 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.
|
|
|
|
| |
Пост N: 199
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 14:22. Заголовок: SergKis пишет: мож..
SergKis пишет: цитата: | может так: ... o:Insert(",") |
| У меня попытка вставки запятой через буфер клавиатуры вызывала очередной вызов обработчика запятой. Что разумеется приводило к зависанию программы. Нужно будет попробовать.
|
|
|
|
| |
Пост N: 3449
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 14:57. Заголовок: При нажатии запятой ..
При нажатии запятой в этом случае в GET вставляется пробел почему то
|
|
|
|
| |
Пост N: 215
Зарегистрирован: 08.07.06
|
|
Отправлено: 23.08.13 19:31. Заголовок: Dima пишет: При наж..
Dima пишет: цитата: | При нажатии запятой в этом случае в GET вставляется пробел почему то |
| +1
|
|
|
|
| постоянный участник
|
Пост N: 230
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.08.13 22:32. Заголовок: Dima пишет: При нажа..
Dima пишет: цитата: | При нажатии запятой в этом случае в GET вставляется пробел почему то |
| пробел не вставляется, вставляется "" и позиция каретки +1, т.е. в tget.prg method insert( cChar ) для ... ::cBuffer := Left( SubStr( ::cBuffer, 1, ::nPos - 1 ) + cChar + SubStr( ::cBuffer, ::nPos ), ::nMaxEdit ) cChar == "" а не "," . что есть печально.
|
|
|
|
| |
Пост N: 3460
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.08.13 22:45. Заголовок: SergKis пишет: что ..
SergKis пишет: да не все еще отточено в Harbour а метода твоя была супер
|
|
|
|
| постоянный участник
|
Пост N: 231
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.08.13 22:52. Заголовок: Dima а так работает:..
Dima а так работает: 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
|
|
|
|
| |
Пост N: 220
Зарегистрирован: 08.07.06
|
|
Отправлено: 24.08.13 19:05. Заголовок: SergKis пишет: а та..
SergKis пишет: теперь курсор не сдвигается с места после установки запятой Но за идею - спасибо. Вот что получилось в итоге (upd @22:00) 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
|
|
|
Ответов - 285
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|