Автор | Сообщение |
Vlad04
|
| постоянный участник
|
Пост N: 420
Зарегистрирован: 13.10.05
|
|
Отправлено: 19.12.13 18:16. Заголовок: TsBrowse в Минигуи (продолжение)
TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру цитата: | 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 |
| Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
Haz
|
| |
Пост N: 918
Зарегистрирован: 20.02.11
|
|
Отправлено: 30.04.16 22:56. Заголовок: SergKis пишет: Dest..
SergKis пишет: Надо тестить сработает ли при закрытии парент окна. Мож проще будет на само окно повесить. За идею спасибо
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 971
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.04.16 23:17. Заголовок: Haz пишет:сработает ..
Haz пишет: Думаю да, т.к. переменные объекта существуют, метотоды доступны и destroy() - собственный метод
|
|
|
Haz
|
| |
Пост N: 919
Зарегистрирован: 20.02.11
|
|
Отправлено: 30.04.16 23:34. Заголовок: SergKis пишет: Дума..
SergKis пишет: цитата: | Думаю да, т.к. переменные объекта существуют, метотоды доступны и destroy() - собственный метод |
| у пользователей свои понятия, хлоп крестом на главном окне и и насрать на все методы. Проверю,отпишусь )) правильнее все же ловить непосредственно изменение , а не аварийно при закрытии. в ТS есть все чтоб это поймать. Про Destroy() идея достойная, если не получится ловить процесс - использую ее
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 972
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.04.16 23:52. Заголовок: Haz пишет:у пользова..
Haz пишет: цитата: | у пользователей свои понятия, хлоп крестом на главном окне и и насрать на все методы |
| Используй ON INTERACTIVECLOSE <interactivecloseprocedure> , проверяя, наличие окон в _HMG_aFormNames, кроме майн и при наличии таковых, можно спросить о завершении или просто возвращать .F. - запрещая закрытие маин окна.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 973
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.04.16 23:59. Заголовок: Haz при нажатии кре..
Haz при нажатии креста в маин окне срабатывает ф-я ReleaseAllWindows()б а там цепочка WM_CLOSE, WM_DESTROY для контролов каждого окна, т.е. аварийного завершения нет, есть нормальное екстренное завершение всех окон.
|
|
|
Haz
|
| |
Пост N: 920
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.05.16 00:09. Заголовок: SergKis пишет: ON I..
SergKis пишет: Сергей , да это все понятно. пока попытаюсь найти подход как узнать в процессе, а не бороться с последствиями.Ведь может быть и так - пользователь надвигал колонок под себя , уснул на ночь ( оставил задачу и сбежал домой ) и в это время запустились регламентные процедуры на серваке. Все висячие задачи срублены и с ними потеряны все настройки. У меня может паранойя , я и так протоколирую ВСЕ действия каждого пользователя по изменению данных, хочу еще и за настройками шпионить . А то иногда приходят умники , типа пол дня неразгибаясь работали и ничего не сохранено, Когда ему весь лог вываливаешь из которог следует что он в носу ковырял пол дня - вопросы сразу исчезают
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 974
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.05.16 00:20. Заголовок: Haz пищет:хочу еще и..
Haz пищет: цитата: | хочу еще и за настройками шпионить |
| пробни тогда, мне тоже интересно (из протокола выше) что выйдет. TSBROWSE:HANDLEEVENT 514 WM_LBUTTONUP TCONTROL:HANDLEEVENT 514 WM_LBUTTONUP TSBROWSE:HANDLEEVENT 533 WM_CAPTURECHANGED // думаю это TCONTROL:HANDLEEVENT 533 WM_CAPTURECHANGED
|
|
|
Haz
|
| |
Пост N: 921
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.05.16 00:20. Заголовок: SergKis пишет: проб..
SergKis пишет: цитата: | пробни тогда, мне тоже интересно (из протокола выше) что выйдет. |
| договорились
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 975
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.05.16 00:41. Заголовок: Haz пишет:договорили..
Haz пишет: Но в реальности это столько мусора будет в логах ... может все таки кнопку (меню) для перевода в режим настройки (отключив др. режимы) и повторное нажатие для возврата в нормальный режим (сохранив настройки). тогда в журнале переход в настройки и завершение (ели было). я бы как то так шел.
|
|
|
Haz
|
| |
Пост N: 922
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.05.16 11:38. Заголовок: SergKis пишет: На м..
SergKis пишет: цитата: | На мой вхгляд мудришь, воспользуйся уже готовым METHOD Destroy() CLASS TSBrowse LOCAL i Default ::lDestroy := .F. If ::bDestroy != Nil Eval(::bDestroy, Self) EndIf |
| Где ты это нашел взял последний MG там и в помине нет bDestroy Или это было предложение поменять исходник ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 976
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.05.16 11:56. Заголовок: Haz пишет:Где ты это..
Haz пишет: Так в своей версии hmg, но уже так сроднился и забыл, что сам вставлял
|
|
|
|
Haz
|
| |
Пост N: 923
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.05.16 11:59. Заголовок: SergKis пишет: Так ..
SergKis пишет: цитата: | Так в своей версии hmg, но уже так сроднился и забыл, что сам вставлял |
| Как ты обновляешь MG этож надо незабыть все с чем сроднился )))
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 977
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.05.16 12:09. Заголовок: Haz пишет:надо незаб..
Haz пишет: цитата: | надо незабыть все с чем сроднился |
| Ты прав, надо и в принципе у меня у переменных класса отмечено (в destroy() пропустил повторно) 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 ...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 4889
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.05.16 16:25. Заголовок: Haz пишет: я и так ..
Haz пишет: цитата: | я и так протоколирую ВСЕ действия каждого пользователя по изменению данных, хочу еще и за настройками шпионить |
| Поправь исходники MiniGUI\SAMPLES\Advanced\Tsb_config, как себе сделаешь. Там я тоже делаю (Григорий помогал) сохранение колонок, шрифтов и размеров, но это давно было уже... Всем интересно будет знать - как правильно работать с Tsbrowse !
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 978
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.05.16 13:57. Заголовок: Григорий, предложени..
Григорий, предложение по методу DeleteRow, сейчас он возвращает Self, а сделать надо возврат логический, тогда упроститься использования в простых ситуациях. Скрытый текст
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
| Использование If oBrw:DeleteRow() ... EndIf
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 936
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.05.16 22:27. Заголовок: SergKis пишет: сдел..
SergKis пишет: цитата: | сделать надо возврат логический |
| Не вопрос, конечно, сделаю, если это полезно для работы с этим методом
|
|
|
Haz
|
| |
Пост N: 924
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.05.16 13:03. Заголовок: Haz пишет: Как отло..
Haz пишет: цитата: | Как отловить событие изменения ширины колонки мышкой? |
| Вобщем подобраться стандартными средствами удалось только через событие отпускания левой мыши с анализом позиции курсора ( в заголовке и какая колонка ). При этом есть погрешность позиции по горизонтали примерно в 10 пикселей, т.к. курсор WS имеет граничные допуски. Потестировал - не понравилось т.к. все же через событие мыши это не правильно. Все остальные попытки так или иначе требуют изменения исходников, поэтому решил если менять то менять правильно и адресно. в TsBrowse.prg добавил DATA bLineDrag DATA bColDrag и их обработку :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 :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 Теперь события изменения ширины колонки и перетаскивания колонки ловятся элементарно и автосохранение позиций и ширин делается тоже элементарно 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 - старый номер
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 979
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.16 15:49. Заголовок: Haz просьба добавит..
Haz просьба добавить Self в вызов блоков кода Eval( ::bLineDrag, nsCol, ( nsOldPixPos - nsWidth), Self ) Eval(::bColDrag, nDestCol, ::nDragCol, Self )
|
|
|
Haz
|
| |
Пост N: 925
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.05.16 18:11. Заголовок: SergKis пишет: прос..
SergKis пишет: цитата: | просьба добавить Self в вызов блоков кода |
| я то добавлю, не вопрос Ждем что Григорий скажет
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 937
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.05.16 18:33. Заголовок: Haz пишет: что Григ..
Haz пишет: Благодарю за помощь Конечно, я добавил обработку этих 2-х кодовых блоков в класс TsBrowse. Еще бы не помешал небольшой пример их использования...
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|