Автор | Сообщение |
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; - новые и обновленные старые примеры (как обычно ).
|
|
|
Ответов - 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 ...
|
|
|
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 := ... иначе будут переназначения
|
|
|
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
|
|
|
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 |
| Добавил эти изменения также
|
|
|
Haz
|
| |
Пост N: 1642
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.10.20 17:15. Заголовок: SergKis пишет: и пр..
SergKis пишет: цитата: | и при добавлении\вставке колонок счетчик увеличиваем, не вижу что бы с чем то перекрывались А фантомной колонке надо присвоить nId, наверно взять :nId := -1 |
|
тоже не увидел проблем
|
|
|
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 ...
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3435
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.10.20 18:02. Заголовок: PS Запустил с измене..
PS Запустил с изменениями (выше) Tsb_MoreFields\demo.prg, получил лог Скрытый текст
1 ID 2 FIRST 3 LAST 4 STREET 5 CITY 6 STATE 7 ZIP 8 HIREDATE 9 MARRIED 10 AGE 11 SALARY 12 FIRST2 13 LAST2 14 STREET2 15 CITY2 16 STATE2 17 ZIP2 18 HIREDATE2 19 MARRIED2 20 AGE2 21 SALARY2 22 FIRST3 23 LAST3 24 STREET3 25 CITY3 26 STATE3 27 ZIP3 28 HIREDATE3 29 MARRIED3 30 AGE3 31 SALARY3 32 FIRST4 33 LAST4 34 STREET4 35 CITY4 36 STATE4 37 ZIP4 38 HIREDATE4 39 MARRIED4 40 AGE4 41 SALARY4 42 FIRST5 43 LAST5 44 STREET5 45 CITY5 46 STATE5 47 ZIP5 48 HIREDATE5 49 MARRIED5 50 AGE5 51 SALARY5 52 FIRST6 53 LAST6 54 STREET6 55 CITY6 56 STATE6 57 ZIP6 58 HIREDATE6 59 MARRIED6 60 AGE6 61 SALARY6 62 FIRST7 63 LAST7 64 STREET7 65 CITY7 66 STATE7 67 ZIP7 68 HIREDATE7 69 MARRIED7 70 AGE7 71 SALARY7 72 FIRST8 73 LAST8 74 STREET8 75 CITY8 76 STATE8 77 ZIP8 78 HIREDATE8 79 MARRIED8 80 AGE8 81 SALARY8 .F. Col = 1 82 SELECTOR 0.06 .F. Col = 2 1 ID 0.08 .F. Col = 3 2 FIRST 0.08 .F. Col = 4 3 LAST 0.08 .F. Col = 5 4 STREET 0.08 .F. Col = 6 5 CITY 0.08 .F. Col = 7 6 STATE 0.08 .F. Col = 8 7 ZIP 0.08 .F. Col = 9 8 HIREDATE 0.08 .T. Col = 1 82 SELECTOR 0.08 .T. Col = 2 1 ID 0.08 .T. Col = 3 2 FIRST 0.08 .T. Col = 4 3 LAST 0.08 .T. Col = 5 4 STREET 0.08 .T. Col = 6 5 CITY 0.08 .T. Col = 7 6 STATE 0.08 .T. Col = 8 7 ZIP 0.08 .T. Col = 9 8 HIREDATE 0.09 .T. Col = 1 82 SELECTOR 0.09
| В нем колонка SELECTOR нумеруется через счетчик, так что фантомную колонку можно -1 не делать, оставить 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
|
|
|
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 ...
|
|
|
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 ...
|
|
|
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 ...
|
|
|
|
Haz
|
| |
Пост N: 1643
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.10.20 20:02. Заголовок: SergKis пишет: Если..
SergKis пишет: цитата: | Если так лучше, то такая правка требуется |
| Думаю все равно в каком порядке нумерация будет , главное больше 0. Тогда на отрицательные значения со временем можно дополнительный смысл возложить скажем -6 значит колонка с ID = 6 требует обновление hash. Или вообще не задумываться , просто ID > 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(), а порядок это, действительно, все равно
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3440
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.10.20 20:28. Заголовок: Haz пишет скажем -6 ..
Haz пишет цитата: | скажем -6 значит колонка с ID = 6 требует обновление hash. |
| Для обновления надо метод написать, т.е. очищает или заполняет по имеющимся ключам hash, хотя последнее сделает DrawLine при прорисовке и отсутствию ключа в hash
|
|
|
Haz
|
| |
Пост N: 1644
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.10.20 22:37. Заголовок: SergKis пишет: Для ..
SergKis пишет: цитата: | Для обновления надо метод написать |
|
hash будет жить в объекте Tsbrowse ? Как его назовем и какова структура ?
|
|
|
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() поставить
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3442
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.20 07:23. Заголовок: PS А может и не в Re..
PS А может и не в Refresh(), т.к. по :GoLeft(), :GoRight() очистки не должно быть. Тогда где ?
|
|
|
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. Что то отобразилось, но с искажениями после перемещений курсора. Я отключаюсь на несколько дней от темы.
|
|
|
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-го параметра
|
|
|
Haz
|
| |
Пост N: 1646
Зарегистрирован: 20.02.11
|
|
Отправлено: 08.10.20 09:24. Заголовок: SergKis пишет: Попр..
SergKis пишет: цитата: | Попробовал по быстрому набрать, как писал выше, но такая правка |
| Выложи исходники h_browse.prg и TColumn.prg. Я пока посмотрю что получается
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|