Форум » 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:....

Ответов - 148, стр: 1 2 3 4 5 6 7 8 All

Haz: Andrey пишет: если раз 10 - колёсиком мышки покрутить, минут 10 крутил колесиком , палец уже устал а база никак не хочет отсоединяться и все работает как положено Andrey пишет: Как с этим бороться ? смотреть чего понаписал в исходнике

Andrey: Haz пишет: смотреть чего понаписал в исходнике Отдельно программа работает КАК ЧАСЫ (ни как не убивается....) ! Занимает 2,5 Мб - на диске и в памяти. Включаю эту же программу в свою систему (5.5Мб на диске и 4.8 Мб в памяти) и на этой же базе получаю вылет. Колесиком вверх-вниз секунд 20 и вылет. Я понимаю, что не каждый юзер так будет делать, но у меня и быстрей иногда сваливается с такой же ошибкой: Error DBCMD/2001 Файл не открыт: При создании TBROWSE открываю всю базу. Потом по кнопке делаю условную индексацию (этой базы) по городу и уменьшаю список показа записей. Может в этом дело ? При большом ехе-нике перестает работать ?

Haz: Andrey пишет: Включаю эту же программу в свою систему (5.5Мб) и на этой же базе получаю вылет 1 Возможно в большой системе другие установки или есть конфликт имен .. от размера исполняемого модуля это точно не зависит 2 Смотреть что висит на ON CHANGE и ON DRAW твоего справочника Andrey пишет: При создании TBROWSE открываю всю базу. Потом по кнопке делаю условную индексацию (этой базы) по городу и уменьшаю список показа записей. Может в этом дело ? Может и в этом , нужно как минимум oBrw:Reset() после того как была изменена рабочая область PS/ а если не делать условную индексацию - эффект отключения наблюдяется ?


Andrey: Haz пишет: 1 Возможно в большой системе другие установки или есть конфликт имен .. А какие другие установки ? Конфликта имен точно нет. Переменные все переискал в других исходниках - таких нет. Были, уже удалил. Haz пишет: 2 Смотреть что висит на ON CHANGE и ON DRAW твоего справочника ON GOTFOCUS ( MyChangeBrowse(cAlias), Form_Spr.oBrw_1.Setfocus) ; ON CHANGE (CorrectionFirstLast("oBrw_1"),MyChangeBrowse(cAlias), Form_Spr.oBrw_1.Setfocus) Функция MyChangeBrowse(cAlias) //////////////////////////////////////////////////////////// STATIC FUNCTION MyChangeBrowse(cAlias) LOCAL nI, cVal nI := INDEXORD() IF nI == 0 cVal := NTOC(Recno()) + '/' + NTOC(RecCount()) ELSE cVal := NTOC(OrdKeyNo()) + '/' + NTOC(OrdKeyCount()) ENDIF Form_Spr.Label_StatusBar2.Value := " Запись: " + cVal Form_Spr.oBrw_1.Setfocus RETURN Nil Функция CorrectionFirstLast("oBrw_1") не моя, брал и примеров: *--------------------------------------------------------------------------------* Static procedure CorrectionFirstLast(oBrw) *--------------------------------------------------------------------------------* IF &oBrw:nRowCount() == &oBrw:nRowPos() &oBrw:Refresh( .F. ) ENDIF IF &oBrw:nLogicPos() > 0 .and. &oBrw:nRowPos() == 1 &oBrw:Refresh( .F. ) ENDIF RETURN Haz пишет: Может и в этом , нужно как минимум oBrw:Reset() после того как была изменена рабочая область Да я рабочую область и не меняю. Алиас тот же самый. cBaseMain := "STREET" nSel := SELECT(cBaseMain) IF nSel > 0 DBCLEARINDEX() // Удаление временного индексного файла myDelTmpIndex(cFileIndexTemp) MyIndexOpenRestore(aStaticMemIndexOpen) // Восстановить открытые индексы nOrder := INDEXORD() // Результат: NUMBA BuildIndex( cBaseMain, "STREET00",,, cFileIndexTemp , ; "KCITY=="+HB_NtoS(nCity)+".AND.!DELETED()", ; "UPPER(STREET)" ) // { "Идет индексация БД-справочника",,, "15/2", "2/15" } ) DBSetOrder( nOrder + 1 ) // переключится на новый индекс RefreshBrowse() goto TOP oBrw_1:Reset() oBrw_1:Refresh(.T.) ELSE MsgDebug("Нет открытой базы:", cBaseMain, "Тек.база:", ALIAS(), SELECT() ) ENDIF ENDIF Form_Spr.oBrw_1.Setfocus RETURN NIL

Haz: ОТКЛЮЧИ ON CHANGE и попробуй без него Andrey пишет: RefreshBrowse() Это что делает ?

Andrey: Haz пишет: Это что делает ? Поиск по введенным буквам: //////////////////////////////////////////////////////////// STATIC FUNCTION RefreshBrowse() LOCAL cSeek := Alltrim( Form_Spr.Text_1.Value ) LOCAL cStrSeek := '('+Alias()+')->'+cStPole_DbSetFilter LOCAL cExp := "'" + UPPER(cSeek) + "' $ UPPER(MASTER->MASTER)" cExp := "'" + UPPER(cSeek) + "' $ UPPER("+cStPole_DbRelation+")" //MsgDebug(cExp, cStrSeek) IF !Empty(cSeek) ( Alias() )->( DbSetFilter( &("{||" + cExp + "}"), cExp ) ) ELSE ( Alias() )->( DbClearFilter() ) END oBrw_1:Reset() Form_Spr.oBrw_1.Setfocus RETURN Nil

Andrey: Haz пишет: ОТКЛЮЧИ ON CHANGE и попробуй без него Так же вылетает после 20-30 секундного мышка-колёсико.... Error DBCMD/2001 Файл не открыт:

Haz: Andrey пишет: Так же вылетает после 20-30 секундного мышка-колёсико.. после каждого "мышка-колёсико" вызывается ON CHANGE, можно предположить что проблема в нем. Отключи и проверь Явно база нигде не закрывается , может уперся в максимальное число открытых баз/индексов ?

Andrey: Haz пишет: может уперся в максимальное число открытых баз/индексов ? Да там только эти справочники и открываются. Еще только оболочку сделал и менюшку справочники. И десяти баз открытых не будет.... Haz пишет: после каждого "мышка-колёсико" вызывается ON CHANGE, можно предположить что проблема в нем. Отключи и проверь Проверил, только что еще раз. Убрал вообще ON CHANGE и ON GOTFOCUS Так же вылетает после 20-30 секундного мышка-колёсико.... Error DBCMD/2001 Файл не открыт: Может неправильно написал, хотя из примеров брал: // создать объект TBROWSE SprCreateBrowse( cSection, "oBrw_1", 'Form_Spr', nBrwTop+2, nBrwLeft, nBrwWdth, nBwrHght-2-nHB, ALIAS() ) ниже в программе: PUBLIC &cBrw DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS cAlias ; OF &cParent ; WIDTH nWidth ; HEIGHT nHeight ; COLORS { CLR_BLACK, CLR_BLUE } ; BACKCOLOR aBackColor ; FONT 'Tahoma' SIZE ModeSizeFont() //ON GOTFOCUS ( MyChangeBrowse(cAlias), Form_Spr.oBrw_1.Setfocus) //ON CHANGE (CorrectionFirstLast("oBrw_1"),MyChangeBrowse(cAlias), Form_Spr.oBrw_1.Setfocus) END TBROWSE Есть какая нибудь функция показывающая открытые базы ? Или самому писать надо ? У меня такая в терминалке была...

Haz: Andrey пишет: Или самому писать надо имеется ввиду список Алиасов ? готовой нет или бровс по алиасу - такая есть внутри h_tbrowse.prg Function SBrowse( uAlias, cTitle, bSetUp, aCols, nWidth, nHeight, lSql ) можно вызвать с одним параметром uAlias // создать объект TBROWSE SprCreateBrowse( cSection, "oBrw_1", 'Form_Spr', nBrwTop+2, nBrwLeft, nBrwWdth, nBwrHght-2-nHB, ALIAS() ) PS попробуй Alias() явно задать ввиде символьного значения. такое впечатление что бровс его забывает PPS проверь чему равно значение &cBrw:cAlias

Dima: Haz пишет: имеется ввиду список Алиасов ? Pasha пишет: Оказывается, в харборе есть функция hb_waEval( bBlock ) Блок кода bBlock вызывается для каждой открытой рабочей области. Т.е. массив алиасов или номеров р/о можно получить так: aAlias := {} hb_waEval( {|| AADD(aAlias, Alias())} ) или aSelect := {} hb_waEval( {|| AADD(aSelect, Select())} )

SergKis: Andrey может так надо: DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS &cAlias ; OF &cParent ; Или самому писать надо ? a := {}; AEval(array(50), {|x,e| iif( (e)->( used() ), aAdd(a, (e)->( alias() ), nil) }) msgDebug(a)

Andrey: SergKis пишет: может так надо: DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS &cAlias ; Делал и так тоже. у Григория пример брал из \MiniGUI\SAMPLES\Advanced\Tsb_filter\demo.prg

Andrey: SergKis пишет: AEval(array(50), {|x,e| iif( (e)->( used() ), aAdd(a, (e)->( alias() ), nil) }) Error E0030 Syntax error "syntax error at '}'"

Andrey: Haz пишет: PS попробуй Alias() явно задать ввиде символьного значения. такое впечатление что бровс его забывает PPS проверь чему равно значение &cBrw:cAlias Для проверки сделал отдельное меню: MENUITEM "Алиас этой БД" ACTION { || MyGetUse("oBrw_1") } SEPARATOR MENUITEM "Список открытых БД" ACTION { || MyGetAllUse() } После потери связи с базой выдает что база открыта: "STREET" А если опросить все базы то показывает что 3 базы открыты !!! Получается TBROWSE сам теряет связь с базой.... Что делать ?

Haz: Andrey пишет: Получается TBROWSE сам теряет связь с базой.... Что делать ? Скорре всего слетат ( а точнее становится невыполнимым ) условие в блоке выборки/записи по колонке( или колонкам ) и уверен слетает не само а какой то кусок кода ему помогает. нужно проверить до слета и сразу после 1. oBrw:cAlias - должно быть "STREET" 2. oBrw:aColumns[x]:cData должно быть что то типа "STREET->имя поля или FieldGet(). " 3. Eval( oBrw:aColumns[x]:bData) должно вернуть значение из текущей записи для колонки х ЗЫ в функции RefreshBrowse() есть вызов Alias() ? Андрей ты уверен в том что при выполнении RefreshBrowse() ВСЕГДА Alias() == "STREET" ? и что там с тассировкой ошибки - на какую строку из h_browse.prg ругается ?

Andrey: Слетает всегда в одном месте, когда редактировать начинаешь. После того как колёсиком поездишь, кол-во записей становится 0/0 и начинаешь редактировать. Я назначил свою функцию обработки и в зависимости условий, разрешаю/запрещаю редактировать ячейки или вызываю справочник (отдельный): For nI := 1 to Len(aPoleField) ADD COLUMN TO TBROWSE &cBrw // добавить новую колонку в TBROWSE ..... IF cTypeField # "+" // кроме - автоинкремент поля &cBrw:aColumns[nI]:lEdit := .T. oBrw_1:aColumns[nI]:bPrevEdit := {|| MyFieldEdit( oBrw_1:aColumns[oBrw_1:nCell]:Cargo ) } ENDIF Next Вылет всегда в: Error DBCMD/2001 Файл не открыт: RLOCK Called from RLOCK(0) Called from RECLOCK(31) // это моя функция Called from MYFIELDEDIT(1471) // это моя функция Called from (b)SPRCREATEBROWSE(964) Called from TSBROWSE:KEYDOWN(6329) Called from TSBROWSE:HANDLEEVENT(7084) Called from EVENTS(76) RECLOCK(31) // это моя функция из терминалки FUNCTION RecLock( nRetry ) // nRetry == 3 - кол-во попыток захватить запись LOCAL lForever LOCAL lRet := .T. nRetry := IF(nRetry == NIL, MAX_NOF_ATTEMPTS, nRetry) lForever := (nRetry == 0) WHILE !RLOCK() .AND. ((nRetry > 0 .OR. lForever)) // строка - 31 IF Msg( MSG_TRY_LOCK_REC ) == K_ESC EXIT ENDIF nRetry-- END IF !RLOCK() Msg( MSG_LOCK_NO_SUCCESS ) lRet := !lRet ENDIF RETURN (lRet)

Haz: Andrey пишет: Called from TSBROWSE:KEYDOWN(6329) похоже что то с блоком выборки не алё вот тут спотыкается при редактировании TSBROWSE:KEYDOWN(6329 проверив что есть bPrevEdit и бровс не по массиву пытается выполнить блок и вылетает с ошибкой If ::aColumns[ nCol ]:bPrevEdit != Nil If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) // append mode for arrays Else // GF 16-05-2008 uVal := Eval( ::aColumns[ nCol ]:bData ) uVal := Eval( ::aColumns[ nCol ]:bPrevEdit, uVal ) If ValType( uVal ) == "L" .and. ! uVal Return 0 EndIf EndIf EndIf ЗЫ MYFIELDEDIT в студию ЗЫЫ И все же мне кажется что где то меняется рабочая область ! в bPrevEdit тыкни MsgDebug( Alias() )

Andrey: Сделал новый тест в функции MyFieldEdit() до начала редактирования при слёте базы: MsgDebug(oBrw_1:nLen, ALIAS(), oBrw_1:cAlias ) MsgDebug( "RLock()=", (oBrw_1:cAlias)->(RLock()) ) Т.е. колёсиком подергал вверх-вниз на 5 записях, функция MyChangeBrowse(cAlias) показывает 0/0 начинаю редактировать: 1. MsgDebug показывает 5, "", "STREET" 2. MsgDebug показывает "RLock()=" .T. Т.е. АЛИАС по всей задачи ALIAS() = "" - убит !!! Кем ? На экране таблица есть (в объекте) а все связи разорваны ! Еще раз пишу, отдельная задача работает как часы, а в сборке с другими (там только еще один TBROWSE есть) начинает вылетать.

Dima: Haz пишет: MYFIELDEDIT в студию +1



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