On-line: Andrey, SergKis, гостей 0. Всего: 2 [подробнее..]
АвторСообщение
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:....



Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


Haz
администратор




Пост N: 1755
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.09.21 08:42. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А как его поменять можно ?

Андрей, переменные есть , но это пустышки. Они нигде не используются, видимо автор так и не дошёл до этого. Цвет скролбара определяется темой виндовс и легких путей его поменять нет (так же как и титл окна ). Можно нарисовать свой класс по скроллбару , где будет обрабатываться цвет и размер, но такой подход потребует пересчета клиентской области окна бровса и корректировки многих методов опирающихся на эти размеры.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 7041
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.09.21 08:55. Заголовок: Понял, спасибо ! :s..


Понял, спасибо !

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1756
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.09.21 09:00. Заголовок: Andrey пишет: Понял..


Andrey пишет:

 цитата:
Понял, спасибо

чуть дописал выше

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1757
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.09.21 19:24. Заголовок: Haz пишет: спасибо,..


Haz пишет:

 цитата:
спасибо, посмотрю завтра


Сергей
посмотрел , попробуй в примере ( который ты правил ) перед тем как щелкнуть в ячейке, сдвинуть окно чуть в сторону . Во всех случаях GetCellInfo не попадет в координаты ( heading, cell, footing )
Нужна привязка к физическому положению парент окна
сегодня изобрел это ( физические , а не относительные координаты ячейки на экране , вне зависимости куда двинули окно с бровсем)
Скрытый текст



лень было для теста в класс заворачивать, а может и незачем. Плюс возвращаемое как по классике в массиве rect {nLeft, nTop, nRight, nBottom} Возвращает именно координаты ячейки ( без учета длинны поля редактирования т.к. это посчитал лишним )
параметры как у GetCellInfo() окно ячейки рисуется так ( плюс не стал пока заморачиваться с потерей фокуса )

Скрытый текст




гонял по всякому с 3DLook и без , в заголовках подвалах ячейках и пр . у меня все корректно рисует. Под 3DLook подбирал поправки попиксельно на большом экране

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3862
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.09.21 21:17. Заголовок: Haz пишет:посмотрел ..


Haz пишет:
 цитата:
посмотрел , попробуй в примере ( который ты правил ) перед тем как щелкнуть в ячейке, сдвинуть окно чуть в сторону


Улыбнуло Столько лет делал и не двигал никогда окно, клиенты похоже тоже.
Поправил метод в тсб.
 
METHOD GetCellInfo( nRowPos, nCell, lColSpecHd ) CLASS TSBrowse

LOCAL nI, nStartX := 0, oCol, cBrw, cForm //, ix
LOCAL nRow, nCol, nWidth, nHeight
LOCAL lHead := .F., lFoot := .F.
LOCAL oCell := TSBcell():New()
LOCAL aRect := {0,0,0,0}, y, x

GetWindowRect(::hWnd, aRect )

y := aRect[2] + 1
x := aRect[1] + 1

IF HB_ISLOGICAL( nRowPos )
IF nRowPos ; lHead := .T.
ELSE ; lFoot := .T.
ENDIF
nRowPos := NIL
lColSpecHd := .F.
ENDIF

DEFAULT nRowPos := ::nRowPos, ;
nCell := ::nCell, ;
lColSpecHd := .F.

cForm := ::cParentWnd
cBrw := ::cControlName
oCol := ::aColumns[ nCell ]

IF ::nFreeze > 0
FOR nI := 1 TO Min( ::nFreeze, nCell - 1 )
nStartX += ::GetColSizes()[ nI ]
NEXT
ENDIF

FOR nI := ::nColPos TO nCell - 1
nStartX += ::GetColSizes()[ nI ]
NEXT

IF lColSpecHd
nRow := ::nHeightHead + ::nHeightSuper + iif( oCol:l3DLook, 2, 0 )
nCol := nStartX + iif( oCol:l3DLook, 2, 0 )
nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 1 )
nHeight := ::nHeightSpecHd - iif( oCol:l3DLook, 1, -1 )
ELSE
nRow := nRowPos - 1
nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ;
::nHeightSuper + ::nHeightSpecHd + iif( oCol:l3DLook, 2, 0 )
nCol := nStartX + iif( oCol:l3DLook, 2, 0 )
nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 0 )
nHeight := ::nHeightCell - iif( oCol:l3DLook, 1, -1 )
ENDIF

IF oCol:nEditWidthDraw > 0
nWidth := oCol:nEditWidthDraw
If ! ::lNoVScroll
nWidth -= GetVScrollBarWidth()
ENDIF
ENDIF

IF lHead
nRow := ::nHeightSuper + iif( oCol:l3DLook, 2, 0 ) + 1
nHeight := ::nHeightHead
ELSEIF lFoot
nRow := _GetClientRect( ::hWnd )[ 4 ] - ::nHeightFoot + 1
nHeight := ::nHeightFoot
ENDIF

//ix := GetControlIndex( cBrw, cForm )
//IF _HMG_aControlContainerRow[ ix ] == -1
//nRow += ::nTop - 1
//nCol += ::nLeft
//ELSE
//nRow += _HMG_aControlRow[ ix ] - 1
//nCol += _HMG_aControlCol[ ix ]
//ENDIF

nRow += ::aEditCellAdjust[ 1 ]
nCol += ::aEditCellAdjust[ 2 ]
nWidth += ::aEditCellAdjust[ 3 ] + 2
nHeight += ::aEditCellAdjust[ 4 ]

oCell:nRow := nRow + y
oCell:nCol := nCol + x

oCell:nWidth := nWidth
oCell:nHeight := nHeight

RETURN oCell

Тогда в примере делаем
FUNCTION PrevEdit(xVal, oBrw)
LOCAL oCell := oBrw:GetCellInfo(oBrw:nRowPos)
LOCAL nY := oCell:nRow //+ oBrw:nHeightHead + 4
LOCAL nX := oCell:nCol
LOCAL nW := oCell:nWidth
LOCAL nH := oCell:nHeight
LOCAL oWnd, hWnd
LOCAL hOld := _HMG_InplaceParentHandle
LOCAL oParent := _WindowObj(oBrw:cParentWnd)
_HMG_InplaceParentHandle := oParent:Handle

DEFINE WINDOW Cell AT nY,nX WIDTH nW - 2 HEIGHT nH - 2 MODAL NOCAPTION ;
ON LOSTFOCUS oWnd:Release()
oWnd := ThisWindow.Object
hWnd := oWnd:Handle

END WINDOW

SetWindowLong(hWnd, GWL_STYLE, WS_BORDER)

_DefineHotKey ( "CELL" , 0 , VK_ESCAPE , {|| oWnd:Release() } )
_DefineHotKey ( "CELL" , 0 , VK_RETURN , {|| oWnd:Release() } )
Cell.Activate
oBrw:DrawSeLect() ; DO EVENTS

_HMG_InplaceParentHandle := hOld


RETURN .F.

Вроде, работает у меня, Глянь тоже

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1758
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.09.21 21:28. Заголовок: SergKis пишет: Врод..


SergKis пишет:

 цитата:
Вроде, работает у меня, Глянь тоже

да все работает.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1759
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.09.21 21:36. Заголовок: SergKis пишет: Врод..


SergKis пишет:

 цитата:
Вроде, работает у меня, Глянь тоже


у меня координаты ровнее в ячейку
сравни , я подбирал значения специально .Но главное что привязка к положению окна заработала
Скрытый текст



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3864
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.09.21 21:55. Заголовок: Haz пишет у меня коо..


Haz пишет
 цитата:
у меня координаты ровнее в ячейку


Возможно, это важно в каких то случаях.
В сущест. методе есть поправки на Edit режим
nRow += ::aEditCellAdjust[ 1 ]
nCol += ::aEditCellAdjust[ 2 ]
nWidth += ::aEditCellAdjust[ 3 ] + 2
nHeight += ::aEditCellAdjust[ 4 ]

Мне ни разу не понадобились ровные координаты ячейки для встраивания окна, всегда примерно получается.
Надо больше ячейки или если ячейка высокая (многострочная), то меньше (на половину или по App.Object:H1 для getbox, к примеру). Чаще надо сверху или снизу, справа или слева от ячейки давать окно для выбора из списка (что бы помещался список)

Можно оформить твою ф-ю как метод, если надо сделаю

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1760
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.09.21 21:59. Заголовок: SergKis пишет: Можн..


SergKis пишет:

 цитата:
Можно оформить твою ф-ю как метод, если надо сделаю

оформить в метод не сложно,да смысла нет. Просто пару раз наткнулся на выравнивание и везде подбором, вот и стало интересно можно ли автоматом в точку попасть

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3865
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.09.21 22:31. Заголовок: Haz пишет стало инт..


Haz пишет
 цитата:
стало интересно можно ли автоматом в точку попасть


Можно в метод добавить параметр и правку такую
 
METHOD GetCellInfo( nRowPos, nCell, lColSpecHd, lEditMode )
...
y := aRect[2] //+ 1
x := aRect[1] //+ 1
...
DEFAULT nRowPos := ::nRowPos, ;
nCell := ::nCell, ;
lColSpecHd := .F., ;
lEditMode := .T.

...
IF lEditMode
nRow += ::aEditCellAdjust[ 1 ]
nCol += ::aEditCellAdjust[ 2 ]
nWidth += ::aEditCellAdjust[ 3 ] + 2
nHeight += ::aEditCellAdjust[ 4 ]
ENDIF

...

В примере
 
FUNCTION PrevEdit(xVal, oBrw)
LOCAL oCell := oBrw:GetCellInfo(oBrw:nRowPos, , , .F.)
LOCAL nY := oCell:nRow //+ oBrw:nHeightHead + 4
LOCAL nX := oCell:nCol
LOCAL nW := oCell:nWidth
LOCAL nH := oCell:nHeight
LOCAL oWnd, hWnd
LOCAL hOld := _HMG_InplaceParentHandle
LOCAL oParent := _WindowObj(oBrw:cParentWnd)
_HMG_InplaceParentHandle := oParent:Handle

DEFINE WINDOW Cell AT nY,nX WIDTH nW HEIGHT nH MODAL NOCAPTION ;
...

Довольно точно дает ячейку, по мне

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1761
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.09.21 23:01. Заголовок: SergKis пишет: Можн..


SergKis пишет:

 цитата:
Можно в метод добавить параметр и правку такую

да, это будет использоваться.
SergKis пишет:

 цитата:
Довольно точно дает ячейку, по мне

в границы ячейки попиксельно попадает ? У меня при тесте было смещение снизу и вроде справа. 3dlook не проверял, в нем должно на пиксель внутрь со всех сторон уходить. Завтра посмотрю еще. В принципе думаю , что lEditmode практически всегда будет . f. т.к это окно пользователя и он сам определяет его размер под задачу.

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3866
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.09.21 23:20. Заголовок: Haz пишет в границы ..


Haz пишет
 цитата:
в границы ячейки попиксельно попадает ?


Что принимать за границы ячейки ? Внешние или внутренние размеры ?
В таком варианте окно встраивается по линиям ячейки, может width 1 пиксел справа не дотягивает (может, так мне кажется, глаз не алмаз у меня).
 цитата:
В принципе думаю , что lEditmode практически всегда будет . f. т.к это окно пользователя и он сам определяет его размер под задачу.


У меня, как раз, с окном такого плана lEditMode := .T., т.к. управляю установкой ::aEditCellAdjust, предварительно сохранив, что там есть и ставлю, что мне по ситуации надо с + или - значениями. Правда это в моей версии будет, тут можно ставить default lEditMode := .F., не принципиально. Если окно идет в высокую ячейку, высота ее больше высоты GetBox и он криво смотрится в таком виде (это имеет место, если клиент просит расстояние между текстами строк делать больше), то нужен lEditMode := .T. и установки в ::aEditCellAdjust для встраивания окна во внутрь ячейки (у себя делаю это автоматом сравнивая высоту ячейки и App.Object:H1 и заполняя ::aEditCellAdjust, если разница > 2 пикселей) или переносить алгоритм на окно.
В др. случаях нужно примерная левая или правая координата ячейки, для размещения окна списка, работа не закрывая ячейку

 цитата:
3dlook не проверял, в нем должно на пиксель внутрь со всех сторон уходить.


В методе есть учет и обработка 3Dlook, но не проверял и даже не смотрел с тех пор как набирал (копипастил из drawline, наверное)

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3867
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.09.21 02:20. Заголовок: Игорь Вот что получи..


Игорь
Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента.
Фонт может быть nSize := 11, пропорции похожие. Это с последними изм. MiniGui.lib
Пример тут https://TransFiles.ru/zyaq4
Это вариант oCell := oBrw:GetCellInfo(oBrw:nRowPos, , , .T.) он полностью закрывает ячейку (width += 2 есть)
при oCell := oBrw:GetCellInfo(oBrw:nRowPos, , , .F.) справа видна линия, не хватает width

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1762
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.09.21 08:11. Заголовок: SergKis пишет: Вот ..


SergKis пишет:

 цитата:
Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента.

ты маньяк, 2 часа ночи 😱. От Андрея дурных привычек нахватался ?
Сегодня посмотрю ближе к обеду наверное. В целом если с этим параметрам получаются родные координаты ячейки, то у пользователя даже сомнений не будет на счет единства интерфейса при редактировании.

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1764
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.09.21 08:40. Заголовок: Haz пишет: Вот что ..


Haz пишет:

 цитата:
Вот что получилось, очень похожее по размерам ячеек, к реальной работе тсб у клиента.


Сергей, вот тут поправь пожалста. В целом все ок
Скрытый текст



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3868
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.09.21 11:11. Заголовок: Haz пишет:вот тут по..


Haz пишет:
 цитата:
вот тут поправь


Поправил + вынес +2 к width на постоянку и default lEditMode := .F.
оба режима .T./.F. при не заданных ::aEditCellAdjust дают одинаковый результат
 
METHOD GetCellInfo( nRowPos, nCell, lColSpecHd, lEditMode ) CLASS TSBrowse

LOCAL nI, nStartX := 0, oCol, cBrw, cForm //, ix
LOCAL nRow, nCol, nWidth, nHeight
LOCAL lHead := .F., lFoot := .F.
LOCAL oCell := TSBcell():New()
LOCAL aRect := {0,0,0,0}, y, x

GetWindowRect(::hWnd, aRect )

y := aRect[2] //+ 1
x := aRect[1] //+ 1

IF HB_ISLOGICAL( nRowPos )
IF nRowPos ; lHead := .T.
ELSE ; lFoot := .T.
ENDIF
nRowPos := NIL
lColSpecHd := .F.
ENDIF

DEFAULT nRowPos := ::nRowPos, ;
nCell := ::nCell, ;
lColSpecHd := .F., ;
lEditMode := .F.


cForm := ::cParentWnd
cBrw := ::cControlName
oCol := ::aColumns[ nCell ]

IF ::nFreeze > 0
FOR nI := 1 TO Min( ::nFreeze, nCell - 1 )
nStartX += ::GetColSizes()[ nI ]
NEXT
ENDIF

FOR nI := ::nColPos TO nCell - 1
nStartX += ::GetColSizes()[ nI ]
NEXT

IF lColSpecHd
nRow := ::nHeightHead + ::nHeightSuper + iif( oCol:l3DLook, 2, 0 )
nCol := nStartX + iif( oCol:l3DLook, 2, 0 )
nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 1 )
nHeight := ::nHeightSpecHd - iif( oCol:l3DLook, 1, -1 )
ELSE
nRow := nRowPos - 1
nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ;
::nHeightSuper + ::nHeightSpecHd + iif( oCol:l3DLook, 1, 0 )
nCol := nStartX + iif( oCol:l3DLook, 2, -1 )
nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 4, 1 )
nHeight := ::nHeightCell - iif( oCol:l3DLook, 3, -1 )
ENDIF

IF oCol:nEditWidthDraw > 0
nWidth := oCol:nEditWidthDraw
If ! ::lNoVScroll
nWidth -= GetVScrollBarWidth()
ENDIF
ENDIF

IF lHead
nRow := ::nHeightSuper + iif( oCol:l3DLook, 2, 0 ) + 1
nHeight := ::nHeightHead
ELSEIF lFoot
nRow := _GetClientRect( ::hWnd )[ 4 ] - ::nHeightFoot + 1
nHeight := ::nHeightFoot
ENDIF

//ix := GetControlIndex( cBrw, cForm )
//IF _HMG_aControlContainerRow[ ix ] == -1
//nRow += ::nTop - 1
//nCol += ::nLeft
//ELSE
//nRow += _HMG_aControlRow[ ix ] - 1
//nCol += _HMG_aControlCol[ ix ]
//ENDIF

IF lEditMode
nRow += ::aEditCellAdjust[ 1 ]
nCol += ::aEditCellAdjust[ 2 ]
nWidth += ::aEditCellAdjust[ 3 ] //+ 2
nHeight += ::aEditCellAdjust[ 4 ]
ENDIF

oCell:nRow := nRow + y
oCell:nCol := nCol + x
oCell:nWidth := nWidth + 2
oCell:nHeight := nHeight

RETURN oCell

Пример тут https://TransFiles.ru/tqkss

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1766
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.09.21 11:15. Заголовок: SergKis пишет: Попр..


SergKis пишет:

 цитата:
Поправил + вынес +2 к width на постоянку и default lEditMode := .F.
оба режима .T./.F. при не заданных ::aEditCellAdjust дают одинаковый результат


у меня чего то не поменялось ничего по сравнению с предыдущим примером

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1767
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.09.21 11:22. Заголовок: Haz пишет: Поправил..



 цитата:
Поправил + вынес +2 к width


Все , нормально. Можно закончить на этом

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1924
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.09.21 11:41. Заголовок: Haz пишет: Можно за..


Haz пишет:

 цитата:
Можно закончить на этом


Благодарю за исправление
Добавил такое описание в текущий файл changelog:

 цитата:
* Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG:
- correction and added 4th parameter lEditMode in the method
GetCellInfo().
Suggested and contributed by Sergej Kiselev and Igor Nazarov.



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 3869
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.09.21 11:52. Заголовок: Haz пишет Все , норм..


Haz пишет
 цитата:
Все , нормально. Можно закончить на этом


Согласен. Пример без 3Dlook тут https://TransFiles.ru/nwmrr
Смущает только default lEditMode := .F., если кто уже что то делал с исп. ::aEditCellAdjus, то будет слом

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 307
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет