On-line: Andrey, SergKis, гостей 1. Всего: 3 [подробнее..]
АвторСообщение
постоянный участник


Пост 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 
ПрофильЦитата Ответить
Ответов - 289 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


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




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


Andrey пишет:

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

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

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




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


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

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




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


Andrey пишет:

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

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

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




Пост 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 
ПрофильЦитата Ответить
постоянный участник




Пост 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 
ПрофильЦитата Ответить
администратор




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


SergKis пишет:

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

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

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




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


SergKis пишет:

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


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



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




Пост 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 
ПрофильЦитата Ответить
администратор




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


SergKis пишет:

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

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

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




Пост 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 
ПрофильЦитата Ответить
администратор




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


SergKis пишет:

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

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

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

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

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




Пост 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 
ПрофильЦитата Ответить
постоянный участник




Пост 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 
ПрофильЦитата Ответить
администратор




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


SergKis пишет:

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

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

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




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


Haz пишет:

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


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



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




Пост 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 
ПрофильЦитата Ответить
администратор




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


SergKis пишет:

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


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

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




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



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


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

Спасибо: 0 
ПрофильЦитата Ответить
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 
ПрофильЦитата Ответить
постоянный участник




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


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


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

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

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