Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №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: PS Но тогда в класс TSBrowse добавить переменную надо DATA nLastIdColumn AS NUMERIC INIT 0 и в метод AddColumn и InsColumn добавить ведение этого счетчика, т.е. [pre2] 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 ... [/pre2]

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

SergKis: Игорь Не вижу в 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[pre2] 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 [/pre2] т.к. для колонки SELECTOR тогда может быть :nId := 0


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

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

SergKis: gfilatov2002 В догонку добавления [pre2] 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 ... [/pre2]

SergKis: PS Запустил с изменениями (выше) Tsb_MoreFields\demo.prg, получил лог [pre2] 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 [/pre2] В нем колонка SELECTOR нумеруется через счетчик, так что фантомную колонку можно -1 не делать, оставить 0 Какие мысли по этому варианту ?

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

SergKis: PS3 Наверно с nId := 0 для колонки SELECTOR лучше, лог выглядит так[pre2] .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 ... [/pre2] цветом :nId выделен. Если так лучше, то такая правка требуется [pre2] 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 ... [/pre2]

gfilatov2002: SergKis пишет: такая правка требуется METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse Записал в этом методе таким образом: [pre2]METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse ... If nPos == 1 .and. Len( ::aColumns ) > 1 .and. ::lSelector oColumn:nId := 0 Return Nil EndIf oColumn:nId := ++ ::nIdColumn ... [/pre2]

SergKis: gfilatov2002[pre2] 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 ...[/pre2]

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

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

SergKis: Haz пишет скажем -6 значит колонка с ID = 6 требует обновление hash. Для обновления надо метод написать, т.е. очищает или заполняет по имеющимся ключам hash, хотя последнее сделает DrawLine при прорисовке и отсутствию ключа в hash

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

SergKis: Haz пишет hash будет жить в объекте Tsbrowse ? Как его назовем и какова структура ? Мне пока такое лезет в голову[pre2] 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 ... [/pre2] Метод для очистки ::aFastDrawCell METOD FastDrawCell() INLINE ::aFastDrawCell := hb_Hash() Вызовы, как ты писал, в Refresh() поставить

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

SergKis: PS2 Попробовал по быстрому набрать, как писал выше, но такая правка[pre2] 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 [/pre2] попробовал пример Tsb_MoreFields\demo.prg, поставив :lFastDrawCell := .T. Что то отобразилось, но с искажениями после перемещений курсора. Я отключаюсь на несколько дней от темы.

Haz: SergKis пишет: А может и не в Refresh(), т.к. по :GoLeft(), :GoRight() очистки не должно быть. Тогда где ? [pre2] 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 ) [/pre2] и в двух методах GoLeft / GoRight поправить вызов Refresh() с учетом 3-го параметра

Haz: SergKis пишет: Попробовал по быстрому набрать, как писал выше, но такая правка Выложи исходники h_browse.prg и TColumn.prg. Я пока посмотрю что получается



полная версия страницы