Форум » [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

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 Вот теперь все работает как надо Спасибо.



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