On-line: PSP, гостей 2. Всего: 3 [подробнее..]
АвторСообщение





Пост 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, "Разрешено!", "Запрещено")

Не помогло, что удивительно!.. и что с этим делать, непонятно.

Спасибо: 0 
Профиль
Ответов - 13 [только новые]


постоянный участник




Пост N: 475
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.02.08 23:22. Заголовок: У меня тоже в DBEDIT..


У меня тоже в DBEDIT() 2 раза запрашивает на вставку, удаление и т.д.
Пока не разбирался, месяца 3 прошло.

С ACHOICE() решается очень просто, берешь в документации пример его, делаешь под себя, а потом вставляешь его в свой проект. Других алтернатив нет.
Я сам так сделал, и нормально ACHOICE() работает.

Спасибо: 0 
Профиль





Пост N: 199
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 07.02.08 23:54. Заголовок: Re: Andrey


Andrey пишет:

 цитата:
Я сам так сделал, и нормально ACHOICE() работает.


Не подкинешь свой вариант ACHOICE()? Времени свободного сейчас маловато, чтобы возиться..

Спасибо: 0 
Профиль
постоянный участник




Пост 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


Спасибо: 0 
Профиль
постоянный участник


Пост N: 63
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 08.02.08 09:30. Заголовок: Что FOrgans() возвра..


Что F_Organs() возвращает в AChoice()?

Спасибо: 0 
Профиль





Пост N: 201
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 08.02.08 09:50. Заголовок: Re: PSP


PSP пишет:

 цитата:
Что F_Organs() возвращает в AChoice()?


Указанный мной CASE значение 2, а так может быть ещё и 0 - для выхода из ACHOICE()... да какая разница, если ошибки возникают при выполнении функции F_Ograns(), когда до возвращаемого значения дело ещё не дошло?
Ты о том, что это м.б. проблема пересвета? Была такая мысль, но возврат AC_REDRAW ничего не дал...

Спасибо: 0 
Профиль





Пост N: 202
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 08.02.08 09:59. Заголовок: Re: Andrey


Andrey пишет:

 цитата:
Держи, только там много моих переменных, так что сам удаляй:


Andrey, я не увидел собственно функции ACHOICE(), её текста. Я думал, речь идёт о нём.

Andrey пишет:

 цитата:
С ACHOICE() решается очень просто, берешь в документации пример его


А ты, оказывается, взял не "пример его", а пример работы с ним! Может, мне это что-нибудь и даст, но в твоём примере функции обработки нет GETов... Значит, в этом плане не поможет.

Спасибо: 0 
Профиль
постоянный участник


Пост 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


Спасибо: 0 
Профиль





Пост N: 203
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 08.02.08 11:52. Заголовок: Vlad04 пишет: Я исп..


Vlad04 пишет:

 цитата:
Я использую ACHOICE() для выбора значения, помещенного в массив mVidStz


Vlad04, ты используешь ACHOICE() без функции-обработчика! Ну, знаешь, есть функции-обработчики TBrowse, которые на определённые нажатия клавиш запускают соответствуюшие функции, так вот и к ACHOICE() можно прилепить такую же функцию - и получается что-то вроде TBrowse, только не для DBF-файла, а для массива. И проблемы у меня начинаются именно при выполнении этой функции! Сам-то выбор какого-либо значения ACHOICE()'ом никакой проблемы не представляет...

Спасибо: 0 
Профиль



Пост 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



Спасибо: 0 
Профиль





Пост 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)! Так что твой пример мне не даёт ничего, увы... Но спасибо за участие!

Спасибо: 0 
Профиль





Пост N: 206
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 09.02.08 01:44. Заголовок: Всем


Проблему решило добавление SETLASTKEY(222) перед возвратом из обработки K_SPACE и K_ENTER.
ACHOICE() в xHarbour почему-то воспринимает последнее нажатие клавиши в функции обработки как очередное нажатие клавиши в самом ACHOICE(), но слава Богу только один раз на каждый правильный вызов функции обработки, иначе вообще бы зацикливалась!
Интересно, правда, почему этот глюк не проявляется в примере nick_mi...

Спасибо: 0 
Профиль



Пост N: 29
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 09.02.08 08:46. Заголовок: Только что перепрове..


Только что перепроверил работу по вводу с ACHOICE в CLIPPER и HARBOUR на одной и той же программе. Разница оказалась в том, что в CLIPPER после GET выполнялся переход на следующую строку перемещением курсора вниз, в HARBOUR весь список подтягивался на 1 строку вверх. Проверку, правда, выполнял на другой программе. Если надо, функцию обработки могу здесь вывести. Программа собрана HARBOUR, последний Changelog от 05.06.2006

Спасибо: 0 
Профиль





Пост N: 207
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 11.02.08 00:42. Заголовок: nick_mi пишет: . Ра..


nick_mi пишет:

 цитата:
. Разница оказалась в том, что в CLIPPER


Разница оказалась в том, ещё раз повторяю, что ACHOICE() в xHarbour'е зачем-то второй раз запускает функцию обработки, если LASTKEY() при первом входе в функцию обработки и LASTKEY() при выходе из функции обработки одинаковы!
Именно поэтому у меня всё выполнялось дважды - и GET, и присвоение значения переменной!
Проблема теперь абсолютно ясна - печально только, что она имеет место быть...

Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 148
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет