| Автор | Сообщение |
|
|
| постоянный участник
|
Пост N: 7901
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.10.24 14:48. Заголовок: Tsbrowse и LetoDbf
В программе подсоединён драйвер LetoDbf Создаю 2 базы в GetUserTempFolder() со списками каталогов и индексы к ним тоже. Открываю 2 ТСБ в одном окне. На одном окне делаю поиск FilterFTS() и прога ВЫЛЕТАЕТ без создания файла ошибок ErrorLog.htm Было на экране окно с 2-мя ТСБ и НЕТ вообще программы. Код простой для поиска: cFind := Alltrim(cStaticFind) ? "+++++++",ProcNL(), oWnd:Name, oBrw:cAlias, cObj, "cFind=", cFind IF ISOBJECT(oBrw) ?? "oBrw:FilterFTS(" oBrw:FilterFTS( cFind, .T. ) oBrw:Refresh() oBrw:SetFocus() ENDIF Поставил отладку в h_tbrowse.prg METHOD FilterFTS( cFind, lUpper, lBottom, lFocus, lAll ) CLASS TSBrowse .... ? ProcNL(), ALIAS(), "cFind=", "["+cFind+"]" IF ! Empty( cFind ) ( cAlias )->( dbSetFilter( {|| ob:FilterFTS_Line( cFind, lUpper, lAll, ob ) }, ; "ob:FilterFTS_Line( cFind, lUpper, lAll, ob)" ) ) ELSE ( cAlias )->( dbClearFilter() ) ENDIF ? ProcNL(), "2--" , cAlias, RDDName() ( cAlias )->( dbGoTop() ) // вылет примерно здесь ! Почему ? ? ProcNL(), "3--" <-— этого нет в логе DO While !( cAlias )->( Eof() ) ? ProcNL(), "DO While", Recno() SysRefresh() nLen++ ( cAlias )->( dbSkip( 1 ) ) ENDDO Делаю отладку в лог: +++++++ >>> REFRESH_TSB(733) => 5Files_tsb.prg Form_Tsb0 LISTLETODBF GB_Find cFind= A C:\Users\Андрей\AppData\Local\Temp\MG_LetoDbf\ListLetoDbf.dbf oBrw:FilterFTS( Called from: TSBROWSE:FILTERFTS(14039) --> h_tbrowse.prg LISTLETODBF cFind= [A] Called from: TSBROWSE:FILTERFTS(14047) --> h_tbrowse.prg 2-- LISTLETODBF DBFCDX Дальше вылет !!!  Почему ? 
|
 |

|
|
Ответов - 8
[только новые]
|
|
|
|
| постоянный участник
|
Пост N: 7902
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.10.24 15:14. Заголовок: Пробовал и так: DBS..
Пробовал и так: DBSELECTAREA(oBrw:cAlias) DbSetOrder(5) oBrw:uLastTag := (oBrw:cAlias)->( OrdName(5) ) // без этого индекс слетает cFind := Alltrim(cStaticFind) ? "+++++++",ProcNL(), oWnd:Name, oBrw:cAlias, cObj, "cFind=", cFind ? DBINFO( DBI_FULLPATH ) ? myGetIndexUse() IF ISOBJECT(oBrw) ?? "oBrw:FilterFTS(" oBrw:FilterFTS( cFind, .T. ) oBrw:Refresh() oBrw:SetFocus() ENDIF Вот лог: +++++++ >>> REFRESH_TSB(735) => 5Files_tsb.prg Form_Tsb0 LISTLETODBF GB_Find cFind= Ф C:\Users\Андрей\AppData\Local\Temp\MG_LetoDbf\ListLetoDbf.dbf Список открытых индексов / List of open indexes: C:\Users\Андрей\AppData\Local\Temp\MG_LetoDbf\ListLetoDbf.dbf Alias: LISTLETODBF DbSetOrder(1) ATR_NAME - LEVEL + UPPER(FNAME) DbSetOrder(2) SIZE - FSIZE DbSetOrder(3) DATETIME - FDT DbSetOrder(4) COMPARE - FCOMP DbSetOrder(5) FNAME - UPPER(FNAME) Current index: 5 - UPPER(FNAME) oBrw:FilterFTS( Called from: TSBROWSE:FILTERFTS(14039) --> h_tbrowse.prg LISTLETODBF cFind= [Ф] Called from: TSBROWSE:FILTERFTS(14047) --> h_tbrowse.prg 2-- LISTLETODBF DBFCDX Всё равно вылетает... 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4651
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.10.24 15:21. Заголовок: Andrey пишет Почему ..
Andrey пишет Потому, что тсб объект у тебя на клиенте, а применить его методы ты хочешь на сервере. Уже говорил :FilterFTS() не будет так работать, сделай выборку dbf на клиента и на нем используй :FilterFTS() или исп. др. методы rdd, пробеги по dbf на сервере, составь список-массив RecNo(), потом ставь BM фильтр на него и работай по этим строкам
|
 |

|
|
|
| постоянный участник
|
Пост N: 7903
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.10.24 15:27. Заголовок: SergKis пишет: что ..
SergKis пишет: | цитата: | | что тсб объект у тебя на клиенте, а применить его методы ты хочешь на сервере. |
| База у меня на локальном компе - C:\Users\Андрей\AppData\Local\Temp\MG_LetoDbf\ListLetoDbf.dbf Индексы тоже на локальном компе. ТСБ строю тоже на локальном компе. -------------- Создаю 2 базы в GetUserTempFolder() со списками каталогов и индексы к ним тоже. Открываю 2 ТСБ в одном окне.
|
 |

|
|
|
| постоянный участник
|
Пост N: 7919
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.11.24 23:17. Заголовок: МиниГуи Версия 24.11..
МиниГуи Версия 24.11 В ТСБ ставлю так: oBrw:aCheck := { LoadImage("bCheckT24"), LoadImage("bCheckF24") } // заменяем колонку CHECKBOX на свои картинки Нажимаем на чекбоксы в таблице: После выхода из программы создаётся файл checkres.txt и там: LetoDbf_Admin.exe -- BMP,1728386283,TSBROWSE:DRAWSELECT(4865)->TSBROWSE:DRAWSUPER(5020)->TSBROWSE:PAINT(11224)->TSBROWSE:DISPLAY(3503)->_ENDTBROWSE(624)->_TBROWSE(721)->USER_FORM(131)->(b)MAIN(136)->DO_WINDOWEVENTPROCEDURE(82)->TWNDDATA:DOEVENT(1441)->DO_ONWNDLAUNCH(668)->(b)INIT(127)->EVENTS(1179)->SENDMESSAGE(0)->(b)TWNDDATA(1274)->TWNDDATA:SENDMSG(0)->_WSEND(490)->(b)MAIN(128)->DO_WINDOWEVENTPROCEDURE(82)->TWNDDATA:DOEVENT(1441)->DO_ONWNDLAUNCH(668)->(b)INIT(127)->EVENTS(1179)->DOMESSAGELOOP(0)->_ACTIVATEWINDOW(1649)->MAIN(184) LetoDbf_Admin.exe -- BMP,1728386283,TSBROWSE:DRAWSELECT(4865)->TSBROWSE:DRAWSUPER(5020)->TSBROWSE:PAINT(11224)->TSBROWSE:DISPLAY(3503)->_ENDTBROWSE(624)->_TBROWSE(721)->USER_FORM(131)->(b)MAIN(136)->DO_WINDOWEVENTPROCEDURE(82)->TWNDDATA:DOEVENT(1441)->DO_ONWNDLAUNCH(668)->(b)INIT(127)->EVENTS(1179)->SENDMESSAGE(0)->(b)TWNDDATA(1274)->TWNDDATA:SENDMSG(0)->_WSEND(490)->(b)MAIN(128)->DO_WINDOWEVENTPROCEDURE(82)->TWNDDATA:DOEVENT(1441)->DO_ONWNDLAUNCH(668)->(b)INIT(127)->EVENTS(1179)->DOMESSAGELOOP(0)->_ACTIVATEWINDOW(1649)->MAIN(184) LetoDbf_Admin.exe -- BMP,-1610279576,TSBROWSE:DRAWSELECT(4865)->TSBROWSE:DRAWSUPER(5020)->TSBROWSE:PAINT(11224)->TSBROWSE:DISPLAY(3503)->_ENDTBROWSE(624)->_TBROWSE(721)->USER_FORM(131)->(b)MAIN(136)->DO_WINDOWEVENTPROCEDURE(82)->TWNDDATA:DOEVENT(1441)->DO_ONWNDLAUNCH(668)->(b)INIT(127)->EVENTS(1179)->SENDMESSAGE(0)->(b)TWNDDATA(1274)->TWNDDATA:SENDMSG(0)->_WSEND(490)->(b)MAIN(128)->DO_WINDOWEVENTPROCEDURE(82)->TWNDDATA:DOEVENT(1441)->DO_ONWNDLAUNCH(668)->(b)INIT(127)->EVENTS(1179)->DOMESSAGELOOP(0)->_ACTIVATEWINDOW(1649)->MAIN(184) Как исправить ? Если убираю строку oBrw:aCheck := { LoadImage("bCheckT24"), LoadImage("bCheckF24") } , то файл checkres.txt НЕ СОЗДАЁТСЯ !
|
 |

|
|
|
| |
Пост N: 1976
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.11.24 23:53. Заголовок: Andrey пишет: Как и..
Andrey пишет: не пользоваться в этом месте LoadImage тк при каждой прорисовке строки будет создаваться новый хендл на картинку
|
 |

|
|
|
| постоянный участник
|
Пост N: 7927
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.11.24 18:14. Заголовок: Haz пишет: не польз..
Haz пишет: | цитата: | | не пользоваться в этом месте LoadImage тк при каждой прорисовке строки будет создаваться новый хендл на картинку |
| А как тогда делать ? По коду в h_tbrowse.prg там есть удаление этих объектов. IF ValType( oCol:aCheck ) == "A" AEval( oCol:aCheck, {| hBmp | iif( Empty( hBmp ), , DeleteObject( hBmp ) ) } ) ENDIF
|
 |

|
|
|
| |
Пост N: 1978
Зарегистрирован: 20.02.11
|
|
Отправлено: 19.11.24 21:04. Заголовок: Andrey пишет: По ко..
Andrey пишет: [quote]По коду в h_tbrowse.prg там есть удаление этих объектов. Гадать трудно, ты не даешь полный текст что там с aCheck происходит Определи hBmp заранее и создай aCheck := { hBmp1, hBmp2 } У тебя похоже LoadImage выполняется при вызове DrawSelect вот и жрёт память. Причем checkres явно говорит о том , что жор связан с прорисовкой строки или заголовков И на закуску : ты создаешь oBrw:aCheck, a чистятся oCol:aCheck мне кажется разница видна
|
 |

|
|
|
| постоянный участник
|
Пост N: 7928
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.24 11:05. Заголовок: Haz пишет: ты созда..
Haz пишет: | цитата: | | ты создаешь oBrw:aCheck, a чистятся oCol:aCheck мне кажется разница видна |
| Как было в примерах - так и делал, об этом и не задумывался. В новых версиях появились логи утечек, так и озаботился. Поставил на колонку - утечки ПРОПАЛИ ! СПАСИБО БОЛЬШОЕ ! 
|
 |

|
|