On-line: MIKHAIL, гостей 3. Всего: 4 [подробнее..]
АвторСообщение
gfilatov
модератор




Пост N: 699
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)


Начало темы находится здесь, а теперь

АНОНС * АНОНС * АНОНС * АНОНС * АНОНС

Готовится к опубликованию новая сборка №48, которая выйдет в конце недели.
Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне

Кратко, что нового:

- исправление обнаруженных ошибок и неточностей кода;
- новый класс HEADERIMAGE для Grid и Browse;
- свойство Address в Hyperlink может теперь открывать папку или файл на диске;
- добавлен NOTABSTOP класс для Browse;
- поддержка пользовательских компонентов (заимствована из оффициального релиза);
- расширения и исправления в библиотеках TsBrowse и PropGrid;
- обновлены сборки Харбор и HMGS-IDE;
- новые и обновленные старые примеры (как обычно ).




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


SergKis
постоянный участник




Пост N: 3432
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 15:35. Заголовок: PS Но тогда в класс ..


PS
Но тогда в класс TSBrowse добавить переменную надо
DATA nLastIdColumn AS NUMERIC INIT 0
и в метод AddColumn и InsColumn добавить ведение этого счетчика, т.е.
 
METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse

Local nI, nCell := ::nCell

oColumn:nId := ++ ::nLastIdColumn

If oColumn == Nil // if no Column object supplied
Return Nil // return nil instead of reference to object
EndIf
...
METHOD AddColumn( oColumn ) CLASS TSBrowse

Local nHeight, nAt, cHeading, cRest, nOcurs, ;
hFont := iif( ::hFont != Nil, ::hFont, 0 )

Default ::aColSizes := {}

oColumn:nId := ++ ::nLastIdColumn

...


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




Пост N: 1641
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.10.20 16:03. Заголовок: SergKis пишет: Но т..


SergKis пишет:

 цитата:
Но тогда в класс TSBrowse добавить переменную надо


если это единственный счетчик, который из TSColumn переезжает в TSBrowse как
DATA nLastIdColumn AS NUMERIC INIT 0
то да здесь правильнее, но из TSColumn:New() придется убрать ::nId := ... иначе будут переназначения

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




Пост N: 3433
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 16:44. Заголовок: Игорь Не вижу в TsCo..


Игорь
Не вижу в TsColumn ::nId := ..., совсем не находится nId, ::nId есть в TControl, но от него TsBrowse (ID TsBrowse понимаю), т.е.
можем спокойно для колонок в класс TsColumn добавить
DATA nId AS NUMERIC INIT 0 // ID column
а в TsBrowse ведение счетчика колонок, можно короче назвать
DATA nIdColumn AS NUMERIC INIT 0
и при добавлении\вставке колонок счетчик увеличиваем, не вижу что бы с чем то перекрывались
А фантомной колонке надо присвоить nId, наверно взять :nId := -1
 
If ::oPhant == Nil
// "Phantom" column; :nPhantom hidden IVar
::oPhant := TSColumn():New( "", ; // cHeading
{|| "" }, ; // bdata
nil, ; // cPicture
{ nClrText, nClrBack }, ; // aColors
nil, ; // aAlign
::nPhantom, ; // nWidth
nil, ; // lBitMap
nil, ; // lEdit
nil, ; // bValid
.T., ; // lNoLite
nil, ; // cOrder
nil, ; // cFooting
nil, ; // bPrevEdit
nil, ; // bPostEdit
nil, ; // nEditMove
nil, ; // lFixLite
{l3DLook}, ;
nil, ;
Self )
::oPhant:cName := "oPhant"
::oPhant:nId := -1
Else

т.к. для колонки SELECTOR тогда может быть :nId := 0

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




Пост N: 1800
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.10.20 17:09. Заголовок: SergKis пишет: в кл..


SergKis пишет:

 цитата:
в класс TsColumn добавить
DATA nId AS NUMERIC INIT 0 // ID column
а в TsBrowse ведение счетчика колонок, можно короче назвать
DATA nIdColumn AS NUMERIC INIT 0


Добавил эти изменения также

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




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


SergKis пишет:

 цитата:
и при добавлении\вставке колонок счетчик увеличиваем, не вижу что бы с чем то перекрывались
А фантомной колонке надо присвоить nId, наверно взять :nId := -1

тоже не увидел проблем

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




Пост N: 3434
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 17:37. Заголовок: gfilatov2002 В дого..


gfilatov2002
В догонку добавления
 
METHOD AddColumn( oColumn ) CLASS TSBrowse
...
Default ::aColSizes := {}

oColumn:nId := ++ ::nIdColumn

If oColumn:lDefineColumn
...
METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse
...

oColumn:nId := ++ ::nIdColumn

If oColumn:lDefineColumn
oColumn:DefColor( Self, oColumn:aColors )
oColumn:DefFont ( Self )
EndIf
...
METHOD DrawHeaders( lFooters, lDrawCell ) CLASS TSBrowse
...
::oPhant:cName := "oPhant"
::oPhant:nId := -1

...
METHOD DrawLine( xRow, lDrawCell ) CLASS TSBrowse
...
::oPhant:cName := "oPhant"
::oPhant:nId := -1

...
METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse
...
::oPhant:cName := "oPhant"
::oPhant:nId := -1

...


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




Пост N: 3435
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 18:02. Заголовок: PS Запустил с измене..


PS
Запустил с изменениями (выше) Tsb_MoreFields\demo.prg, получил лог Скрытый текст

В нем колонка SELECTOR нумеруется через счетчик, так что фантомную колонку можно -1 не делать, оставить 0
Какие мысли по этому варианту ?

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




Пост N: 3436
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 18:04. Заголовок: PS2 .F. Col = 1 ..


PS2
.F. Col = 1 82 SELECTOR 0.06
выделенное цветом это nId колонки SELECTOR

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




Пост N: 3437
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 18:20. Заголовок: PS3 Наверно с nId :=..


PS3
Наверно с nId := 0 для колонки SELECTOR лучше, лог выглядит так
 
.F. Col = 1 0 SELECTOR 0.06
.F. Col = 2 1 ID 0.06
.F. Col = 3 2 FIRST 0.06
.F. Col = 4 3 LAST 0.06
...

цветом :nId выделен. Если так лучше, то такая правка требуется
 
METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse

Local nI, nCell := ::nCell

If oColumn == Nil // if no Column object supplied
Return Nil // return nil instead of reference to object
EndIf

IF ! ( !Empty( oColumn:cName ) .and. oColumn:cName == "SELECTOR" )
oColumn:nId := ++ ::nIdColumn
ENDIF

...


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




Пост N: 1801
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.10.20 19:35. Заголовок: SergKis пишет: така..


SergKis пишет:

 цитата:
такая правка требуется

METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse


Записал в этом методе таким образом:
METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse 
...
If nPos == 1 .and. Len( ::aColumns ) > 1 .and. ::lSelector
oColumn:nId := 0
Return Nil
EndIf

oColumn:nId := ++ ::nIdColumn
...


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




Пост N: 3438
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 19:47. Заголовок: gfilatov2002 METHOD ..


gfilatov2002
 
METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse
...
If nPos == 1 .and. Len( ::aColumns ) > 1 .and. ::lSelector
oColumn:nId := 0
Return Nil
EndIf

Else
oColumn:nId := ++ ::nIdColumn
EndIf
...


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




Пост N: 1643
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.10.20 20:02. Заголовок: SergKis пишет: Если..


SergKis пишет:

 цитата:
Если так лучше, то такая правка требуется


Думаю все равно в каком порядке нумерация будет , главное больше 0. Тогда на отрицательные значения со временем можно дополнительный смысл возложить скажем -6 значит колонка с ID = 6 требует обновление hash. Или вообще не задумываться , просто ID > 0 и все. 😏

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




Пост N: 3439
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 20:23. Заголовок: Haz пишет Думаю все ..


Haz пишет
 цитата:
Думаю все равно в каком порядке нумерация будет , главное больше 0


nId == 0 это SELECTOR, так проще, если работать по nId, а проверять совсем не надо.
Колонки :nId == 0 и :nId == -1 надо в hash сохранять как все др. колонки, т.к. блоки кода в них тоже работают и проходят через метод :TSDrawCell(), а порядок это, действительно, все равно

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




Пост N: 3440
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 20:28. Заголовок: Haz пишет скажем -6 ..


Haz пишет
 цитата:
скажем -6 значит колонка с ID = 6 требует обновление hash.


Для обновления надо метод написать, т.е. очищает или заполняет по имеющимся ключам hash, хотя последнее
сделает DrawLine при прорисовке и отсутствию ключа в hash

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




Пост N: 1644
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.10.20 22:37. Заголовок: SergKis пишет: Для ..


SergKis пишет:

 цитата:
Для обновления надо метод написать

hash будет жить в объекте Tsbrowse ? Как его назовем и какова структура ?

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




Пост N: 3441
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.20 07:19. Заголовок: Haz пишет hash будет..


Haz пишет
 цитата:
hash будет жить в объекте Tsbrowse ? Как его назовем и какова структура ?


Мне пока такое лезет в голову
 
DATA lFastDrawCell AS LOGICAL INIT .F.
DATA aFastDrawCell INIT hb_Hash()
...
METHOD DrawLine( xRow, lDrawCell ) CLASS TSBrowse
...
Local nDeltaLen, xData, nAt, oCell, cCell
...
IF ::lRowPosAtRec
IF Empty( ::aRowPosAtRec ) .or. Len( ::aRowPosAtRec ) != ::nRowCount()
::aRowPosAtRec := Array( ::nRowCount() )
AFill( ::aRowPosAtRec, 0 )
ENDIF
IF ::nLen == 0 .or. xRow == 0 .or. xRow > Len( ::aRowPosAtRec )
ELSEIF ::lIsDbf
::aRowPosAtRec[ xRow ] := ( nAt := ( ::cAlias )->( RecNo() ) )
ELSEIF ::lIsArr
::aRowPosAtRec[ xRow ] := ( nAt := ::nAt )
ENDIF
ENDIF

If ::nLen > 0

IF nAt == NIL
nAt := iif( ::lIsDbf, ( ::cAlias )->( RecNo() ), ::nAt )
ENDIF

...
nJ := iif( nI < ::nColPos, nJ + 1, nI )

lSelected := iif( nJ == nLastCol, .F., lSelected )
oColumn := iif( nJ > Len( ::aColumns ), ::oPhant, ::aColumns[ nJ ] )
nDeltaLen := ::GetDeltaLen( nJ, nStartCol, nMaxWidth, aColSizes )

cCell := hb_ntos(nAt)+"."+hb_ntos(oColumn:nId)

IF ::lFastDrawCell
oCell := hb_HGetDef( ::aFastDrawCell, cCell, NIL )
IF ISOBJECT(oCell)
oCell:nRow := xRow
oCell:nCol := nStartCol
oCell:nWidth := aColSizes[ nJ ] + nDeltaLen
oCell:nHeight := ::nHeightCell
oCell:nCell := nJ
IF lDrawCell
::TSDrawCell( oCell, oColumn )
ENDIF
nStartCol += aColSizes[ nJ ] + nDeltaLen
LOOP
ENDIF
ENDIF

//If HB_ISNUMERIC( oColumn:nLineStyle )
// nLineStyle := oColumn:nLineStyle
//EndIf
nLineStyle := iif( HB_ISNUMERIC( oColumn:nLineStyle ), oColumn:nLineStyle, ::nLineStyle )

cPicture := ::cPictureGet( oColumn, nJ )
...
IF lDrawCell
::TSDrawCell( oColumn:oCell, oColumn )
IF ::lFastDrawCell
hb_HSet( ::aFastDrawCell, cCell, __objClone( oColumn:oCell ) )
ENDIF

ENDIF

nStartCol += aColSizes[ nJ ] + nDeltaLen
...

Метод для очистки ::aFastDrawCell
METOD FastDrawCell() INLINE ::aFastDrawCell := hb_Hash()
Вызовы, как ты писал, в Refresh() поставить

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




Пост N: 3442
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.20 07:23. Заголовок: PS А может и не в Re..


PS
А может и не в Refresh(), т.к. по :GoLeft(), :GoRight() очистки не должно быть.
Тогда где ?

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




Пост N: 3443
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.20 08:02. Заголовок: PS2 Попробовал по бы..


PS2
Попробовал по быстрому набрать, как писал выше, но такая правка
 
IF ::lFastDrawCell
oCell := hb_HGetDef( ::aFastDrawCell, cCell, NIL )
IF ISOBJECT(oCell)
oCell:nRow := xRow
oCell:nCol := nStartCol
oCell:nWidth := aColSizes[ nJ ] + nDeltaLen
oCell:nHeight := ::nHeightCell
oCell:nCell := nJ
oCell:hWnd := hWnd
oCell:hDC := hDC
oCell:xRow := xRow
oCell:nStartCol := nStartCol
oCell:nSize := aColSizes[ nJ ] + nDeltaLen
oColumn:oCell := oCell
IF lDrawCell
::TSDrawCell( oColumn:oCell, oColumn )
ENDIF
nStartCol += aColSizes[ nJ ] + nDeltaLen
LOOP
ENDIF
ENDIF

попробовал пример Tsb_MoreFields\demo.prg, поставив :lFastDrawCell := .T.
Что то отобразилось, но с искажениями после перемещений курсора.
Я отключаюсь на несколько дней от темы.

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




Пост N: 1645
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.10.20 09:21. Заголовок: SergKis пишет: А мо..


SergKis пишет:

 цитата:
А может и не в Refresh(), т.к. по :GoLeft(), :GoRight() очистки не должно быть.
Тогда где ?


 
METHOD Refresh( lPaint, lRecount, lClearHash ) CLASS TSBrowse

Default lPaint := .T., ;
lRecount := .F. ;
lClearHash := .T.

if lClearHsh
::aFastDrawCell:= hb_hash()
end

If ::lFirstPaint == Nil .or. ::lFirstPaint
Return 0
EndIf

If lRecount .or. Empty( ::nLen )
::nLen := iif( ::lIsDbf, ( ::cAlias )->( Eval( ::bLogicLen ) ), Eval( ::bLogicLen ) )
EndIf

::lNoPaint := .F.

Return ::Super:Refresh( lPaint )



и в двух методах GoLeft / GoRight поправить вызов Refresh() с учетом 3-го параметра

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




Пост N: 1646
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.10.20 09:24. Заголовок: SergKis пишет: Попр..


SergKis пишет:

 цитата:
Попробовал по быстрому набрать, как писал выше, но такая правка


Выложи исходники h_browse.prg и TColumn.prg. Я пока посмотрю что получается

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