powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / DropUp в ComboBox
8 сообщений из 8, страница 1 из 1
DropUp в ComboBox
    #35487641
DropUp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Каким образом можно проверить то, что List в combobox активен или факт закрытия листа?
Имеется метод DropDown, а вот обратного метода (DropUp) нету.

Это нужно для внедрения Combobox на основе своего класса в Grid.
Не устраивает штатное поведение, когда по нажатию стрелок в НЕРАСКРЫТОМ комбобоксе происходит перебор значений, а не перемещение по гриду.

В DropDown выставить флаг, что список открыт, в KeyPress потом анализировать.
Вот только DropDown позволяет определить момент открытия листа, но как потом узнать что лист еще открыт? Может его закрыли кликнув на совершенно другом обьекте формы.
Короче не хватет логического свойства lOpenList.
...
Рейтинг: 0 / 0
DropUp в ComboBox
    #35487775
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DropUp но как потом узнать что лист еще открыт? Может его закрыли кликнув на совершенно другом обьекте формы.
Короче не хватет логического свойства lOpenList.
принудительно сбасывать пропертю в ЛостФокус()
...
Рейтинг: 0 / 0
DropUp в ComboBox
    #35488310
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> принудительно сбасывать пропертю в ЛостФокус()

А закрытие мышкой как отловишь?

В штатном комбобоксе нет такого свойства и в общем случае отследить
состояние листа (открыт/закрыт) невозможно


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DropUp в ComboBox
    #35488807
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galyamov Rinat
А закрытие мышкой как отловишь?
Posted via ActualForum NNTP Server 1.4
ключевое слово _принудительно_ А при выборе ессно обработка в Валиде() )
...
Рейтинг: 0 / 0
DropUp в ComboBox
    #35488832
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> ключевое слово _принудительно_ А при выборе ессно обработка в
> Валиде() )

Ну хорошо, Мышой закрыли, но лост фокус не сработал (кликнули в область
textbox`а или стрелочки рядом. List закрылся. Lostfocus не отработал.)

Вывод - в общем случае отследить НЕВОЗМОЖНО без определенного гемороя по
отслеживанию клавиатуры (тот же Esc), мыши и программной смены фокуса + еще
чего-нить.

Частные случаи без сомнения можно.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
DropUp в ComboBox
    #35489559
DropUp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде как решил. Поведение устраивает. Протестируйте, пожалуйста.

Вот, например, если был вызов мышей и ее указатель находится над открытым листом при перемещении по стрелкам Фокс теряется и не знает реагировать на мышу или на клавишные стрелки. Но значение исправно меняет. Это раздражающее поведение наблюдается и в свободном Комбобоксе.
Может как то можно это обойти?

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
...
Рейтинг: 0 / 0
DropUp в ComboBox
    #35490629
po2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
po2
Гость
http://sql.ru/forum
...
Рейтинг: 0 / 0
DropUp в ComboBox
    #35719657
I'm is Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень хорошо работает нижеследующее:

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()
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / DropUp в ComboBox
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]