Автор | Сообщение |
|
| |
Пост N: 198
Зарегистрирован: 08.04.06
|
|
Отправлено: 07.02.08 22:40. Заголовок: Глюки в функции ACHOICE()
Фрагмент: i = ACHOICE(1, 1, MAXROW()-1, MAXCOL()-1, menu_mas, , "F_Ograns") ............... Function F_Ograns (mode,; && достигнули границы списка ind) && номер текущего элемента массива ................. case key = K_ENTER .OR. key = K_SPACE @ ROW(),MAXCOL()-16 get Ogran[ind] picture "9999" set cursor on read set cursor off ................. выдаёт такую пенку: запрос на ввод переменной появляется 2 раза! Первый раз - в реальной строке списка ( ROW() ), которая в данный момент подсвечена при движении курсора, и сразу после ввода значения в первый раз, - в последней строке списка ( MAXROW()-1 ) Думал, выкручусь, заменив в GETе ROW() переменной, - всё равно два запроса на ввод! Там же, в функции обработки ACHOICE(): Ogran[ind] = IIF(Ogran[ind] = 0, 1, 0) menu_mas[ind] = LEFT(menu_mas[ind], 64) ; + IIF(Ogran[ind] = 0, "Разрешено!", "Запрещено") во второй строке Ogran[ind] видится ещё в прежнем значении! Попробовал key = Ogran[ind] Ogran[ind] = IIF(Ogran[ind] = 0, 1, 0) do while key = Ogran[ind] enddo menu_mas[ind] = LEFT(menu_mas[ind], 64) ; + IIF(Ogran[ind] = 0, "Разрешено!", "Запрещено") Не помогло, что удивительно!.. и что с этим делать, непонятно.
| |
|
Ответов - 13
[только новые]
|
|
|
| постоянный участник
|
Пост N: 475
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.02.08 23:22. Заголовок: У меня тоже в DBEDIT..
У меня тоже в DBEDIT() 2 раза запрашивает на вставку, удаление и т.д. Пока не разбирался, месяца 3 прошло. С ACHOICE() решается очень просто, берешь в документации пример его, делаешь под себя, а потом вставляешь его в свой проект. Других алтернатив нет. Я сам так сделал, и нормально ACHOICE() работает.
| |
|
|
| |
Пост N: 199
Зарегистрирован: 08.04.06
|
|
Отправлено: 07.02.08 23:54. Заголовок: Re: Andrey
Andrey пишет: цитата: | Я сам так сделал, и нормально ACHOICE() работает. |
| Не подкинешь свой вариант ACHOICE()? Времени свободного сейчас маловато, чтобы возиться..
| |
|
|
| постоянный участник
|
Пост N: 476
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.02.08 01:20. Заголовок: Держи, только там мн..
Держи, только там много моих переменных, так что сам удаляй: #include "Achoice.ch" #include "Inkey.ch" ********************************************************************** FUNCTION Spiski_Dim(aYX,aMenu,cColMenu,cColNaim,aColBegun,cColRamki,aNumba) LOCAL lQuit := .T., nLenDim, nLenOne, nLenStr LOCAL nI, nJ, aLogMenu := {}, aRetNum:={} LOCAL aBeg nY := aYX[1] ; nX := aYX[2] aStatMenu := {} nLenOne := 0 aBeg := MES_BARI( " Обрабатываю список полей " ) nKolvo := LEN( aMenu ) FOR nI := 1 TO nKolvo MES_BARW( aBeg, nI, nKolvo ) AADD( aStatMenu," "+STR(nI,3)+"."+ALLTRIM(aMenu[nI]) ) AADD( aLogMenu, .T. ) nLenStr := 3 + LEN(ALLTRIM(aMenu[nI])) nLenOne := MAX(nLenOne, nLenStr ) NEXT MES_BARU( aBeg ) // Запишим Галочки в массив FOR nI := 1 TO LEN(aNumba) nJ := VAL(aNumba[nI]) cTemp := SUBSTR( aStatMenu[nJ],1,2) cTemp2 := SUBSTR( aStatMenu[nJ],3) aStatMenu[nJ] := " √" + cTemp2 NEXT nI:=1 ; nLenDim := nKolvo nY := IIF(nLenDim>25, 1, nY) nLenDim:=IIF(nLenDim + nY > MAXROW()-6, MAXROW()-6, nLenDim) nLenOne := IIF( nLenOne + nX > MAXCOL()-8, MAXCOL()-8-nX ,nLenOne ) nScroll := LEN( aMenu ) DO WHILE lQuit RAMKA(nY,nX,nLenDim+1,1+nLenOne+1,cColRamki,.T.) @ nY,(1+nLenOne+1-nX)/2+nX-5 SAY " МЕНЮ ВЫБОРА ПОЛЕЙ " COLOR(cColNaim) aStScroll := ScrollBarNew( nY + 1, nX+1+nLenOne+1, nY+nLenDim, aColBegun[1], 1 ) ScrollBarDisplay( aStScroll ) cStatBegun := aColBegun[2] ScrollBarUpdate( aStScroll, nI, LEN(aStatMenu), .T. , cStatBegun) SETCOLOR(cColMenu) nRet := Achoice(nY+1,nX+1,nY+nLenDim,nX+1+nLenOne,aStatMenu,aLogMenu,"UserFuncHarb",nI) nI := nRet IF nRet == 0 .AND. LASTKEY()==K_ESC lQuit := .F. ENDIF ENDDO aRetNum := {} FOR nI := 1 TO LEN(aStatMenu) IF SUBSTR( aStatMenu[nI],1,2) == " √" //AADD( aRetNum, PADL(ALLTRIM(STR(nI)),2,"0") ) AADD( aRetNum, ALLTRIM(STR(nI)) ) ENDIF NEXT RETURN aRetNum ************************************************************* FUNCTION UserFuncHarb( nMode, nElement, nRow ) LOCAL nKey := LastKey() LOCAL nRet := AC_CONT LOCAL cMsg, cTemp, nLenAch DO CASE CASE nMode == AC_IDLE // do some idle processing /*cMsg := " File: " + aFiles[nElement,1] + ; " Size: " + Str( aFiles[nElement,2] ) + ; " Date: " + DtoC( aFiles[nElement,3] ) + ; " Time: " + aFiles[nElement,4] DispOutAt( MaxRow(), 0, Padr(cMsg, MaxCol()+1), "W+/R" ) */ ScrollBarUpdate( aStScroll, nElement, LEN(aStatMenu), .T. , cStatBegun) CASE nMode == AC_EXCEPT // key handling for unknown keys IF nKey == K_ESC nRet := AC_ABORT ELSEIF nKey == K_RETURN .OR. nKey == K_SPACE .OR. nKey == K_LDBLCLK nRet := AC_SELECT cTemp := SUBSTR( aStatMenu[nElement],1,2) cTemp2 := SUBSTR( aStatMenu[nElement],3) cTemp := IIF( cTemp == " √", " ", " √" ) aStatMenu[nElement] := cTemp + cTemp2 ScrollBarUpdate( aStScroll, nElement, LEN(aStatMenu), .T. , cStatBegun) ELSEIF nKey == K_DEL nRet := AC_SELECT cTemp := SUBSTR( aStatMenu[nElement],1,2) cTemp2 := SUBSTR( aStatMenu[nElement],3) aStatMenu[nElement] := " " + cTemp2 ScrollBarUpdate( aStScroll, nElement, LEN(aStatMenu), .T. , cStatBegun) ELSEIF nKey > 31 .AND. nKey < 255 nRet := AC_GOTO ENDIF ENDCASE RETURN nRet
| |
|
|
| постоянный участник
|
Пост N: 63
Зарегистрирован: 27.01.07
|
|
Отправлено: 08.02.08 09:30. Заголовок: Что FOrgans() возвра..
Что F_Organs() возвращает в AChoice()?
| |
|
|
| |
Пост N: 201
Зарегистрирован: 08.04.06
|
|
Отправлено: 08.02.08 09:50. Заголовок: Re: PSP
PSP пишет: цитата: | Что F_Organs() возвращает в AChoice()? |
| Указанный мной CASE значение 2, а так может быть ещё и 0 - для выхода из ACHOICE()... да какая разница, если ошибки возникают при выполнении функции F_Ograns(), когда до возвращаемого значения дело ещё не дошло? Ты о том, что это м.б. проблема пересвета? Была такая мысль, но возврат AC_REDRAW ничего не дал...
| |
|
|
| |
Пост N: 202
Зарегистрирован: 08.04.06
|
|
Отправлено: 08.02.08 09:59. Заголовок: Re: Andrey
Andrey пишет: цитата: | Держи, только там много моих переменных, так что сам удаляй: |
| Andrey, я не увидел собственно функции ACHOICE(), её текста. Я думал, речь идёт о нём. Andrey пишет: цитата: | С ACHOICE() решается очень просто, берешь в документации пример его |
| А ты, оказывается, взял не "пример его", а пример работы с ним! Может, мне это что-нибудь и даст, но в твоём примере функции обработки нет GETов... Значит, в этом плане не поможет.
| |
|
|
| постоянный участник
|
Пост N: 102
Зарегистрирован: 13.10.05
|
|
Отправлено: 08.02.08 10:47. Заголовок: Я использую ACHOICE..
Я использую ACHOICE() для выбора значения, помещенного в массив mVidStz.Все нормально setcolor("n/bg,n/w,,,n/bg") do while flag // Top Left Bottom Rght // mG - объявлен в Valedit vib=achoice(mG[1],mG[2],mG[1]+Len(mVidStz),mG[2]+Len(mVidStz[1]),mVidStz) if lastkey()=13 xGet:=iGet[per]:=mVidStz[vib] flag=.f. endif enddo
| |
|
|
| |
Пост N: 203
Зарегистрирован: 08.04.06
|
|
Отправлено: 08.02.08 11:52. Заголовок: Vlad04 пишет: Я исп..
Vlad04 пишет: цитата: | Я использую ACHOICE() для выбора значения, помещенного в массив mVidStz |
| Vlad04, ты используешь ACHOICE() без функции-обработчика! Ну, знаешь, есть функции-обработчики TBrowse, которые на определённые нажатия клавиш запускают соответствуюшие функции, так вот и к ACHOICE() можно прилепить такую же функцию - и получается что-то вроде TBrowse, только не для DBF-файла, а для массива. И проблемы у меня начинаются именно при выполнении этой функции! Сам-то выбор какого-либо значения ACHOICE()'ом никакой проблемы не представляет...
| |
|
|
| |
Пост N: 28
Зарегистрирован: 19.05.05
|
|
Отправлено: 08.02.08 12:42. Заголовок: Собственно пример с..
Собственно пример с GET, работает нормально achoice (7,15, 22, 62, ar_naim_or,, "f_ach2" ) restscreen (,,,,pee2) //------------------------------------------------------------------------ // //------------------------------------------------------------------------ func f_ach2 param p1, p2, p3 local keyb, wrk_scr1 keyb:= lastkey () wrk_scr1 := savescreen () Do case Case p1 == 0 return 2 Case p1 == 1 return 2 Case p1 == 2 return 2 Case p1 == 3 if keyb == K_ENTER pds0 := substr (ar_naim_or [p2], 32, 17) @ p3 +7, 46 get pds0 picture "@K99999999999999.99" lScore := Set(_SET_SCOREBOARD, .F.) lExit := Set(_SET_EXIT, .T.) bIns := SetKey(K_INS) SetKey( K_INS, {|| InsToggle()} ) SetCursor( IF(ReadInsert(), SC_INSERT, SC_NORMAL) ) read SetCursor(0) Set(_SET_SCOREBOARD, lScore) Set(_SET_EXIT, lExit) SetKey(K_INS, bIns) If lastkey () == K_ESC restscreen (,,,,wrk_scr1) return 2 EndIf ar_naim_or [p2] := substr (ar_naim_or [p2] , 1, 31)+ padl (alltrim(pds0),17 ) // restscreen (,,,,wrk_scr1) return 2 EndIf If keyb == K_F2 sele (t09psele14) For i := 1 to len (ar_naim_or) seek substr (dtos(p0), 1, 6) + rkod_sch + ar_kod_or If found () rec_lock(5) repl DATA with p0 ,; SCHET with rkod_sch,; PREDP_FAM with ar_kod_or,; SUMMA with val (substr (ar_naim_or , 32, 17)) unlock Else append blank repl DATA with p0 ,; SCHET with rkod_sch,; PREDP_FAM with ar_kod_or,; SUMMA with val (substr (ar_naim_or , 32, 17)) unlock EndIf Next sele (t09psele13) return 2 EndIf If keyb == K_ESC return 0 EndIf return 2 Case p1 == 4 return 2 EndCase
| |
|
|
| |
Пост N: 205
Зарегистрирован: 08.04.06
|
|
Отправлено: 09.02.08 01:11. Заголовок: Andrey пишет: ELSEI..
Andrey пишет: цитата: | ELSEIF nKey == K_RETURN .OR. nKey == K_SPACE .OR. nKey == K_LDBLCLK nRet := AC_SELECT |
| Andrey, начал разбираться в твоём примере и просёк, что у нас принципиально разные ситуации: у тебя после изменения значения массива идёт его выбор (закрытие ACHOICE()), а у меня - высвечивание изменённого значения и продолжение ACHOICE() (AC_CONT)! Так что твой пример мне не даёт ничего, увы... Но спасибо за участие!
| |
|
|
| |
Пост N: 206
Зарегистрирован: 08.04.06
|
|
Отправлено: 09.02.08 01:44. Заголовок: Всем
Проблему решило добавление SETLASTKEY(222) перед возвратом из обработки K_SPACE и K_ENTER. ACHOICE() в xHarbour почему-то воспринимает последнее нажатие клавиши в функции обработки как очередное нажатие клавиши в самом ACHOICE(), но слава Богу только один раз на каждый правильный вызов функции обработки, иначе вообще бы зацикливалась! Интересно, правда, почему этот глюк не проявляется в примере nick_mi...
| |
|
|
|
| |
Пост N: 29
Зарегистрирован: 19.05.05
|
|
Отправлено: 09.02.08 08:46. Заголовок: Только что перепрове..
Только что перепроверил работу по вводу с ACHOICE в CLIPPER и HARBOUR на одной и той же программе. Разница оказалась в том, что в CLIPPER после GET выполнялся переход на следующую строку перемещением курсора вниз, в HARBOUR весь список подтягивался на 1 строку вверх. Проверку, правда, выполнял на другой программе. Если надо, функцию обработки могу здесь вывести. Программа собрана HARBOUR, последний Changelog от 05.06.2006
| |
|
|
| |
Пост N: 207
Зарегистрирован: 08.04.06
|
|
Отправлено: 11.02.08 00:42. Заголовок: nick_mi пишет: . Ра..
nick_mi пишет: цитата: | . Разница оказалась в том, что в CLIPPER |
| Разница оказалась в том, ещё раз повторяю, что ACHOICE() в xHarbour'е зачем-то второй раз запускает функцию обработки, если LASTKEY() при первом входе в функцию обработки и LASTKEY() при выходе из функции обработки одинаковы! Именно поэтому у меня всё выполнялось дважды - и GET, и присвоение значения переменной! Проблема теперь абсолютно ясна - печально только, что она имеет место быть...
| |
|
|
|