Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] DEFINE TBROWSE oBrw2 ; AT 60,450 ; ALIAS cAlias ; OF Form1 ; WIDTH 330 ; HEIGHT 340 ; FONT "Verdana" ; SIZE 9 ; ON DBLCLICK CopyRec(); ON GOTFOCUS fModelo_Hab(2) ; AUTOFILTER ; CELLED EDIT; VALUE nRec; GRID [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Haz: SergKis пишет: Destroy() Надо тестить сработает ли при закрытии парент окна. Мож проще будет на само окно повесить. За идею спасибо

SergKis: Haz пишет:сработает ли Думаю да, т.к. переменные объекта существуют, метотоды доступны и destroy() - собственный метод

Haz: SergKis пишет: Думаю да, т.к. переменные объекта существуют, метотоды доступны и destroy() - собственный метод у пользователей свои понятия, хлоп крестом на главном окне и и насрать на все методы. Проверю,отпишусь )) правильнее все же ловить непосредственно изменение , а не аварийно при закрытии. в ТS есть все чтоб это поймать. Про Destroy() идея достойная, если не получится ловить процесс - использую ее


SergKis: Haz пишет:у пользователей свои понятия, хлоп крестом на главном окне и и насрать на все методы Используй ON INTERACTIVECLOSE <interactivecloseprocedure> , проверяя, наличие окон в _HMG_aFormNames, кроме майн и при наличии таковых, можно спросить о завершении или просто возвращать .F. - запрещая закрытие маин окна.

SergKis: Haz при нажатии креста в маин окне срабатывает ф-я ReleaseAllWindows()б а там цепочка WM_CLOSE, WM_DESTROY для контролов каждого окна, т.е. аварийного завершения нет, есть нормальное екстренное завершение всех окон.

Haz: SergKis пишет: ON INTERACTIVECLOSE Сергей , да это все понятно. пока попытаюсь найти подход как узнать в процессе, а не бороться с последствиями.Ведь может быть и так - пользователь надвигал колонок под себя , уснул на ночь ( оставил задачу и сбежал домой ) и в это время запустились регламентные процедуры на серваке. Все висячие задачи срублены и с ними потеряны все настройки. У меня может паранойя , я и так протоколирую ВСЕ действия каждого пользователя по изменению данных, хочу еще и за настройками шпионить . А то иногда приходят умники , типа пол дня неразгибаясь работали и ничего не сохранено, Когда ему весь лог вываливаешь из которог следует что он в носу ковырял пол дня - вопросы сразу исчезают

SergKis: Haz пищет:хочу еще и за настройками шпионить пробни тогда, мне тоже интересно (из протокола выше) что выйдет. TSBROWSE:HANDLEEVENT 514 WM_LBUTTONUP TCONTROL:HANDLEEVENT 514 WM_LBUTTONUP TSBROWSE:HANDLEEVENT 533 WM_CAPTURECHANGED // думаю это TCONTROL:HANDLEEVENT 533 WM_CAPTURECHANGED

Haz: SergKis пишет: пробни тогда, мне тоже интересно (из протокола выше) что выйдет. договорились

SergKis: Haz пишет:договорились Но в реальности это столько мусора будет в логах ... может все таки кнопку (меню) для перевода в режим настройки (отключив др. режимы) и повторное нажатие для возврата в нормальный режим (сохранив настройки). тогда в журнале переход в настройки и завершение (ели было). я бы как то так шел.

Haz: SergKis пишет: На мой вхгляд мудришь, воспользуйся уже готовым METHOD Destroy() CLASS TSBrowse LOCAL i Default ::lDestroy := .F. If ::bDestroy != Nil Eval(::bDestroy, Self) EndIf Где ты это нашел взял последний MG там и в помине нет bDestroy Или это было предложение поменять исходник ?

SergKis: Haz пишет:Где ты это нашел Так в своей версии hmg, но уже так сроднился и забыл, что сам вставлял

Haz: SergKis пишет: Так в своей версии hmg, но уже так сроднился и забыл, что сам вставлял Как ты обновляешь MG этож надо незабыть все с чем сроднился )))

SergKis: Haz пишет:надо незабыть все с чем сроднился Ты прав, надо и в принципе у меня у переменных класса отмечено (в destroy() пропустил повторно) [pre2] DATA bDestroy // BK 14.02.2015 DATA lKeyChar AS LOGICAL INIT .F. // BK .F. - KeyChar(...) execute отключение ... METHOD KeyChar( nKey, nFlags ) CLASS TSBrowse ... If ! ::lKeyChar // BK Return 0 ElseIf ::nUserKey == 255 // from KeyDown() method Return 0 EndIf ... [/pre2]

Andrey: Haz пишет: я и так протоколирую ВСЕ действия каждого пользователя по изменению данных, хочу еще и за настройками шпионить Поправь исходники MiniGUI\SAMPLES\Advanced\Tsb_config, как себе сделаешь. Там я тоже делаю (Григорий помогал) сохранение колонок, шрифтов и размеров, но это давно было уже... Всем интересно будет знать - как правильно работать с Tsbrowse !

SergKis: Григорий, предложение по методу DeleteRow, сейчас он возвращает Self, а сделать надо возврат логический, тогда упроститься использования в простых ситуациях. [pre2] METHOD DeleteRow(lAll) CLASS TSBrowse Local lRecall, lUpStable, nAt, nRowPos, nRecNo, lRefresh, cAlias, lEval, uTemp Local lReturn := .F. DEFAULT lAll := .f. If ! ::lCanDelete .OR. ::nLen == 0 // Modificado por Carlos - Erro Keychar Return lReturn // Self EndIf If ::lIsDbf cAlias := ::cAlias EndIf nRecNo := ( cAlias )->( RecNo() ) lRecall := ! Set( _SET_DELETED ) lUpStable := ! lRecall If ! ::lIsTxt If ::lConfirm .and. !lAll .and.; ! MsgYesNo( If( ::lIsDbf, ::aMsg[ 37 ], ::aMsg[ 38 ] ), ::aMsg[ 39 ] ) Return lReturn // Self EndIf If ::lAppendMode Return lReturn // Self EndIf ::SetFocus() If ::lIsDbf ( cAlias )->( DbGoTo( nRecNo ) ) EndIf Do Case Case ::lIsDbf lEval := .T. If ::bDelete != Nil lEval := Eval( ::bDelete, nRecNo, Self ) EndIf If ValType( lEval ) == "L" .and. ! lEval Return lReturn // Self EndIf if !("SQL" $ ::cDriver) If ! ( cAlias )->( RLock() ) MsgStop( ::aMsg[ 40 ] , ::aMsg[ 28 ] ) Return lReturn // Self EndIf endif If ! ( cAlias )->( Deleted() ) ( cAlias )->( DbDelete() ) lReturn := .T. if !("SQL" $ ::cDriver) ( cAlias )->( DbUnlock() ) endif ::nLen := ( cAlias )->( Eval( ::bLogicLen ) ) If lUpStable ( cAlias )->( DbSkip() ) lRefresh := ( cAlias )->( EOF() ) ( cAlias )->( DbSkip( -1 ) ) ::nRowPos -= If( lRefresh .and. ; ! ( cAlias )->( BOF() ), 1, 0 ) ::Refresh( .T. ) EndIf ElseIf lRecall ( cAlias )->( DbRecall() ) ( cAlias )->( DbUnlock() ) lReturn := .T. EndIf If ::lCanAppend .and. ::nLen == 0 ::nRowPos := ::nColPos := 1 ::PostMsg( WM_KEYDOWN, VK_DOWN, nMakeLong( 0, 0 ) ) EndIf If ::bPostDel != Nil Eval( ::bPostDel , Self ) EndIf ::lHasChanged := .T. Case ::lIsArr nAt := ::nAt nRowPos := ::nRowPos lEval := .T. If ::bDelete != Nil lEval := Eval( ::bDelete, nAt, lAll, Self ) EndIf If ValType( lEval ) == "L" .and. ! lEval Return lReturn // Self EndIf If lAll ::aArray := {} ::aSelected := {} Else ADel( ::aArray, nAt ) ASize( ::aArray, Len( ::aArray ) - 1 ) IF ::lCanSelect .and. Len( ::aSelected ) > 0 If ( uTemp := AScan( ::aSelected, nAt ) ) > 0 ADel( ::aSelected, uTemp ) ASize( ::aSelected, Len( ::aSelected ) - 1 ) EndIf AEval( ::aSelected, {|x,nEle| ::aSelected[nEle] := IF(x > nAt, x-1, x)} ) ENDIF EndIf If Len( ::aArray ) == 0 ::aArray := { AClone( ::aDefValue ) } ::lPhantArrRow := .T. If ::aArray[ 1, 1 ] == Nil ADel( ::aArray[ 1 ], 1 ) ASize( ::aArray[ 1 ], Len( ::aArray[ 1 ] ) - 1 ) EndIf EndIf If ::bPostDel != Nil Eval( ::bPostDel , Self ) EndIf lReturn := .T. ::lHasChanged := .T. ::nLen := Len( ::aArray ) ::nAt := Min( nAt, ::nLen ) ::nRowPos := Min( nRowPos, ::nLen ) ::Refresh( ::nLen < ::nRowCount() ) ::DrawSelect() Endcase Else ::SetFocus() ::DrawSelect() EndIf Return lReturn // Self [/pre2] Использование If oBrw:DeleteRow() ... EndIf

gfilatov2002: SergKis пишет: сделать надо возврат логический Не вопрос, конечно, сделаю, если это полезно для работы с этим методом

Haz: Haz пишет: Как отловить событие изменения ширины колонки мышкой? Вобщем подобраться стандартными средствами удалось только через событие отпускания левой мыши с анализом позиции курсора ( в заголовке и какая колонка ). При этом есть погрешность позиции по горизонтали примерно в 10 пикселей, т.к. курсор WS имеет граничные допуски. Потестировал - не понравилось т.к. все же через событие мыши это не правильно. Все остальные попытки так или иначе требуют изменения исходников, поэтому решил если менять то менять правильно и адресно. в TsBrowse.prg добавил [pre2] DATA bLineDrag DATA bColDrag [/pre2] и их обработку [pre2] :12077 If nColPixPos == Nil .and. nColInit == Nil // We have finish draging ::aColSizes[ nsCol ] -= ( nsWidth - nsOldPixPos ) ::aColumns[ nsCol ]:nWidth -= ( nsWidth - nsOldPixPos ) ::Refresh() if ValType(::bLineDrag) == "B" Eval( ::bLineDrag, nsCol, ( nsOldPixPos - nsWidth) ) end EndIf [/pre2] [pre2] :6986 // we gotta be on header row within listbox and not same colm If nClickRow == 0 .or. nClickRow == -2 if nColPix > ::nLeft .and. ::nDragCol != nDestCol If ::lMoveCols ::MoveColumn( ::nDragCol, nDestCol ) Else ::Exchange( ::nDragCol, nDestCol ) EndIf if ValType(::bColDrag) == "B" Eval(::bColDrag, nDestCol, ::nDragCol ) end elseif ::nDragCol = nDestCol If ::aColumns[ nDestCol ]:bHLClicked != Nil ::DrawHeaders() Eval( ::aColumns[ nDestCol ]:bHLClicked, nRowPix, nColPix, ::nAt, Self ) ::DrawHeaders() EndIf Endif EndIf EndIf EndIf [/pre2] Теперь события изменения ширины колонки и перетаскивания колонки ловятся элементарно и автосохранение позиций и ширин делается тоже элементарно [pre2] oBrw:bLineDrag := {|a,b| MsgDebug(oBrw:GetColumn(a):cName, b)} // где a - номер колонки в которой изменили ширину, b -на сколько изменили oBrw:bColDrag := {|a,b| MsgDebug(oBrw:GetColumn(a):cName, b, a)} // где a - новый номер колонки которую перетащили , b - старый номер [/pre2]

SergKis: Haz просьба добавить Self в вызов блоков кода Eval( ::bLineDrag, nsCol, ( nsOldPixPos - nsWidth), Self ) Eval(::bColDrag, nDestCol, ::nDragCol, Self )

Haz: SergKis пишет: просьба добавить Self в вызов блоков кода я то добавлю, не вопрос Ждем что Григорий скажет

gfilatov2002: Haz пишет: что Григорий скажет Благодарю за помощь Конечно, я добавил обработку этих 2-х кодовых блоков в класс TsBrowse. Еще бы не помешал небольшой пример их использования...



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