On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение



Пост N: 24
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 06.04.08 12:42. Заголовок: browse - выделение строк


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 18 [только новые]





Пост N: 25
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 06.04.08 17:22. Заголовок: Неужели никто с эти..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 26
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 09:09. Заголовок: Уважаемые мэтры..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 27
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 09:45. Заголовок: Мдааа..... :sm138: ..


Мдааа.....

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 760
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 07.04.08 10:19. Заголовок: valery2 пишет: Хоть..


valery2 пишет:

 цитата:
Хоть голос подайте


Базовыми средствами элемента управления Browse множественное выделение сейчас невозможно.
Но можно попробовать использовать служебное логическое поле для таких целей или, еще проще, саму метку Deleted у записи:
- пользователь помечает на удаление группу строк, а затем Вы их удаляете после его подтверждения.

valery2 пишет:

 цитата:
посмотри там


Можно глянуть пример demo.prg в папке samples\Basic\Browse_1



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 28
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 10:35. Заголовок: Уважаемый gfilatov ..


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

 цитата:
нужно отловить правый клик мышки


Спасибо

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 29
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 11:15. Заголовок: Вопрос ПРАВОГО ..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 30
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 11:25. Заголовок: Чувсвую себя ан....


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 31
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 11:53. Заголовок: :sm178: :sm155: :..




Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 761
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 07.04.08 12:09. Заголовок: valery2 пишет: нужн..


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)


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 32
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 12:15. Заголовок: СПАСИБО ОГРОМНО..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 33
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 12:45. Заголовок: Еще раз СПАСИБО. ..


Еще раз СПАСИБО. Весь пример не стал пробовать, а в существующий у меня 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
.........
.........

Слов нет !

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 34
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 13:58. Заголовок: Все оказалось не т..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 35
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 07.04.08 15:17. Заголовок: Все в порядке. Пр..


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

go MyWin.MyBrowse.VALUE

далее ваши действия.

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 762
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 07.04.08 17:29. Заголовок: valery2 пишет: перв..


valery2 пишет:

 цитата:
первой строкой нужно пустить


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


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 36
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 08.04.08 08:02. Заголовок: Просто, что-бы с..


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

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 763
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 08.04.08 11:54. Заголовок: valery2 пишет: есть..


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()

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 37
Зарегистрирован: 12.02.08
ссылка на сообщение  Отправлено: 08.04.08 13:02. Заголовок: Похоже, у меня се..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 35
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 15.06.09 12:46. Заголовок: Григорий!, а можно р..


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 381
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет