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


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




Пост N: 1613
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.09.20 16:05. Заголовок: SergKis пишет: IF..


SergKis пишет:

 цитата:
IF ( nType := Ascan( aType, {|e| e[1] == cType }) ) > 0
cType := aType[nType ][2]
ENDIF


Сергей, тогда потеряется это
 
ElseIf cType $ "^+"
cPicture := Replicate( '9', 10 )
EndIf


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




Пост N: 3396
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.09.20 18:37. Заголовок: Haz пишет тогда поте..


Haz пишет
 цитата:
тогда потеряется это


По правильному, надо выкинуть из массива стандартные значения, т.е.
{"C", "C"}, ; // Character
{"D", "D"}, ; // Date
{"T", "T"}, ; // Time
{"@", "T"}, ; // TimeStamp
{"=", "T"}, ; // ModTime
{"+", "N"}, ; // Autoinc
{"^", "N"}, ; // RowVersion
{"M", "M"}, ; // Memo
{"L", "L"} ; //
т.к. они будут браться из aStru[ nE, 2 ], не дали дописать, отвлекли

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




Пост N: 1614
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.09.20 19:08. Заголовок: SergKis пишет: надо..


SergKis пишет:

 цитата:
надо выкинуть из массива стандартные значения

Сергей я бы оставил. Так как в этом массиве? Будет ещё и тип valtype. Может пригодиться

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




Пост N: 3397
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.09.20 19:20. Заголовок: Haz пишет Сергей я б..


Haz пишет
 цитата:
Сергей я бы оставил. Так как в этом массиве? Будет ещё и тип valtype. Может пригодиться


Мне кажется это лишнее оставлять. Если убрать, то не теряются += и т.д., но если самому поставить свое значение, то оно сработает перекодировкой вместо стандартного. Т.е. мы ничего не теляем
В каком виде будет valtype ? Если в виде массива (второй элемент), то тогда наверно надо идти путем бока кода второй элемент и анализ возврата, если это массив, то возвращается Type и Valtype ..., хотя не знаю надо ли ?

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




Пост N: 3398
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.09.20 20:14. Заголовок: PS С Valtype можно п..


PS
С Valtype можно попробовать следующее
 
If nSize == Nil
cData := ( cAlias )->( FieldGet( nE ) )
// убрать совсем cType := aStru[ nE, 2 ]
IF cType != Valtype( cData ) .and. nType > 0
cType := Valtype( cData )
ENDIF

nSize := aStru[ nE, 3 ]
nDec := aStru[ nE, 4 ]
...


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




Пост N: 1615
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.09.20 20:31. Заголовок: SergKis пишет: В ка..


SergKis пишет:

 цитата:
В каком виде будет valtype

пока тоже не уверен как можно использовать. Просто в одном массиве соответствие всех типов для dbstruct и valtype

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




Пост N: 1793
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.09.20 20:31. Заголовок: SergKis пишет: ..


SergKis пишет:

 цитата:
// убрать совсем cType := aStru[ nE, 2 ]
IF cType != Valtype( cData ) .and. nType > 0
cType := Valtype( cData )
ENDIF


Ok, так и сделал

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




Пост N: 1616
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 29.09.20 17:59. Заголовок: Григорий, Можно в с..


Григорий,
Можно в сборке обновить rddads.lib до версии 12
Собрано под bcc82
https://drive.google.com/file/d/1TKuIGuCBsMjVe1b57IOipY8IJs9m1SYX/view?usp=sharing

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




Пост N: 1794
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 29.09.20 20:31. Заголовок: Haz пишет: обновить..


Haz пишет:

 цитата:
обновить rddads.lib до версии 12


Сделаю, конечно
Благодарю за помощь

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




Пост N: 1795
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.09.20 10:03. Заголовок: Всем кому это интересно


Выпустил 5-е обновление сборки 20.08 со всеми последними наработками

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




Пост N: 1617
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 30.09.20 17:51. Заголовок: Предлагаю еще одну п..


Предлагаю еще одну проблемку обсудить.
Суть в том то TSBrowse прорисовывается 2 раза
Первый раз тут
 
FUNCTION _EndTBrowse( bEnd )
*-----------------------------------------------------------------------------*
LOCAL i, oBrw
LOCAL oc := NIL, ow := NIL
#ifdef _OBJECT_
ow := oDlu2Pixel()
#endif

IF _HMG_BeginTBrowseActive
i := AScan( _HMG_aControlHandles, _HMG_ActiveTBrowseHandle )
IF i > 0
oBrw := _HMG_aControlIds[ i ]
oBrw:lRePaint := .T.
oBrw:Display()
_HMG_ActiveTBrowseName := ""
_HMG_ActiveTBrowseHandle := 0
_HMG_BeginTBrowseActive := .F.
#ifdef _OBJECT_
IF _HMG_lOOPEnabled
ow := _WindowObj( _HMG_aControlParenthandles[ i ] )
oc := _ControlObj( _HMG_aControlHandles [ i ] )
ENDIF
#endif
Do_ControlEventProcedure( bEnd, i, oBrw, ow, oc )
ENDIF
ENDIF

RETURN NIL



Второй раз из hantleevent по событию UPDATEWINDOW

чтобы это увидеть достаточно добавить в TSBrowse:DrawLine()
 
Default xRow := iif( ::lDrawHeaders, Max( 1, nRowPos ), nRowPos ), lDrawCell := ::lDrawLine

StrFile( hb_ntoc(++ nCount) + Chr(9) + hb_ntoc(xRow) + chr(9) + Procname(0) + hb_ntoc(ProcLine(0)) + chr(9) + Procname(1) + hb_ntoc(ProcLine(1)) + chr(9) + Procname(2) + hb_ntoc(ProcLine(2)) + chr(9) + Procname(3) + hb_ntoc(ProcLine(3)) + chr(9) + Procname(4) + hb_ntoc(ProcLine(4)) + chr(9) + Procname(5) + hb_ntoc(ProcLine(5)) + chr(9) + hb_eol(), "_DrawLine", .t. )

и посмотреть лог

Если на экране не один бровс и выборка данных для него не быстрая - начинает напрягать.

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

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




Пост N: 3399
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.09.20 18:31. Заголовок: Haz пишет Тупое комм..


Haz пишет
 цитата:
Тупое комментирование выделенных строк в _EndTBrowse на результат не повлияло, но прорисовка выполнилась один раз


Не все так просто с этим. Тоже смотре на это место, бывает даже с двойной прорисовкой получается ерунда в отображении, т.е. сетка строк сбита
(внизу дыра чуть ли не 2-3 строки, курсорная строка прорисована в 2х местах), добавляю в END TBROWSE ON END {|obr| ..., obr:Refresh() } и только
тогда получается правильная прорисовка всей сетки тсб. Если использовать :aRowPosAtRec[ xRow ], то приходится проверять соответствие тек. строки
массива ( RecNo() ) и тек. RecNo() базы, сталкивался не только с несовпадением, но и со значением Nil, т.е. ощущение что :DrawLine() перепрыгнула
запись в файле.
Но пробовать можно ускорять, добавив переменную типа DATA lSpeedDraw AS LOGICAL INIT .T. и проверять в END TBROWSE

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




Пост N: 3400
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.09.20 18:37. Заголовок: PS :DrawLine() еще п..


PS
:DrawLine() еще присутствует во всех :Go...() методах, т.е. одного END TBROWSE "маловато будет"

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




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


SergKis пишет:

 цитата:
т.е. одного END TBROWSE "маловато будет

да, заметил такое. Не дошел вчера. Иногда в проекте у себя вижу по 4 раза рисует.

::lSpedDraw действительно можно завести, чтобы тестировать оптимизацию прорисовки

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




Пост N: 3401
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.10.20 09:56. Заголовок: Haz пишет ::lSpedDra..


Haz пишет
 цитата:
::lSpedDraw действительно можно завести, чтобы тестировать оптимизацию прорисовки


Сейчас прорисовка осуществляется примерно так, от текущей записи (если курсор в середине окна тсб лучше видно)
к началу и потом от текущей к концу списка рисуемых строк. На мой взгляд это надо бы поменять, рисуя от первой
строки и до конца списка рисуемых строк (:nRowCount()). Тогда управлять проще, для этого и отладки вводил массив
:aRowPosAtRec, Tooltip на нем это побочное явление, но пока остановился на этом (упростить не получается), слишком
много прорисовки вызовов разбросано по тексту

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




Пост N: 1619
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 01.10.20 13:14. Заголовок: SergKis пишет: Сейч..


SergKis пишет:

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


Это точно? не нашел в коде такого алгоритма

Зато нашел лишнее
 
METHOD GoRight() CLASS TSBrowse

7884: Local nTxtWid, nWidth, nCell, nSkip, lRefresh := .F. добавить инициализацию .F.

7949: lRefresh := ( ::lCanAppend .or. ::lIsArr ) Лишняя строка , вызывает лишнюю прорисовку при работе метода


METHOD TSBrowse:PostEdit()
11552: SysRefresh() - тоже вроде как для подстраховки и вызывает прорисовку потестил без него - разницу не унюхал


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




Пост N: 3402
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.10.20 15:18. Заголовок: Haz пишет Это точно?..


Haz пишет
 цитата:
Это точно? не нашел в коде такого алгоритма


Ты прав, нет такого, визуально показалось, т.к. сначала перепоказ идет текущей строки, потом переход на первую на экране и рисование до нижней,
тек. уже нарисована и не меняется.

 цитата:
11552: SysRefresh() - тоже вроде как для подстраховки и вызывает прорисовку потестил без него - разницу не унюхал


Это скорее перепоказ изменившихся др. строк в общем доступе

Поправил в методе DrawLine
 
METHOD DrawLine( xRow, lDrawCell ) CLASS TSBrowse
...
If ::bOnDrawLine != Nil
Eval( ::bOnDrawLine, Self, xRow )
EndIf
...

Взял пример Tsb_MoreFields\demo.prg и добавил
 
#define _HMG_OUTLOG

#include "hmg.ch"
#include "TSBrowse.ch"
REQUEST DBFCDX

FUNCTION Main()

...
ON INIT {| ob | TsbCreate( ob, .T. ) }

:Cargo := oKeyData()

:lRowPosAtRec := .T.
:bTSDrawCell := {|ob,oc|
If oc:nDrawType == 0
? procname(1),procline(1),procname(2),procline(2),procname(3),procline(3),procname(4),procline(4),procname(5),procline(5)
?? " Col =",oc:nCell
EndIf
Return Nil
}
:bOnDrawLine := {|ob,xrow|
Local nRow := ob:nRowPos
Local nPos := ob:nCell
Local nLen := Len(ob:aRowPosAtRec)
// ? procname(1),procline(1),procname(2),procline(2),procname(3),procline(3),procname(4),procline(4),procname(5),procline(5)
? "xRow =",xrow,"nRowCount =",nLen,"nCell =",nPos,"nTek =",nRow,"RecNo ="
If nRow > 0 .and. nRow <= nLen
?? ob:aRowPosAtRec[ nRow ]
Else
?? "Error", nRow
EndIf
Return Nil
}

END TBROWSE ON END {| ob | TsbCreate( ob, .F. ) }
...

смотрю лог и в целом выглядит логично по отображению

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




Пост N: 1620
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 01.10.20 21:49. Заголовок: SergKis пишет: смот..


SergKis пишет:

 цитата:
смотрю лог и в целом выглядит логично по отображению

завтра погоняю твой пример

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




Пост N: 3403
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.10.20 12:14. Заголовок: Haz пишет погоняю тв..


Haz пишет
 цитата:
погоняю твой пример


Поправь еще в методе :DrawSelect()
 
METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse
...
ENDIF

If ::bOnDrawLine != Nil
Eval( ::bOnDrawLine, Self, xRow )
EndIf

If ! ::lDrawLine
nBegin := 1
nLastCol := ::nColCount()
EndIf
...

В примере добавь
STATIC FUNC myProc( n )
RETURN StrTran(Procname(n), "TSBROWSE:", ":")
и
:bTSDrawCell := {|ob,oc,ok|
If oc:nDrawType == 0
? myproc(1),procline(1),myproc(2),procline(2),myproc(3),procline(3),myproc(4),procline(4),myproc(5),procline(5)
?? oc:lDrawLine,"Col =",oc:nCell, ok:cName
EndIf
Return Nil
}
удобней смотреть будет


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




Пост N: 3404
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.10.20 12:16. Заголовок: PS :bOnDraw..


PS
 
:bOnDrawLine := {|ob,xrow|
Local nRow := ob:nRowPos
Local nPos := ob:nCell
Local nLen := Len(ob:aRowPosAtRec)
// ? procname(1),procline(1),procname(2),procline(2),procname(3),procline(3),procname(4),procline(4),procname(5),procline(5)
? "xRow =",xrow,"nRowCount =",nLen,"nCell =",nPos,"nTek =",nRow,"RecNo ="
If nRow > 0 .and. nRow <= nLen
?? ob:aRowPosAtRec[ nRow ]
Else
?? "Error nRow", nRow
EndIf
If xrow > 0 .and. xrow <= nLen
?? ob:aRowPosAtRec[ xrow ]
Else
?? "Error xrow", xrow
EndIf
Return Nil
}


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