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

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

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).

Ответов - 283, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

SergKis: Игорь, перенес метод в тек. версию и собрал твой пример - получилось не как в твоем примере. Двигаемся вниз курсором, не выходя за 1ый экран идем назад к 1ой записи slave передергивает записи. Глянул и у себя это место, поведение похоже. На родном примере такого нет. Что я потерял ? Пример с методом https://my-files.ru/21e5ya

SergKis: PS Отбой, потерял DO EVENTS, пока думал как записать в метод командой или функцией.

SergKis: PPS[pre2] ::lHitTop := ::lHitBottom := .F. DO EVENTS EndIf RETURN lRet[/pre2] все исправило во всех версиях и примерах


gfilatov2002: SergKis пишет: все исправило во всех версиях и примерах Это означает, что Вы рекомендуете использовать новую редакцию этого метода в следующей сборке Я правильно понял Кстати, уже добавил новый метод FilterFTS() в текущую сборку. Благодарю за помощь

SergKis: gfilatov2002 пишет Это означает, что Вы рекомендуете использовать новую редакцию этого метода в следующей сборке В своей версии метод заменил, собрал только один проект. В нем все поиски\подводы по запросам работают как надо, т.е. одинаково с предыдущим вариантом. При случае передам новую версию в работу клиенту и понаблюдаю. Если Игорь применит у себя метод в проекте, будет больше информации. Впечатление у меня положительное.

gfilatov2002: SergKis пишет: будет больше информации Тогда откладываем эти изменения для будущих сборок. Я тестировал новую редакцию этого метода на примере Tsb_seek_2 и при перемещении на начало таблицы, а затем добавлении записи по клавише F2 на экране появляется "мусор" после последней строки в базе. У текущего метода этой проблемы нет, хотя он и не сохраняет точное значение :nRowPos, как указывал Игорь.

Haz: gfilatov2002 пишет: Это означает, что Вы рекомендуете использовать новую редакцию этого метода в следующей сборке По коду эта редакция должна быть пошустрее предыдущей плюс управляемая позиция RowPos. У себя заменил в проекте но не методом а функцией. Пока никто не жалился.

Haz: gfilatov2002 пишет: при перемещении на начало таблицы, а затем добавлении записи по клавише F2 на экране появляется "мусор" Дома только с телефона читаю. Скорее связано с тем что после добавления бровс разбалансирован. т. е. ::nLen не пересчитан. Хотя могу и ошибаться. Завтра на работе посмотрю.

SergKis: Haz пишет т. е. ::nLen не пересчитан. Это тоже присутствует, но не главное: :nRowPos -> 1 :nRow факт -> от 1 до 14 и 14 + 1 -> EOF() :nRowCount() -> 25 вот мусор и остался 25 - 14 = 11 строк

SergKis: PS :nLen -> 502

Haz: SergKis пишет: вот мусор и остался 25 - 14 = 11 строк Значит вопрос в двух параметрах Refresh( p1, p2) Возможно следует добавить проверку сколько сколько строк после RowPos и сколько записей после nRec. Или просто заменить на Refresh(.T.,.T.) но это даст моргание.

SergKis: Haz пишет но это даст моргание В данной ситуации 14 стр. должна стать 25 и :nRowPos -> 12, т.е перепрыг курсора неизбежен Пост. моргания не хотелось бы

Haz: SergKis пишет: Пост. моргания не хотелось бы Сегодня добавлю проверку и пререрисовку только когда последняя запись не на RowCount()

SergKis: gfilatov2002 пишет Кстати, уже добавил новый метод FilterFTS() в текущую сборку По мне, в сборку надо вкл. и упрощенный фильтр :FilterRow(), т.к. это др. алгоритм, нежели в :SetFilter(...) с автоматическими scope внутри. У себя я включил такой вариант (scope вполне ставится до такого фильтра)[pre2] METHOD FilterRow( cFilter, lFocus ) CLASS TSBrowse LOCAL nLen := 0, cAlias := ::cAlias IF ! Empty(cFilter) ( cAlias )->( DbSetFilter( &("{||" + cFilter + "}"), cFilter ) ) ELSE ( cAlias )->( DbClearFilter() ) END ( cAlias )->( DbGotop() ) DO WHILE ( cAlias )->( !EOF() ) DO EVENTS nLen++ ( cAlias )->( DbSkip(1) ) ENDDO ( cAlias )->( DbGotop() ) DO EVENTS ::bLogicLen := {|| nLen } ::Reset() If ! empty(lFocus) ::SetFocus() EndIf RETURN Nil [/pre2]

gfilatov2002: SergKis пишет: в сборку надо вкл. и упрощенный фильтр Буду рассматривать Ваше предложение для будущих сборок, поскольку подготовка новой сборки уже завершена. Возник вопрос: почему Вы не используете для подсчета количества строк в фильтре функцию DbEval() с условием For вместо устаревшего перебора по всем строкам [pre2]... ( cAlias )->( DbGotop() ) DO WHILE ( cAlias )->( !EOF() ) DO EVENTS nLen++ ( cAlias )->( DbSkip(1) ) ENDDO ( cAlias )->( DbGotop() ) DO EVENTS [/pre2]

SergKis: gfilatov2002 пишет почему Вы не используете для подсчета количества строк в фильтре функцию DbEval() с условием For вместо устаревшего перебора по всем строкам 1. Для небольших баз "по быстрому" иногда использую, но в блок кода принудительно вставляю DoEvents(). 2. В localhost база (реальная) ~70 000 записей DbEval работает на 2-5 сек дольше, зависит еще от ширины базы

SergKis: PS Перебор можно оптимизировать, к примеру имея массив блоков кода, вместо длинного, сложного выражения фильтра:[pre2] DO WHILE ... FOR EACH b IN aBlock If Eval(b) EXIT EndIf NEXT SKIP ENDDO [/pre2]

Haz: Haz пишет: Сегодня добавлю проверку и перерерисовку только когда последняя запись не на RowCount() Добавил проверку на полную перерисовку [pre2] METHOD GotoRec( nRec, nRowPos ) CLASS TSBrowse LOCAL cAlias LOCAL nSkip := 0 LOCAL lMore := .T. LOCAL lSkip := .F. LOCAL lRet := .F. LOCAL lReCount := .F. If ::lIsDbf lRet := .T. cAlias := ::cAlias ::SetFocus() ::nLastPos := (cAlias)->( RecNo() ) hb_default( @nRowPos, ::nRowPos ) (cAlias)->( dbGoto(nRec) ) while !(cAlias)->(eof()) .and. nSkip < ( ::nRowCount() - nRowPos ) (cAlias)->( dbSkip(1) ) nSkip ++ end if (cAlias)->(Eof()) lReCount := .T. end (cAlias)->( dbGoto(nRec) ) nSkip := 0 ::nRowPos := 1 DO WHILE lMore (cAlias)->( dbSkip(-1) ) nSkip ++ lMore := !(cAlias)->(BOF()) .and. nSkip < nRowPos lSkip := !(cAlias)->(BOF()) ENDDO ::Refresh(lReCount, lReCount ) If lSkip ::Skip(nSkip) EndIf ::nRowPos := nSkip ::nAt := ::nLogicPos() ::ResetVScroll() If ::bChange != Nil Eval( ::bChange, Self, 0 ) EndIf ::lHitTop := ::lHitBottom := .F. do events EndIf RETURN lRet [/pre2]

SergKis: Игорь, в целом работает, но есть отличия, в твоем варианте удерживается :nRowPos и нижняя часть тсб остается пустой. Это видно если в примере tsb_seek__2 сделать (oBrw:cAlias)->( FieldPut( 1, 'Y_'+ProcName()+": "+strzero(nRec, 7) ) ) :nRowPos -> 1 + F2 ==> :nRowPos -> 1 и чисто после введенной строки. У меня в проекте подвод на последнем экране (там найдена позиция) происх. тоже самое. Это будет смущать и в первую очередь не меня. С последним экраном, режим передергивания должен был бы быть разрешенным, т.е. полное заполнение тсб

Haz: SergKis пишет: Это будет смущать и в первую очередь не меня. С последним экраном, режим передергивания должен был бы быть разрешенным, т.е. полное заполнение тсб Давай какой нить флажок добавим для этого ?



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