|
DropUp в ComboBox
|
|||
---|---|---|---|
#18+
Здравствуйте! Каким образом можно проверить то, что List в combobox активен или факт закрытия листа? Имеется метод DropDown, а вот обратного метода (DropUp) нету. Это нужно для внедрения Combobox на основе своего класса в Grid. Не устраивает штатное поведение, когда по нажатию стрелок в НЕРАСКРЫТОМ комбобоксе происходит перебор значений, а не перемещение по гриду. В DropDown выставить флаг, что список открыт, в KeyPress потом анализировать. Вот только DropDown позволяет определить момент открытия листа, но как потом узнать что лист еще открыт? Может его закрыли кликнув на совершенно другом обьекте формы. Короче не хватет логического свойства lOpenList. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2008, 14:28 |
|
DropUp в ComboBox
|
|||
---|---|---|---|
#18+
DropUp но как потом узнать что лист еще открыт? Может его закрыли кликнув на совершенно другом обьекте формы. Короче не хватет логического свойства lOpenList. принудительно сбасывать пропертю в ЛостФокус() ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2008, 15:08 |
|
DropUp в ComboBox
|
|||
---|---|---|---|
#18+
> принудительно сбасывать пропертю в ЛостФокус() А закрытие мышкой как отловишь? В штатном комбобоксе нет такого свойства и в общем случае отследить состояние листа (открыт/закрыт) невозможно Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2008, 17:58 |
|
DropUp в ComboBox
|
|||
---|---|---|---|
#18+
Galyamov Rinat А закрытие мышкой как отловишь? Posted via ActualForum NNTP Server 1.4 ключевое слово _принудительно_ А при выборе ессно обработка в Валиде() ) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2008, 08:07 |
|
DropUp в ComboBox
|
|||
---|---|---|---|
#18+
> ключевое слово _принудительно_ А при выборе ессно обработка в > Валиде() ) Ну хорошо, Мышой закрыли, но лост фокус не сработал (кликнули в область textbox`а или стрелочки рядом. List закрылся. Lostfocus не отработал.) Вывод - в общем случае отследить НЕВОЗМОЖНО без определенного гемороя по отслеживанию клавиатуры (тот же Esc), мыши и программной смены фокуса + еще чего-нить. Частные случаи без сомнения можно. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2008, 08:39 |
|
DropUp в ComboBox
|
|||
---|---|---|---|
#18+
Вроде как решил. Поведение устраивает. Протестируйте, пожалуйста. Вот, например, если был вызов мышей и ее указатель находится над открытым листом при перемещении по стрелкам Фокс теряется и не знает реагировать на мышу или на клавишные стрелки. Но значение исправно меняет. Это раздражающее поведение наблюдается и в свободном Комбобоксе. Может как то можно это обойти? create table test (cData C(20), cboValue I) insert into test (cData, cboValue) values ('Иванов',2) insert into test (cData, cboValue) values ('Петров',1) insert into test (cData, cboValue) values ('Сидоров',3) go top in 'test' *------------------------------------------------------------ oTestForm = createObject("TestForm") oTestForm .show(1) clear memory close all quit ********************************************************************* DEFINE CLASS cboDoljn AS cboForGrid RowSourceType = 1 PROCEDURE Init this.AddItem('Менеджер',1) this.AddItem('Инженер',2) this.AddItem('Рабочий',3) ENDPROC ENDDEFINE ********************************************************************* DEFINE CLASS cboForGrid AS combobox Style = 2 BorderStyle = 0 lOpenList = .F. *--------------------------------------------------------------------- Procedure MouseDown LPARAMETERS nButton, nShift, nXCoord, nYCoord If nButton = 1 This.lOpenList = !This.lOpenList EndIF EndPRoc *--------------------------------------------------------------------- PROCEDURE KeyPress LPARAMETERS nKeyCode, nShiftAltCtrl Local lcAlias,lcFields lcAlias = this.Parent.Parent.RecordSource lcFields = this.Parent.ControlSource Do case Case Inlist(nKeyCode,-3,32,160,152) && Открытие листа This.lOpenList = !This.lOpenList Case This.lOpenList = .T. .AND. Inlist(nKeyCode,13,32,27,23) && Выбор/Отказ This.lOpenList = .F. Case nKeyCode = 147 .AND. nShiftAltCtrl =2 ; .AND. !Empty(Eval(lcFields)) && Удаление (Ctrl + Del) Replace (lcFields) WITH 0 IN (lcAlias) Case This.lOpenList = .F. ; .AND. INLIST(nKeyCode,4,5,19,24,1,6,29,26,2,141,145) && Лист закрыт Nodefault Do case case nKeyCode = 29 && Ctrl+Home Go top in (lcAlias) case Inlist(nKeyCode,4,2) && Вправо keyBoard "{TAB}" case Inlist(nKeyCode,19,26) && Влево keyBoard "{BACKTAB}" case Inlist(nKeyCode,5,141) .AND. !BOF(lcAlias) && Вверх Skip - 1 in (lcAlias) case INLIST(nKeyCode,24,145) .And. !EOF(lcAlias) && Вниз Skip 1 in (lcAlias) EndCase Otherwise EndCase ENDPROC *----------------------------------------------------------------------------------- Procedure LostFocus This.lOpenList = .F. EndPRoc *------------------------------------------------------------ ENDDEFINE ************************************************************** DEFINE CLASS grdTest AS grid RecordSource = 'test' *--------------------------------------------------------- Procedure init this.Column2.Width = 100 With this.columns(2) .AddObject('cboDoljn','cboDoljn') .CurrentControl = 'cboDoljn' .Width = 100 .Sparse = .F. .cboDoljn.Visible = .T. EndWith EndProc EndDefine ************************************************************** DEFINE CLASS TestForm AS form Height = 300 Left = 10 Top = 10 Width = 350 Add object grdTest as grdTest with top = 10, left = 10, height = 200, width = 320 *--------------------------------------------------------------------- procedure QueryUnload thisform.release() endproc *--------------------------------------------------------------------- enddefine ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2008, 13:07 |
|
DropUp в ComboBox
|
|||
---|---|---|---|
#18+
http://sql.ru/forum ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2008, 19:50 |
|
DropUp в ComboBox
|
|||
---|---|---|---|
#18+
Очень хорошо работает нижеследующее: declare long GetWindowLong in Win32API integer, integer declare integer WindowFromPoint in Win32API integer, integer ************************** * ************************** FUNCTION Get_ComboBoxState LPARAMETERS toObject LOCAL llState, nTop, nLeft, nBottom nTop = ObjToDeskTop(toObject, 1) nLeft = ObjToDeskTop(toObject, 2) nBottom = ObjToDeskTop(toObject, 4) llState = .T. *** GetWindowLong(hwnd, -16) retrieves the window styles. IF BITTEST(GetWindowLong(WindowFromPoint(nLeft + 5, nBottom + 5), -16) ,31) OR ; BITTEST(GetWindowLong(WindowFromPoint(nLeft + 5, nTop - 5), -16), 31) *** Если в определенных точках (немного слева и сверху ComboBox или немного слева и снизу ComboBox) - раскрытый список - *** WindowStyle = MS_POPUP или WS_POPUP Or WS_BORDER Or WS_SYSMENU *** WAIT WINDOW NOWAIT 'Раскрыт...' + TIME() llState = .T. ELSE *** WAIT WINDOW NOWAIT 'Закрыт...' + TIME() llState = .F. ENDIF ********************* * ********************* FUNCTION ObjToDeskTop LPARAMETERS toObject, tnPosition LOCAL nTop, nLeft, nRight, nBottom, lIsTitleBar STORE .NULL. TO nTop, nLeft, nRight, nBottom IF TYPE("_Screen.ActiveForm") == "O" AND NOT IsNull(_Screen.ActiveForm) AND PCOUNT() > 1 AND TYPE("tnPosition") == "N" IF VAL(_VFP.Version) >= 8.0 lIsTitleBar = _Screen.ActiveForm.TitleBar = 1 ELSE lIsTitleBar = NOT (LEN(_Screen.ActiveForm.Caption) = 0 AND _Screen.ActiveForm.Closable = .F. AND _Screen.ActiveForm.ControlBox = .F. AND _Screen.ActiveForm.MaxButton = .F. AND _Screen.ActiveForm.MinButton = .F. AND _Screen.ActiveForm.Movable = .F.) ENDIF DO CASE CASE tnPosition = 1 IF _Screen.ActiveForm.WindowType = 0 && Host form is Modeless nTop = IIF(_Screen.ActiveForm.HalfHeightCaption, SYSMETRIC(34), IIF(lIsTitleBar, SYSMETRIC(9), 0)) + ; IIF(_Screen.ActiveForm.BorderStyle = 3, SYSMETRIC(4), SYSMETRIC(13)) + ; IIF(_Screen.ActiveForm.ShowWindow = 2, _Screen.ActiveForm.Top, OBJTOCLIENT(_Screen.ActiveForm, 1)) + 3 + ; ObjToClient(toObject, 1) && if there is a menu: + SYSMETRIC(20) ELSE && Host form is Modal nTop = IIF(_Screen.ActiveForm.HalfHeightCaption, SYSMETRIC(34), IIF(lIsTitleBar, SYSMETRIC(9), 0)) + ; IIF(_Screen.ActiveForm.BorderStyle = 3, SYSMETRIC(4), SYSMETRIC(13)) + ; OBJTOCLIENT(_Screen.ActiveForm, 1) + 3 + ; ObjToClient(toObject, 1) && if there is a menu: + SYSMETRIC(20) ENDIF CASE tnPosition = 2 IF _Screen.ActiveForm.WindowType = 0 && Host form is Modeless nLeft = IIF(_Screen.ActiveForm.BorderStyle = 3, SYSMETRIC(3), SYSMETRIC(12)) + ; IIF(_Screen.ActiveForm.ShowWindow = 2, _Screen.ActiveForm.Left, OBJTOCLIENT(_Screen.ActiveForm, 2)) + ; ObjToClient(toObject, 2) && Left ELSE && Host form is Modal nLeft = IIF(_Screen.ActiveForm.BorderStyle = 3, SYSMETRIC(3), SYSMETRIC(12)) + ; OBJTOCLIENT(_Screen.ActiveForm, 2) + ; ObjToClient(toObject, 2) && Left ENDIF CASE tnPosition = 3 nLeft = ObjToDeskTop(toObject, 2) nRight = nLeft + ObjToClient(toObject, 3) && Left + Width OTHERWISE nTop = ObjToDeskTop(toObject, 1) nBottom = nTop + ObjToClient(toObject, 4) ENDCASE ENDIF RETURN IIF(NOT TYPE("tnPosition") == "N", .NULL, ; IIF(tnPosition = 1, nTop, ; IIF(tnPosition = 2, nLeft, ; IIF(tnPosition = 3, nRight, nBottom)))) **************************** * cboF - класс на основе comboBox, можно поместить в контейнер **************************** ********* * DropDown ********* IF TYPE("This.Parent.tmrComboBoxState") == "O" This.Parent.tmrComboBoxState.Interval = 50 This.Parent.tmrComboBoxState.Enabled = .T. ENDIF *************** * DropUp - Создаем *************** This.ReadOnly = .T. && Если список закрыт, то всегда так ! This.ZOrder(1) && to Back - не обязательно! ******************************** tmrComboBoxState - Объект класса Timer, тоже в вышеуказанный контейнер! ******************************** ****** * Timer ****** *** WAIT WINDOW NOWAIT "Отслеживаю ReadOnly " + TIME() IF This.Parent.cboF.ReadOnly = .F. *** WAIT WINDOW NOWAIT "Проверка состояния " + TIME() IF Get_ComboBoxState(This.Parent.cboF) = .F. && Список закрыт (закрылся !) This.Parent.tmrComboBoxState.Enabled = .F. This.Parent.tmrComboBoxState.Interval = 0 && Выключили (Пусть будет так - правой рукой за левое ухо - почему то иногда This дает объект cboF, а не tmrComboBoxState) This.Parent.cboF.DropUp() && Установили cboF.ReadOnly = .T. и задвинули на задний план ! ENDIF ENDIF *** cboF.ReadOnly = .T. - установить *** Как раскрыть - контейнер.KeyPress() контейнер.MouseUp() ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2008, 12:46 |
|
|
start [/forum/topic.php?fid=41&fpage=140&tid=1586961]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
89ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 190ms |
0 / 0 |