Форум » [x]Harbour » Get Listbox » Ответить

Get Listbox

Dima: Пара вопросов. [pre2] @ 12,45 ,19 ,71 get vid5 listbox {" Не печатать",; " 12 штук на A4 (70 x 65)",; " 88 штук на A4 (25 x 25)",; " 190 штук на A4 (15 x 20)",; " 10 штук на A4 (50 x 90)"} ; caption "Печать ценников " ; DROPDOWN SCROLLBAR @ 13,45 ,17,55 get vid listbox {" Широкая "," Узкая "} ; caption "Масштаб печати " ; DROPDOWN SCROLLBAR @ 14,27 say "Количество копий " get kolcop picture "9" read [/pre2] 1. Как при входе в READ сразу оказаться на последнем GET c количеством копий ? 2. Хотелось бы между GET перемещаться стрелками вверх/вниз а не с помощью TAB , как это сделать ?

Ответов - 40, стр: 1 2 All

AlexMyr: Dima пишет: 1. Как при входе в READ сразу оказаться на последнем GET c количеством копий ? может так kolcop:setfocus()

Dima: AlexMyr пишет: может так kolcop:setfocus() что то новенькое и мысли не понял. так ведь не будет работать если тупо перед READ написать kolcop:setfocus()

Andrey: Я делаю так: FOR nI TO (кол-во GET'ов) HB_KeyPut( K_DOWN ) NEXT У меня в GET стрелками перемещается... Я уж забыл как это сделал... Типа: SET SCOREBOARD OFF && переключение сообщения вывода для READ Не помню короче...


Dima: Andrey пишет: FOR nI TO (кол-во GET'ов) HB_KeyPut( K_DOWN ) NEXT Да это понятно. И да так работает когда в GET нет LISTBOX а с ним ты на первом же листбоксе и останешься и не важно сколько HB_KeyPut( K_DOWN ) будет послано.

nick_mi: А почему нельзя кол листов поставить первым в выводе GETов ? Но вообще-то предложение может так kolcop:setfocus() можно поставить в условие WHEN первого GETа, с какой-то логикой конечно, чтобы повторный заход внутри READ не выбрасывал постояннно на последний GET

Dima: nick_mi пишет: А почему нельзя кол листов поставить первым в выводе GETов ? Заказчик против.

nick_mi: И только что попробовал для GTWVT перемещение между полями происходит по клавишам стрелка вверх/вниз . Программа для всяких экспериментов сделана на базе тестовой программы от ANDREY click here Установки в программе не менял

nick_mi: В списке GETов ее можно поставить первой, а выводить в последней строке. Тогда, правда Стрелка вверх работать в этом поле не будет, а по стрелке вниз перемещение будет вверх на строку @ 12,45 ,19 ,71 get vid5 listbox {" Не печатать",; " 12 штук на A4 (70 x 65)",; " 88 штук на A4 (25 x 25)",; " 190 штук на A4 (15 x 20)",; " 10 штук на A4 (50 x 90)"} ; caption "Печать ценников " ; DROPDOWN SCROLLBAR

Dima: ладно оставим вопрос о переходе на последний GET. Он в принципе решаем если решить вопрос 2 Dima пишет: 2. Хотелось бы между GET c LISTBOX перемещаться стрелками вверх/вниз а не с помощью TAB , как это сделать ? Какой исходник править я уже нашел (tgetlist.prg из сырцов) , смотрю где нужно переделать и пока не вижу.

Dima: Был там такой код [pre2] ELSEIF oTheClass == "LISTBOX" IF nKey == K_UP oGUI:PrevItem() nKey := 0 ELSEIF nKey == K_DOWN oGUI:NextItem() nKey := 0 ELSEIF nKey == K_SPACE IF ! oGUI:DropDown ELSEIF ! oGUI:IsOpen oGUI:Open() nKey := 0 ENDIF [/pre2] переделал на [pre2] ELSEIF oTheClass == "LISTBOX" IF nKey == K_UP if oGUI:Isopen oGUI:PrevItem() nKey := 0 else oGet:exitState := GE_UP endif ELSEIF nKey == K_DOWN if oGUI:Isopen oGUI:NextItem() nKey := 0 else oGet:exitState := GE_DOWN endif ELSEIF nKey == K_SPACE IF ! oGUI:DropDown ELSEIF ! oGUI:IsOpen oGUI:Open() nKey := 0 ENDIF [/pre2] Вроде работает ;)

Dima: Пробую там же переделать реакцию на ESC когда сижу внутри LISTBOX. Ранее по ESC закрывались все GET и из READ я выходил. Так мне не подходит. Сделал так [pre2] ELSEIF nKey == K_ESC if oGUI:Isopen .and. oGUI:DropDown OGui:Close() oGUI:Display() nKey := 0 endif [/pre2] Есть правда не увязочка. [pre2] {" 1. Не печатать",; " 2. 12 штук на A4 (70 x 65)",; " 3. 88 штук на A4 (25 x 25)",; " 4. 190 штук на A4 (15 x 20)",; " 5. 10 штук на A4 (50 x 90)"} ; Если я открыл LISTBOX и оказался на пункте 3 в LISTBOX , затем побегал в нем курсором и нажимаю ESC , хотелось бы снова оказаться на пункте 3 в GET , но реально попадаю на тот пункт который был выбран перед нажатием ESC. [/pre2]

Andrey: Вопрос про GET (что то не нашел сходу): Как для @ y,x GET "Список.........1" PUSHBUTTON сделать выход кроме ENTER еще по клавише F3 и F4 ?

Dima: set key -2 to hb_KeyPut(chr(13)) set key -3 to hb_KeyPut(chr(13)) твой GET set key -2 to set key -3 to ну или исходник переделать

Andrey: Dima пишет: set key -2 to hb_KeyPut(chr(13)) Тогда я потом не отловлю какая была нажата клавиша, для дальнейшего анализа ! Как то назначались такие действия, помню по Клиперу еще.

Dima: может тогда GetApplyKey(<Get-объект>,<INKEY-код>)

Andrey: Вот есть пример. ******************************************************************** FUNCTION Quest_My() LOCAL nY := 6, nX := 10, nY2 := 16, nX2 := 70, nI LOCAL lCancel := .T., lAns := .T., lOk := .T., nKey LOCAL lEditForm := .T., lPrint := .T., lEditShabl := .T. LOCAL cButtonClr := "15/3,0/12,4/15,12/3", cButtCol := "0/15" LOCAL nVar := 1, aGroup := {} , getlist := {}, nKnopka := 0 LOCAL cScrTemp := SaveScreen(,,,) , cColor := SETCOLOR() SETCOLOR("1/15,0/15,1/15,4/15,5/15,3/1,10/1,1/2") @ nY+2, nX+30 GET lEditForm PUSHBUTTON ; CAPTION " Открыть форму " ; STATE { || IsOk(@lAns, 1), ReadKill(.T.) } ; COLOR cButtonClr ; MESSAGE "Вызов редактора с формой" @ nY+4, nX+30 GET lPrint PUSHBUTTON ; CAPTION " Печать формы " ; STATE { || IsOk(@lAns, 1), ReadKill(.T.) } ; COLOR cButtonClr ; MESSAGE "Печатать форму на текущий принтер" @ nY+6, nX+30 GET lEditShabl PUSHBUTTON ; CAPTION " Редактировать шаблон " ; STATE { || IsOk(@lAns, 1), ReadKill(.T.) } ; COLOR cButtonClr ; MESSAGE "Редактировать шаблон формы в редакторе" @ nY+8, nX+30 GET lCancel PUSHBUTTON ; CAPTION " Выход " ; STATE { || IsOk(@lAns, 1), ReadKill(.T.) } ; COLOR cButtonClr ; MESSAGE "Выход из меню" READ MSG AT MAXROW(),0,MAXCOL() nKey := LASTKEY() @ 0,0 SAY "" ?? "KEY=",nKey, " lEditForm=",lEditForm," lPrint=",lPrint,"lEditShabl=",lEditShabl, "lCancel=",lCancel wait IF nKey == K_ESC nKnopka := 0 ELSEIF nKey == K_ENTER nKnopka := -13 ELSEIF nKey > 999 IF lEditForm == .F. nKnopka := 1 ELSEIF lPrint == .F. nKnopka := 2 ELSEIF lEditShabl == .F. nKnopka := 3 ELSEIF lCancel == .F. nKnopka := 0 ENDIF ELSE nKnopka := 0 ENDIF CLEAR GETS RestScreen(,,,, cScrTemp ) SETCOLOR( cColor ) Return nKnopka ************************************* STATIC Function IsOk(lAns, n) IF n == 1 lAns := .T. Else lAns := .F. ENDIF Return .T. Как сделать выход допустим по клавише F2 но чтобы по Lastkey() можно было потом определить, что была нажата клавиша F2 ?

Dima: Andrey пишет: Тогда я потом не отловлю какая была нажата клавиша, для дальнейшего анализа ! а если так private lF2:=.f. setkey(K_F3,{|| lF2:=.t., hb_Keyput(chr(13))} )

Andrey: Dima пишет: а если так private lF2:=.f. setkey(K_F3,{|| lF2:=.t., hb_Keyput(chr(13))} ) Спасибо, попробую !

Andrey: Делаю так: READ MSG AT MAXROW(),0,MAXCOL() IF lF2 == .t. CLEAR TYPEAHEAD HB_KeyPut(K_F3) ENDIF nKey := LASTKEY() nKey возвращает 13 ! Как правильно нужно сделать ?

Dima: Andrey пишет: IF lF2 == .t. Ну достаточно вот так IF LF2 Andrey пишет: IF lF2 == .t. CLEAR TYPEAHEAD HB_KeyPut(K_F3) ENDIF Уверен что условие срабатывает и LF2==.t. ?

Andrey: Dima пишет: Уверен что условие срабатывает и LF2==.t. ? Да ! Поставил туда ALERT("LF2==T") - срабатывает ! Вот исходник (только там я на F2 повесил обработку): ******************************************************************** FUNCTION Quest_My() LOCAL nY := 6, nX := 10, nY2 := 16, nX2 := 70, nI LOCAL lCancel := .T., lAns := .T., lOk := .T., nKey LOCAL lEditForm := .T., lPrint := .T., lEditShabl := .T. LOCAL cButtonClr := "15/3,0/12,4/15,12/3", cButtCol := "0/15" LOCAL nVar := 1, aGroup := {} , getlist := {}, nKnopka := 0 LOCAL cScrTemp := SaveScreen(,,,) , cColor := SETCOLOR() LOCAL lKeyF2 := .f. SetKey( K_F2,{|| lKeyF2:=.t., hb_Keyput(chr(13))} ) SETCOLOR("1/15,0/15,1/15,4/15,5/15,3/1,10/1,1/2") @ nY+2, nX+30 GET lEditForm PUSHBUTTON ; CAPTION " Открыть форму " ; STATE { || IsOk(@lAns, 1), ReadKill(.T.) } ; COLOR cButtonClr ; MESSAGE "Вызов редактора с формой" @ nY+4, nX+30 GET lPrint PUSHBUTTON ; CAPTION " Печать формы " ; STATE { || IsOk(@lAns, 1), ReadKill(.T.) } ; COLOR cButtonClr ; MESSAGE "Печатать форму на текущий принтер" @ nY+6, nX+30 GET lEditShabl PUSHBUTTON ; CAPTION " Редактировать шаблон " ; STATE { || IsOk(@lAns, 1), ReadKill(.T.) } ; COLOR cButtonClr ; MESSAGE "Редактировать шаблон формы в редакторе" @ nY+8, nX+30 GET lCancel PUSHBUTTON ; CAPTION " Выход " ; STATE { || IsOk(@lAns, 1), ReadKill(.T.) } ; COLOR cButtonClr ; MESSAGE "Выход из меню" READ MSG AT MAXROW(),0,MAXCOL() IF lKeyF2 == .t. ALERT("K_F2") CLEAR TYPEAHEAD HB_KeyPut(K_F2) ENDIF nKey := LASTKEY() @ 0,0 SAY "" ?? "KEY=",HB_NtoS(nKey), " lEditForm=",lEditForm," lPrint=",lPrint,"lEditShabl=",lEditShabl, "lCancel=",lCancel ? "lKeyF2=", lKeyF2 wait IF nKey == K_ESC nKnopka := 0 ELSEIF nKey == K_ENTER nKnopka := -13 ELSEIF nKey > 999 IF lEditForm == .F. nKnopka := 1 ELSEIF lPrint == .F. nKnopka := 2 ELSEIF lEditShabl == .F. nKnopka := 3 ELSEIF lCancel == .F. nKnopka := 0 ENDIF ELSE nKnopka := 0 ENDIF CLEAR GETS wait RestScreen(,,,, cScrTemp ) SETCOLOR( cColor ) Return nKnopka ************************************* STATIC Function IsOk(lAns, n) IF n == 1 lAns := .T. Else lAns := .F. ENDIF Return .T.

Dima: Andrey пишет: IF lKeyF2 == .t. ALERT("K_F2") CLEAR TYPEAHEAD HB_KeyPut(K_F2) ENDIF вот так IF lKeyF2 == .t. ALERT("K_F2") CLEAR TYPEAHEAD HB_KeyPut(K_F2) inkey(0.01) ENDIF

Andrey: Dima СПАСИБО ! Забыл уже про это...

Dima: А возможно ли в классе HBGetList , переопределить какой то METHOD на свой (со своими правками) не перебивая сам сырец класса HBGetList ?

fil: override

Dima: fil пишет: override Чуть подробнее можно (ни когда не юзал) ?

fil: Ovrerride metgod Имя_метода In Class Имя_класса with Своя_функция Все обращения к этому методу будут перенаправляться в свою функцию. Обычно override делается в Main

Dima: fil Пробну , спасибо !

Dima: Что то нормально не выходит. [pre2] #include "xhbcls.ch" #include "inkey.ch" proc main local aa:=1 local bb:="" cls OVERRIDE METHOD GUIApplyKey In Class HBGetList with METHOD MYTEST @ 13,45 ,17,55 get bb listbox {" TEST1 "," TEST2 "} ; DROPDOWN SCROLLBAR @ 14,27 say "TEST " get aa picture "999999" read return Func MYTEST(oGet, oGUI, nKey, oMenu, aMsg) // это полный аналог метода GUIApplyKey с моими правками *METHOD GUIApplyKey( oGet, oGUI, nKey, oMenu, aMsg ) CLASS HBGetList [/pre2] При нажатии пробела прога падает с месагой Error BASE/1003 Variable does not exist: SELF Что не так сделал ?

Dima: Разобрался (погуглив) В функцию MyTest добавляем строку LOCAl Self := HB_QSelf()

Dima: [pre2] n:=10 arr:={} for i=1 to 20 aadd(arr,padr(hb_ntos( i ),10)) next @ 11,35 ,16,64 get n listbox arr color "w/b,w/n,w+/BG,n/bg*,n/BG,w/B,GR+/BG,N/R" DROPDOWN SCROLLBAR read [/pre2] Если n равно 10 как в примере , то при раскрытии Listbox , курсора не видно и он не становится на нужный элемент. Ставлю n равное 2 например , все в порядке. Это лечится ?

Andrey: Dima пишет: 1. Как при входе в READ сразу оказаться на последнем GET c количеством копий ? Попробуй 2 раза сделать: HB_KeyPut( K_RIGHT ) HB_KeyPut( K_RIGHT )

Dima: Andrey пишет: HB_KeyPut( K_RIGHT ) Помогло но только вот так HB_KeyPut( K_UP ) HB_KeyPut( K_DOWN ) Пасиб за костыль

Haz: Оперативненько так Dima пишет: Отправлено: 15.03.13 11:51. Заголовок: Get Listbox Пара вопросов. Andrey пишет:  Отправлено: Сегодня 13:44. Заголовок: Dima пишет: 1. Как .. - новое! Попробуй 2 раза сделать:

Haz: Dima пишет: Пасиб за костыль Что то подсказывает что GetList обект имеет номер текущего Get объекта ::nPos . Ему передается фокус ввода ::setfocus() и далее что то типа ::reader() выполняет редактирование. может вместо костыля найти где установить это ::nPos Дим, скинь короткий примерчик, с батником для сборки. Могу поковырять ( у меня все под ГУЙ настроено c 2000 года, буду мучительно вспоминать как работать с консольным Get ).

Dima: Haz пишет: Дим, скинь короткий примерчик, с батником для сборки Dima пишет: n:=10 arr:={} for i=1 to 20 aadd(arr,padr(hb_ntos( i ),10)) next @ 11,35 ,16,64 get n listbox arr color "w/b,w/n,w+/BG,n/bg*,n/BG,w/B,GR+/BG,N/R" DROPDOWN SCROLLBAR read Если n равно 10 как в примере , то при раскрытии Listbox , курсора не видно и он не становится на нужный элемент. Ставлю n равное 2 например , все в порядке. А командная строка простая (например файл называется TEST.PRG) , тогда собираем так c:\hb32\bin\hbmk2.exe test PS К Harbour указываем свою дорогу

Haz: Haz пишет: Могу поковырять Вчера поковырял, глюк о котором говорил Дима имеет место быть когда инициирующий элемент в листбоксе по индексу более чем строк листбокса. В примере Димы строк 3 , а стартуем с 10 элемента и видим на экране 7,8,9 а вот 10 не прорисовывается . Причем любое действие с листбоксом ситуацию исправляет. Впечатление такое что при инициализации неверно расчитывается скоп диапазон , нужно 8-10 , а расчитан 7-9. Но само значение и внутренний индекс верны и указывают на 10. Посмотрел исходник , класс весь такой закрытый , весь протектед и к нему просто так не подъехать. Как вариант можно попробовать в блоке назначения :Reader := {|a,b,c,d | ... } поиграть c a и b Это примерно что и следующее : Дима переопределил метоl GuiApplyKey на свой и таким образом фиксит ситуацию каждый раз в цикле обработки нажатия клавиш. А посути проблема проявляется в методах :Display() или :Open() и переопредялять придется кого то из них, жаль что не подобраться к данными класса напрямую не меняя исходники.

Haz: Без правки исходников ListBox это глюк лечится так n:=10 arr:={} for i=1 to 20 aadd(arr,padr(hb_ntos( i ),10)) next @ 11,35 ,16,64 get n listbox arr color "w/b,w/n,w+/BG,n/bg*,n/BG,w/B,GR+/BG,N/R" DROPDOWN SCROLLBAR Atail(GetList):Reader := {|a,b,c,d| a:control:topitem(a:VarGet()), GuiReader(a,b,c,d ) } read

Haz: Последние исправления с учетом того что Дима написал мне в телегу [pre2] func main() n:=20 arr:={} for i=1 to 20 aadd(arr,padr(hb_ntos( i ),10)) next @ 11,35 ,16,64 get n listbox arr color "w/b,w/n,w+/BG,n/bg*,n/BG,w/B,GR+/BG,N/R" DROPDOWN SCROLLBAR Atail(GetList):Reader := {|a,b,c,d| __objAddMethod( a:control, "SetValue", @SetValue() ),; a:control:SetValue( a:VarGet() ) ,; GuiReader(a,b,c,d ) } read return nil Func SetValue( nPos ) local Self := hb_qSelf() local nRowCount := Self:nBottom - Self:nTop - 2 if ( Self:nItemCount - nPos ) < nRowCount Self:nTopItem := Self:nItemCount - nRowCount + if( nPos == Self:nItemCount, 1, 0) else Self:nTopItem := nPos end return nil [/pre2]

Dima: Haz Вот теперь все работает как надо Спасибо.



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