Автор | Сообщение |
Vlad04
|
| постоянный участник
|
Пост N: 420
Зарегистрирован: 13.10.05
|
|
Отправлено: 19.12.13 18:16. Заголовок: TsBrowse в Минигуи (продолжение)
TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру цитата: | 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 |
| Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
Dima
|
| |
Пост N: 6197
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.16 18:56. Заголовок: Долго играть не приш..
Долго играть не пришлось. Открыл бровс. Показания BITMAP в GDIVIEW 234 [0] Опустился стрелкой вниз на 5 строк в бровсе , получил 234 [+56] Еще 5 строк , 472 [+274] Похоже утечка с показом иконок и картинок в TsBrowse , но спешить с выводами не буду и проверю на примерах из поставки Минигуи.
|
|
|
Dima
|
| |
Пост N: 6198
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.12.16 14:58. Заголовок: Поигрался в свое про..
Поигрался в свое проге + GDIVIEW В некоторых полях использую вывод BMP из ресурса. Заявлено примерно так oBrw3:GetColumn( "dels" ):uBmpCell :={|| if( (oBrw3:calias)->dels,LOADIMAGE("wcanc"),NIL) } ......... oBrw3:GetColumn( "prm" ):uBmpCell :={|| if( !empty((oBrw3:calias)->prime),LOADIMAGE("rss_brw"),NIL) } В этом случае в GDIVIEW в колонке BitMap цифра постоянно растет , даже если закрыть окно с бровсом а после войти туда снова. При езде по самому бровсу эта цифра так же растет. Пробнул в LoadImage сунуть имя не существующего ресурса , показа картинок в этом случае нет что и понятно , но и утечки нет однако. Поюзал в такой связке примеры из Минигуи где картинка в бровс помещается не из ресурса а из файла на диске , в этом случае утечки так же нет.
|
|
|
Dima
|
| |
Пост N: 6199
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.12.16 15:42. Заголовок: Кажись понял :sm12:..
Кажись понял Вот так не совсем верно 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.
|
|
|
ММК
|
| постоянный участник
|
Пост N: 260
Зарегистрирован: 29.05.10
|
|
Отправлено: 15.12.16 16:24. Заголовок: Петр пишет: И что н..
Петр пишет: TsBrows перестали использовать т.к. появился xBrows и вопросы отпали :)
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 1055
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.12.16 16:50. Заголовок: Dima пишет: Примеры..
Dima пишет: цитата: | Примеры типа TSB_CURSOR если долго их "напрягать" тоже лягут |
| Благодарю за сообщение! Поправил этот пример для новой сборки (см.ниже) Скрытый текст
/* * 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
|
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1376
Зарегистрирован: 09.10.06
|
|
Отправлено: 16.12.16 19:15. Заголовок: Dima пишет: Кажись ..
Dima пишет: Глюки ушли совсем? P.S. Поздравляю с освоением нового инструмента - GDIVIEW
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 5253
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.12.16 19:15. Заголовок: ММК пишет: т.к. поя..
ММК пишет: цитата: | т.к. появился xBrows и вопросы отпали |
| А портировать xBrows в МиниГуи возможно ? Ну там лицензия и т.д.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1377
Зарегистрирован: 09.10.06
|
|
Отправлено: 16.12.16 19:22. Заголовок: Andrey пишет: А по..
Andrey пишет: цитата: | А портировать xBrows в МиниГуи возможно ? Ну там лицензия и т.д. |
| Если у вас есть такая возможность, то портируйте, пожалуйста, click here или click here Там и лицензия позволяет, и многие были бы вам благодарны
|
|
|
Dima
|
| |
Пост N: 6210
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.12.16 19:39. Заголовок: Петр пишет: Глюки у..
Петр пишет: цитата: | Глюки ушли совсем? P.S. Поздравляю с освоением нового инструмента - GDIVIEW |
| Косяков больше не смог найти . Долго "ездил" , глюков нет. Отдал заказчику , пусть обкатают. Спасибо за наводку
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1378
Зарегистрирован: 09.10.06
|
|
Отправлено: 16.12.16 20:01. Заголовок: Dima пишет: Косяков..
Dima пишет: цитата: | Косяков больше не смог найти . Долго "ездил" , глюков нет. |
| Извините, конечно, за назойливость Костыль в виде таймера убран? Или еще нужен?
|
|
|
Dima
|
| |
Пост N: 6211
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.12.16 22:34. Заголовок: Петр пишет: Костыль..
Петр пишет: цитата: | Костыль в виде таймера убран? Или еще нужен? |
| Как бы костыля и не было. Изначально таймер жил в Tsbrowse а после поселился в окне где живут дружно два бровса TS. Вся ситуация как бы была описана выше. На что намекаешь то ? :) Косяков и утечек не увидел.
|
|
|
|
Haz
|
| |
Пост N: 1061
Зарегистрирован: 20.02.11
|
|
Отправлено: 16.12.16 23:06. Заголовок: Да по сути это и е..
Да по сути это и есть костыль т. к. заменяет обработку "отпускания" кнопки. И пока этот костыль нужен. и вариантов кроме таймера не предвидится Без этого "костыля" не понятно как организовать перерисовку подчиненных бровсоов, а если их "сто пятьсот" - главный бровс возмет приз Гинеса по тормозам при скипе
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1379
Зарегистрирован: 09.10.06
|
|
Отправлено: 16.12.16 23:12. Заголовок: Dima пишет: На что ..
Dima пишет: Ни на что. Честно ! Если таймер используется только для синхронизации, то такое решение имеет право на существование.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1380
Зарегистрирован: 09.10.06
|
|
Отправлено: 16.12.16 23:16. Заголовок: Haz пишет: Без этог..
Haz пишет: цитата: | Без этого "костыля" не понятно как организовать перерисовку подчиненных бровсоов, |
| Как бы задумывалось через SyncChild, а вот рациональный алгоритм для наступления этого события продумать не мешало бы.
|
|
|
Haz
|
| |
Пост N: 1062
Зарегистрирован: 20.02.11
|
|
Отправлено: 17.12.16 00:10. Заголовок: Петр пишет: продума..
Петр пишет: Петр, да ктож против. Мы все локально и у себя, пытаемся этот алгоритм найти. Многое предложил Сергей, кое что по мелочам я накидал, проф поправки есть и от тебя (сорь на брудершафт пока не пили, уверен не обидел) . Это все не системно. Может открыть тему Проблема TS - варианты - решение. Григорий один не вытянет. К примеру подтема "как сделать отображение подчиненного бровса по ОТПУСКАНЮ кнопки или отрыву пальца от колеса мыши? Один из вариантов - именно таймер, но ведь есть и другие. Вот в этой теме их и собирать. Пока по факту TS один из самых сильных инструментов в Minigui и.... один из самых непредсказуемых, применрно половина времени на разработку ПО уходит на борьбу с его сюрпризами
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 1340
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.12.16 01:16. Заголовок: Петр пишет Как бы за..
Петр пишет цитата: | Как бы задумывалось через SyncChild, а вот рациональный алгоритм для наступления этого события продумать не мешало бы. |
| SyncChild метод ставит ::bChange, т.е. портит установленный, а практически в каждом тсб он занят. Даже этого достаточно, что бы метод не использовать. Haz пишет цитата: | К примеру подтема "как сделать отображение подчиненного бровса по ОТПУСКАНЮ кнопки или отрыву пальца от колеса мыши? |
| Тут больше гемороя, т.к. надо знать какому тсб и в какой ситуации, что посылать. По мне, наличие таймера на контроле (тсб в частности), вполне приемлемое решение. Принцип "все свое ношу с собой" в объекте, т.е. каждый тсб знает, что и при каких условиях надо делать\переотображать.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 1341
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.12.16 08:56. Заголовок: PS По поводу обработ..
PS По поводу обработчика в тсб. Можно добавить 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 ...
|
|
|
ММК
|
| постоянный участник
|
Пост N: 262
Зарегистрирован: 29.05.10
|
|
Отправлено: 17.12.16 10:23. Заголовок: Петр пишет: Если та..
Петр пишет: цитата: | Если таймер используется только для синхронизации, то такое решение имеет право на существование. |
| Для синхронизации есть ON CHANGE. С учетом того , что все другие бровсы работают нормально есть смысл посмотреть их и сравнить с TS. Ситуация меняется , если изменить алгоритм перерисовки. Менется , если убирать утечки памяти , хотя возникает она и без использования иконок. Мне кажется правильнее искать причину :) Ведь если оставлять этот бровс , то в него еще придется много чего добавлять , а с такими глюками это замок на песке.
|
|
|
Haz
|
| |
Пост N: 1063
Зарегистрирован: 20.02.11
|
|
Отправлено: 17.12.16 14:42. Заголовок: ММК пишет: Для синх..
ММК пишет: цитата: | Для синхронизации есть ON CHANGE. |
|
к нему претензий, за исключением одной - не ловит ситуёвину ногда пользователь сел на кнопку и едет к примеру вниз не отпуская. Блок отрабатывает честно на каждом скипе, а если там перерисовка другого бровса или их несколько.... И пока вся эта гирлянда не отработает bChange не пустит на следующую запись. Причём это вполне рабочая ситуация, есть например реестр заказов, с каждым заказом связан его состав ( отдельный бровс) и графики платежей ( еще один). С каждым элементом состава заказа может быть связан технологический маршрут ( бровс по рабочим операциям на элемент заказа с контролем готовности). Чтото подобное делал и стандартный bChange доводил пользователя до истерики, ну не удобно ему поиском.... хочет нажать на кнопочку и следить глазами если не увидел сразу то так и будет ездить туда сюда. Все подчиненные запросы ( сижу на ADS SQL) отработывают мгновенно, а перерисовка всех бровсов не дает быстро ездить да и постоянное мелькание начинает бесить. Вот и возникает необходимость чтобы за этим bChange была слежка со стороны и игнорились слишком частые вызовы, а выполнялся только последний. Вот так и появился таймер.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1382
Зарегистрирован: 09.10.06
|
|
Отправлено: 17.12.16 15:06. Заголовок: SergKis пишет: Sync..
SergKis пишет: цитата: | SyncChild метод ставит ::bChange, т.е. портит установленный, а практически в каждом тсб он занят. Даже этого достаточно, что бы метод не использовать. |
|
" А в каких случаях можно использовать SyncChild()? Вот bChange с компанией используется как navigation codeblocks DATA bLine, bSkip, bGoTop, bGoBottom, ; bLogicLen, bChange // navigation codeblocks bLine, bLogicLen, bChange - это navigation codeblocks - ну тоже мало понятно
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|