Форум » GUI » browse - выделение строк » Ответить

browse - выделение строк

valery2: Может кто-нибудь сталкивался с данной проблемой ? Нужно выделить группу строк в Вrowse для удаления. Сразу скажу - Tbrowse отпадает ! (слишком много переделывать из наработанного ранее). Собственно, нужно отловить правый клик мышки. Помогите пожалуйста.

Ответов - 18

valery2: Неужели никто с этим не сталкивался ?

valery2: Уважаемые мэтры ! Хоть голос подайте - "посмотри там", "это невозможно" и т.д.

valery2: Мдааа.....


gfilatov: valery2 пишет: Хоть голос подайте Базовыми средствами элемента управления Browse множественное выделение сейчас невозможно. Но можно попробовать использовать служебное логическое поле для таких целей или, еще проще, саму метку Deleted у записи: - пользователь помечает на удаление группу строк, а затем Вы их удаляете после его подтверждения. valery2 пишет: посмотри там Можно глянуть пример demo.prg в папке samples\Basic\Browse_1

valery2: Уважаемый gfilatov , Ваши рекомендации по использованию служебного поля мне абсолютно ясны и неоспоримы. Вопрос в другом : нужно отловить правый клик мышки Спасибо

valery2: Вопрос ПРАВОГО клика в Browse - вопрос сразу двух принципов ! 1. Это стандарт выделений ( Total Commander и др.) 2. 2-ной ЛЕВЫЙ - основной способ редактирования.( хотя у меня есть вариант с этим способом, но см. выше) Судя по обсуждениям в разных разделах форума, многие работают с достаточно большими базами. Ну неужели ни у кого не возникала , при общении с юзерами , эта проблема? Просто не могу в это поверить !

valery2: Чувсвую себя ан... Тихо сам с собою...

valery2:

gfilatov: valery2 пишет: нужно отловить правый клик мышки Ниже рабочий пример, демонстрирующий идею: #include "minigui.ch" #include "Dbstruct.ch" Function Main Local bColor := { || if ( deleted() , RGB( 255, 0, 0 ) , RGB( 255, 255, 255 ) ) } Local var := 'Test' REQUEST DBFCDX SET EXCLUSIVE ON SET CENTURY ON SET DELETED OFF SET EVENTS FUNCTION TO MYEVENTS SET BROWSESYNC ON DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE 'Browse Demo' ; MAIN NOMAXIMIZE ; ON INIT OpenTable() ; ON RELEASE CloseTable() DEFINE MAIN MENU POPUP 'File' ITEM 'Append' ACTION Append_record() ITEM 'Delete/Undelete' ACTION Delete_record() SEPARATOR ITEM 'Exit' ACTION Form_1.Release END POPUP POPUP 'Help' ITEM 'About' ACTION MsgInfo ("MiniGUI Browse Demo") END POPUP END MENU DEFINE STATUSBAR STATUSITEM '' END STATUSBAR @ 10,10 BROWSE Browse_1 ; WIDTH 610 ; HEIGHT 313 ; HEADERS { 'X' , 'Code' , 'First Name' , 'Last Name', 'Birth Date', 'Married' , 'Biography' } ; WIDTHS { 30 , 150 , 150 , 150 , 150 , 150 , 150 } ; WORKAREA &var ; FIELDS {'Test->(iif(deleted(),"*"," "))' , 'Test->Code' , 'Test->First' , 'Test->Last' , 'Test->Birth' , 'Test->Married' , 'Test->Bio' } ; ON CHANGE ChangeTest() ; JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER,BROWSE_JTFY_CENTER} ; TOOLTIP 'Browse Test' ; DYNAMICBACKCOLOR { bColor, bColor, bColor, bColor, bColor, bColor, bColor } ; EDIT @ 350,150 BUTTON Button_1 ; CAPTION 'Append record' ; WIDTH 140 ; ACTION Append_record() ; TOOLTIP 'Append a new record' @ 350,300 BUTTON Button_2 ; CAPTION 'Delete/Undelete' ; WIDTH 140 ; ACTION Delete_record() ; TOOLTIP 'Delete / Recall the current record' END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil Procedure OpenTable() if !file("test.dbf") CreateTable() endif Use Test Index Code Via "DBFCDX" Go Top Form_1.Browse_1.Value := RecNo() Form_1.Browse_1.ColumnsAutoFitH Form_1.Browse_1.SetFocus Return Procedure CloseTable() Use Return Procedure ChangeTest() Form_1.StatusBar.Item(1) := 'RecNo: ' + Alltrim ( Str ( GetProperty ( 'Form_1', 'Browse_1', 'Value' ) ) ) Return Procedure Append_record() Local i := GetControlIndex ( "Browse_1", "Form_1" ), n Test->( DbGoBottom() ) n := Test->Code Test->( DbAppend() ) Test->Code := n + 1 Test->birth := date()-Max(10000, Random(20000))+Random(Test->( LastRec())) Form_1.Browse_1.Value := Test->( RecNo() ) _BrowseEdit ( _hmg_acontrolhandles , _HMG_acontrolmiscdata1 [4] , _HMG_acontrolmiscdata1 [5] , _HMG_acontrolmiscdata1 [3] , _HMG_aControlInputMask , .f. , _HMG_aControlFontColor ) Form_1.Browse_1.SetFocus Return Procedure Delete_record() iif(Test->(Deleted()), Test->(DbRecall()), Test->(DbDelete())) Form_1.Browse_1.Refresh Form_1.Browse_1.SetFocus Return Procedure CreateTable LOCAL aDbf[6][4] aDbf[1][ DBS_NAME ] := "Code" aDbf[1][ DBS_TYPE ] := "Numeric" aDbf[1][ DBS_LEN ] := 10 aDbf[1][ DBS_DEC ] := 0 // aDbf[2][ DBS_NAME ] := "First" aDbf[2][ DBS_TYPE ] := "Character" aDbf[2][ DBS_LEN ] := 25 aDbf[2][ DBS_DEC ] := 0 // aDbf[3][ DBS_NAME ] := "Last" aDbf[3][ DBS_TYPE ] := "Character" aDbf[3][ DBS_LEN ] := 25 aDbf[3][ DBS_DEC ] := 0 // aDbf[4][ DBS_NAME ] := "Married" aDbf[4][ DBS_TYPE ] := "Logical" aDbf[4][ DBS_LEN ] := 1 aDbf[4][ DBS_DEC ] := 0 // aDbf[5][ DBS_NAME ] := "Birth" aDbf[5][ DBS_TYPE ] := "Date" aDbf[5][ DBS_LEN ] := 8 aDbf[5][ DBS_DEC ] := 0 // aDbf[6][ DBS_NAME ] := "Bio" aDbf[6][ DBS_TYPE ] := "Memo" aDbf[6][ DBS_LEN ] := 10 aDbf[6][ DBS_DEC ] := 0 DBCREATE("Test", aDbf, "DBFCDX") Use test Via "DBFCDX" For i:= 1 To 100 append blank Replace code with i Replace First With 'First Name '+ Ltrim(Str(i)) Replace Last With 'Last Name '+ Ltrim(Str(i)) Replace Married With ( i/2 == int(i/2) ) replace birth with date()-Max(10000, Random(20000))+Random(LastRec()) Next i Index on code to code Use Return #define WM_NOTIFY 78 #define NM_CLICK (-2) #define NM_RCLICK (-5) #define LVN_BEGINDRAG (-109) *------------------------------------------------------------------------------* Function MyEvents ( hWnd, nMsg, wParam, lParam ) *------------------------------------------------------------------------------* Local i do case *********************************************************************** case nMsg == WM_NOTIFY ********************************************************************** i := Ascan ( _HMG_aControlHandles , GetHwndFrom (lParam) ) if i > 0 * Process Browse ..................................... if _HMG_aControlType = "BROWSE" * Browse Click ................................ If GetNotifyCode ( lParam ) == NM_CLICK .or. GetNotifyCode ( lParam ) == LVN_BEGINDRAG If LISTVIEW_GETFIRSTITEM ( _HMG_aControlHandles ) > 0 DeltaSelect := LISTVIEW_GETFIRSTITEM ( _HMG_aControlHandles ) - ascan ( _HMG_aControlRangeMax , _HMG_aControlValue ) _HMG_aControlValue := _HMG_aControlRangeMax [ LISTVIEW_GETFIRSTITEM ( _HMG_aControlHandles ) ] _BrowseVscrollFastUpdate ( i , DeltaSelect ) _BrowseOnChange (i) EndIf Return 0 ElseIf GetNotifyCode ( lParam ) == NM_RCLICK MsgInfo("Right mouse click!", "Info") Return 0 EndIf EndIf endif otherwise Events ( hWnd, nMsg, wParam, lParam ) endcase Return (0)

valery2: СПАСИБО ОГРОМНОЕ ! Немедленно начинаю пробовать!

valery2: Еще раз СПАСИБО. Весь пример не стал пробовать, а в существующий у меня MyEvents вставил : ....... ....... elseif GetNotifyCode ( lParam ) == NM_RCLICK i := Ascan( _HMG_aFormHandles , hWnd ) cFormName := if( i > 0, _HMG_aFormNames[ i ], "" ) i := Ascan( _HMG_aControlHandles, GetHwndFrom( lParam ) ) cControlName := if( i > 0, _HMG_aControlNames[ i ], "" ) if cFormName == "MyWin" .and. cControlName == "MyBrowse" result:= msginfo('!!!!!!!!!!!!!!!!!') else result:= Events ( hWnd, nMsg, wParam, lParam ) endif ......... ......... Слов нет !

valery2: Все оказалось не так просто... Пример тоже глючит. Такое ощущение, что нужен двойной правый клик: 1 - становится на запись, 2 - действие с этой записью. Или одним кликом: кнопка вниз - становится на запись, кнопка вверх - действие.

valery2: Все в порядке. Просто в ф-ции к-рая должна быть вместо msginfo(), первой строкой нужно пустить: go MyWin.MyBrowse.VALUE далее ваши действия.

gfilatov: valery2 пишет: первой строкой нужно пустить Для этих целей служит команда SET BROWSESYNC ON в вышеприведенном полностью рабочем примере.

valery2: Просто, что-бы совсем красиво - есть ли способ управления цветами курсора Browse ? Когда он стоит хоть на выделенной, хоть не на выделенной строке - все одним цветом, белый на синем, не очень наглядно.

gfilatov: valery2 пишет: есть ли способ управления цветами курсора Browse ? Да, необходимо использовать WinApi-сообщение NM_CUSTOMDRAW Посмотри пример здесь: http://subscribe.ru/archive/comp.soft.prog.winapifaq/200705/14095512.html А это готовый обработчик из HwGui: LRESULT ProcessCustomDraw( LPARAM lParam,PHB_ITEM pArray ) { LPNMLVCUSTOMDRAW lplvcd = ( LPNMLVCUSTOMDRAW ) lParam; PHB_ITEM pColor; switch( lplvcd->nmcd.dwDrawStage ) { case CDDS_PREPAINT : { return CDRF_NOTIFYITEMDRAW; } case CDDS_ITEMPREPAINT: { return CDRF_NOTIFYSUBITEMDRAW; } case CDDS_SUBITEM | CDDS_ITEMPREPAINT: { // LONG ptemp ; COLORREF ColorText ; COLORREF ColorBack ; pColor = hb_arrayGetItemPtr( pArray, lplvcd->iSubItem + 1 ); ColorText = ( COLORREF ) hb_arrayGetNL( pColor, 1 ); ColorBack = ( COLORREF ) hb_arrayGetNL( pColor, 2 ); lplvcd->clrText = ColorText; lplvcd->clrTextBk = ColorBack; return CDRF_NEWFONT; } } return CDRF_DODEFAULT; } HB_FUNC( PROCESSCUSTU ) { /* HWND hWnd = ( HWND ) hb_parnl( 1 ) ; */ LPARAM lParam = ( LPARAM ) hb_parnl( 2 ) ; PHB_ITEM pColor = hb_param( 3, HB_IT_ARRAY ); hb_retnl( ( LONG ) ProcessCustomDraw( lParam, pColor )); } Осталось только прикрутить в функцию MyEvents()

valery2: Похоже, у меня сегодня несварение мозгов нужно думать. ...... а времени нет ...........

alex_II: Григорий!, а можно разжевать совсем уж для чайника в Win API - Непонятно где и как указан цвет - Куда в функцию MyEvents это вставить Предел моих мечтаний маааленький рабочий пример Заранее спасибо



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