Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] DEFINE TBROWSE oBrw2 ; AT 60,450 ; ALIAS cAlias ; OF Form1 ; WIDTH 330 ; HEIGHT 340 ; FONT "Verdana" ; SIZE 9 ; ON DBLCLICK CopyRec(); ON GOTFOCUS fModelo_Hab(2) ; AUTOFILTER ; CELLED EDIT; VALUE nRec; GRID [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

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

Dima: Долго играть не пришлось. Открыл бровс. Показания BITMAP в GDIVIEW 234 [0] Опустился стрелкой вниз на 5 строк в бровсе , получил 234 [+56] Еще 5 строк , 472 [+274] Похоже утечка с показом иконок и картинок в TsBrowse , но спешить с выводами не буду и проверю на примерах из поставки Минигуи.

Dima: Поигрался в свое проге + GDIVIEW В некоторых полях использую вывод BMP из ресурса. Заявлено примерно так [pre2] oBrw3:GetColumn( "dels" ):uBmpCell :={|| if( (oBrw3:calias)->dels,LOADIMAGE("wcanc"),NIL) } ......... oBrw3:GetColumn( "prm" ):uBmpCell :={|| if( !empty((oBrw3:calias)->prime),LOADIMAGE("rss_brw"),NIL) } [/pre2] В этом случае в GDIVIEW в колонке BitMap цифра постоянно растет , даже если закрыть окно с бровсом а после войти туда снова. При езде по самому бровсу эта цифра так же растет. Пробнул в LoadImage сунуть имя не существующего ресурса , показа картинок в этом случае нет что и понятно , но и утечки нет однако. Поюзал в такой связке примеры из Минигуи где картинка в бровс помещается не из ресурса а из файла на диске , в этом случае утечки так же нет.

Dima: Кажись понял Вот так не совсем верно oBrw3:GetColumn( "dels" ):uBmpCell :={|| if( (oBrw3:calias)->dels,LOADIMAGE("wcanc"),NIL) } Необходимо в самом начале проги сделать примерно так Public abmp3:={LOADIMAGE("wcanc"),LOADIMAGE("rss_brw")} а далее oBrw3:GetColumn( "dels" ):uBmpCell :={|| if( (oBrw3:calias)->dels,abmp3[1],NIL) } В этом случае таких глобальных утечек не будет. А так при езде по бровсу без этих изменений постоянно грузился новый экземпляр пикчи. PS Лень делать проверку , но думаю если устроить цикл от 1 до 5 тыщ (может больше) и в нем грузить одну и туже пикчу из ресурса с помощью LOADIMAGE , то прога "ляжет"..... Примеры типа TSB_CURSOR если долго их "напрягать" тоже лягут , так как при любом сдвиге записи в таблице постоянно грузится новый экземпляр Calendar.BMP , это хорошо видно в GDIVIEW.

ММК: Петр пишет: И что не нашли? TsBrows перестали использовать т.к. появился xBrows и вопросы отпали :)

gfilatov2002: Dima пишет: Примеры типа TSB_CURSOR если долго их "напрягать" тоже лягут Благодарю за сообщение! Поправил этот пример для новой сборки (см.ниже) [pre2]/* * MINIGUI - Harbour Win32 GUI library Demo * * Author: Igor Nazarov * * Revised by Grigory Filatov <gfilatov@inbox.ru> */ #include "minigui.ch" #include "TSBrowse.ch" MEMVAR aFont PROCEDURE Main PUBLIC aFont := {}, aBmp[ 1 ] SET DATE FORMAT 'DD.MM.YYYY' DEFINE FONT Font_1 FONTNAME "Times New Roman" SIZE 11 DEFINE FONT Font_2 FONTNAME iif( _HMG_IsXP, "Comic Sans MS", "MV Boli" ) SIZE 14 BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE WINDOW Form_0 ; TITLE "TsBrowse Double Cursor Demo" ; MAIN ; NOMAXIMIZE NOSIZE ; ON RELEASE DeleteObject( aBmp[ 1 ] ) DEFINE STATUSBAR STATUSITEM "Item 1" WIDTH 0 FONTCOLOR BLACK STATUSITEM "Item 2" WIDTH 230 FONTCOLOR BLACK STATUSITEM "Item 3" WIDTH 230 FONTCOLOR BLACK STATUSITEM "Item 4" WIDTH 230 FONTCOLOR BLACK DATE CLOCK KEYBOARD END STATUSBAR CreateBrowse() END WINDOW DoMethod( "Form_0", "Activate" ) RETURN FUNCTION CreateBrowse() LOCAL oBrw LOCAL i LOCAL aDatos := {} FOR i := 1 TO 1000 AAdd( aDatos, { i, RandStr( 30 ), Date() - i, if( i % 2 == 0, TRUE, FALSE ) } ) NEXT aBmp[ 1 ] := LoadImage( "Calendar.BMP" ) DEFINE TBROWSE oBrw AT 17, 0 ; OF Form_0 ; WIDTH Form_0.WIDTH - 2 * GetBorderWidth() ; HEIGHT Form_0.HEIGHT - GetTitleHeight() - GetTitleHeight() - ; GetProperty( "Form_0", "StatusBar", "Height" ) - 2 * GetBorderHeight() ; GRID ; SELECTOR TRUE; FONT "Arial" SIZE 12 oBrw:SetArray( aDatos, .T. ) oBrw:nWheelLines := 1 oBrw:nClrLine := COLOR_GRID oBrw:lNoChangeOrd := TRUE oBrw:lCellBrw := TRUE oBrw:lNoVScroll := TRUE oBrw:hBrush := CreateSolidBrush( 242, 245, 204 ) // prepare for showing of Double cursor AEval( oBrw:aColumns, {| oCol| oCol:lFixLite := oCol:lEdit := TRUE } ) // assignment of column's names oBrw:aColumns[ 1 ]:cName := "NUMBER" oBrw:aColumns[ 2 ]:cName := "TEXT" oBrw:aColumns[ 3 ]:cName := "DATE" oBrw:aColumns[ 4 ]:cName := "LOGIC" // the reference to columns by names oBrw:SetColSize( "NUMBER", 100 ) oBrw:SetColSize( "TEXT", 500 ) oBrw:SetColSize( "DATE", 200 ) // Checking the method nColumn() oBrw:SetColSize( oBrw:nColumn( "LOGIC" ), 300 ) // image with white backcolor looks similar to transparent oBrw:GetColumn( 'DATE' ):uBmpCell := {|| If( oBrw:lDrawSelect, aBmp[ 1 ], NIL ) } oBrw:GetColumn( 'NUMBER' ):nAlign := DT_CENTER oBrw:GetColumn( 'TEXT' ):nAlign := DT_LEFT oBrw:GetColumn( 'DATE' ):nAlign := DT_CENTER oBrw:GetColumn( 'LOGIC' ):nAlign := DT_CENTER oBrw:nAdjColumn := 3 oBrw:nHeightCell += 10 oBrw:nHeightHead += 5 oBrw:SetColor( { 1 }, { RGB( 0, 12, 120 ) } ) oBrw:SetColor( { 2 }, { RGB( 242, 245, 204 ) } ) oBrw:SetColor( { 5 }, { RGB( 0, 0, 0 ) } ) oBrw:SetColor( { 6 }, { {|a, b, c| IF( c:nCell == b, { RGB( 66, 255, 236 ), RGB( 111, 183, 155 ) }, ; { RGB( 255, 255, 255 ), RGB( 200, 200, 200 ) } ) } } ) // cursor backcolor oBrw:ChangeFont( {|| IF( oBrw:lDrawSelect, aFont[ 2 ], aFont[ 1 ] ) },, ) END TBROWSE RETURN NIL FUNCTION RandStr( nLen ) LOCAL cSet := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" LOCAL cPass := "" LOCAL i := 0 FOR i := 1 TO nLen cPass += SubStr( cSet, Random( 52 ), 1 ) NEXT RETURN cPass[/pre2]

Петр: Dima пишет: Кажись понял Глюки ушли совсем? P.S. Поздравляю с освоением нового инструмента - GDIVIEW

Andrey: ММК пишет: т.к. появился xBrows и вопросы отпали А портировать xBrows в МиниГуи возможно ? Ну там лицензия и т.д.

Петр: Andrey пишет: А портировать xBrows в МиниГуи возможно ? Ну там лицензия и т.д. Если у вас есть такая возможность, то портируйте, пожалуйста, click here или click here Там и лицензия позволяет, и многие были бы вам благодарны

Dima: Петр пишет: Глюки ушли совсем? P.S. Поздравляю с освоением нового инструмента - GDIVIEW Косяков больше не смог найти . Долго "ездил" , глюков нет. Отдал заказчику , пусть обкатают. Спасибо за наводку

Петр: Dima пишет: Косяков больше не смог найти . Долго "ездил" , глюков нет. Извините, конечно, за назойливость Костыль в виде таймера убран? Или еще нужен?

Dima: Петр пишет: Костыль в виде таймера убран? Или еще нужен? Как бы костыля и не было. Изначально таймер жил в Tsbrowse а после поселился в окне где живут дружно два бровса TS. Вся ситуация как бы была описана выше. На что намекаешь то ? :) Косяков и утечек не увидел.

Haz: Да по сути это и есть костыль т. к. заменяет обработку "отпускания" кнопки. И пока этот костыль нужен. и вариантов кроме таймера не предвидится Без этого "костыля" не понятно как организовать перерисовку подчиненных бровсоов, а если их "сто пятьсот" - главный бровс возмет приз Гинеса по тормозам при скипе

Петр: Dima пишет: На что намекаешь то ? :) Ни на что. Честно ! Если таймер используется только для синхронизации, то такое решение имеет право на существование.

Петр: Haz пишет: Без этого "костыля" не понятно как организовать перерисовку подчиненных бровсоов, Как бы задумывалось через SyncChild, а вот рациональный алгоритм для наступления этого события продумать не мешало бы.

Haz: Петр пишет: продумать не мешало бы. Петр, да ктож против. Мы все локально и у себя, пытаемся этот алгоритм найти. Многое предложил Сергей, кое что по мелочам я накидал, проф поправки есть и от тебя (сорь на брудершафт пока не пили, уверен не обидел) . Это все не системно. Может открыть тему Проблема TS - варианты - решение. Григорий один не вытянет. К примеру подтема "как сделать отображение подчиненного бровса по ОТПУСКАНЮ кнопки или отрыву пальца от колеса мыши? Один из вариантов - именно таймер, но ведь есть и другие. Вот в этой теме их и собирать. Пока по факту TS один из самых сильных инструментов в Minigui и.... один из самых непредсказуемых, применрно половина времени на разработку ПО уходит на борьбу с его сюрпризами

SergKis: Петр пишет Как бы задумывалось через SyncChild, а вот рациональный алгоритм для наступления этого события продумать не мешало бы. SyncChild метод ставит ::bChange, т.е. портит установленный, а практически в каждом тсб он занят. Даже этого достаточно, что бы метод не использовать. Haz пишет К примеру подтема "как сделать отображение подчиненного бровса по ОТПУСКАНЮ кнопки или отрыву пальца от колеса мыши? Тут больше гемороя, т.к. надо знать какому тсб и в какой ситуации, что посылать. По мне, наличие таймера на контроле (тсб в частности), вполне приемлемое решение. Принцип "все свое ношу с собой" в объекте, т.е. каждый тсб знает, что и при каких условиях надо делать\переотображать.

SergKis: PS По поводу обработчика в тсб. Можно добавить[pre2] DATA bEvents METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse Local nDelta, ix Default ::lNoPaint := .F., ; ::lDontChange := .F. If hb_IsBlock(::bEvents) If ! empty( EVal(::bEvents, Self, nMsg, nWParam, nLParam) ) RETURN 1 EndIf EndIf ... [/pre2]

ММК: Петр пишет: Если таймер используется только для синхронизации, то такое решение имеет право на существование. Для синхронизации есть ON CHANGE. С учетом того , что все другие бровсы работают нормально есть смысл посмотреть их и сравнить с TS. Ситуация меняется , если изменить алгоритм перерисовки. Менется , если убирать утечки памяти , хотя возникает она и без использования иконок. Мне кажется правильнее искать причину :) Ведь если оставлять этот бровс , то в него еще придется много чего добавлять , а с такими глюками это замок на песке.

Haz: ММК пишет: Для синхронизации есть ON CHANGE. к нему претензий, за исключением одной - не ловит ситуёвину ногда пользователь сел на кнопку и едет к примеру вниз не отпуская. Блок отрабатывает честно на каждом скипе, а если там перерисовка другого бровса или их несколько.... И пока вся эта гирлянда не отработает bChange не пустит на следующую запись. Причём это вполне рабочая ситуация, есть например реестр заказов, с каждым заказом связан его состав ( отдельный бровс) и графики платежей ( еще один). С каждым элементом состава заказа может быть связан технологический маршрут ( бровс по рабочим операциям на элемент заказа с контролем готовности). Чтото подобное делал и стандартный bChange доводил пользователя до истерики, ну не удобно ему поиском.... хочет нажать на кнопочку и следить глазами если не увидел сразу то так и будет ездить туда сюда. Все подчиненные запросы ( сижу на ADS SQL) отработывают мгновенно, а перерисовка всех бровсов не дает быстро ездить да и постоянное мелькание начинает бесить. Вот и возникает необходимость чтобы за этим bChange была слежка со стороны и игнорились слишком частые вызовы, а выполнялся только последний. Вот так и появился таймер.

Петр: SergKis пишет: SyncChild метод ставит ::bChange, т.е. портит установленный, а практически в каждом тсб он занят. Даже этого достаточно, что бы метод не использовать. " А в каких случаях можно использовать SyncChild()? Вот bChange с компанией используется как navigation codeblocks DATA bLine, bSkip, bGoTop, bGoBottom, ; bLogicLen, bChange // navigation codeblocks bLine, bLogicLen, bChange - это navigation codeblocks - ну тоже мало понятно



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