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

SergKis: Andrey AEval(array(50), {|x,e| iif( (e)->( used() ), aAdd(a, (e)->( alias() )), nil) })

Haz: пишет: Т.е. АЛИАС по всей задачи ALIAS() = "" - убит !!! Кем ? не убит, где-то сработал Select(0) вот и стал текущим пустой алиас. На 99% уверен что если твой RecLock() вызывать из алиасного выражения STREET->(RecLock()) то ошибка уйдет. Но это костыль, а не исправление ошибки. По уму надо найти "виновника"

Andrey: Haz пишет: MYFIELDEDIT в студию Да вот она, с терминалки перетащил, еще не вычищал... STATIC FUNCTION MyFieldEdit(aCargo) // aCargo не используется, везде Static переменные LOCAL cTemp, cPoleTemp, cTemp2, aRet LOCAL cRunFun, tmp, cScr25, cFuncName, cT, cRetval, cTitle LOCAL nRet, nSRet, nPoleEdit, cPoleEdit LOCAL nCol := oBrw_1:nCell // колонка на которой стоит маркер LOCAL cPoleField := aPoleField[nCol] // поле БД на котором стоит маркер LOCAL cPolePict := aPolePict[nCol] // формат поля БД на котором стоит маркер LOCAL lEditField := .F. , nKey := oBrw_1:nFireKey LOCAL cTitleSpr := " " + aPoleName[nCol] // Справочник MsgDebug(oBrw_1:nLen, ALIAS(), oBrw_1:cAlias ) MsgDebug( "RLock()=", (oBrw_1:cAlias)->(RLock()) ) IF oBrw_1:nLen == 0 // для отладки, чтобы искать ошибки MyMESSAGE( 'Нет записей для редактирования ! ;;Переоткройте справочник ЗАНОВО !' ) RETURN .F. ENDIF // aFields[1] - первое поле справочника (Код) для сверки с == 0 IF FieldGet( FIELDNUM( aPoleField[1] ) ) == 0 // нет прав доступа к записи MyMESSAGE( 'Нельзя редактировать запись с КОДОМ = 0 !', 2 ) RETURN .F. ENDIF // aPoleDost, aPoleWrite - STATIC IF M->aOperator[ M->nSP_ENTER ] == "0" // нет прав доступа к записи MyMESSAGE( 'Нет прав доступа редактирования записи !', 2 ) ELSE IF aPoleDost[ nCol ] == "SF" IF Len( aPoleWrite[ nCol, 4 ] ) == 0 aPoleWrite[ nCol, 4 ] := aPoleWrite[ nCol, 3 ] + "2" ENDIF cTemp := AllTrim( aFiltPole[ nCol ] ) IF Len( cTemp ) > 0 nSRet := Sel_Dim( , , aPoleWrite[ nCol, 1 ], aPoleWrite[ nCol, 2 ], ; aPoleWrite[ nCol, 3 ], aPoleWrite[ nCol, 4 ], cTemp, "OPEN", cTitleSpr,.F. ) ELSE nSRet := Sel_Dim( , , aPoleWrite[ nCol, 1 ], aPoleWrite[ nCol, 2 ], ; aPoleWrite[ nCol, 3 ], aPoleWrite[ nCol, 4 ], "", ,cTitleSpr, .F. ) ENDIF IF nSRet > -1 //0 cTemp2 := aPoleWrite[ nCol, 2 ] // сетевой захват записи IF ( RecLock( LOCK_RETRY ) ) FIELDPUT(FIELDNUM(cTemp2), nSRet ) IF FIELDNUM( "KOPERAT" ) > 0 FIELDPUT(FIELDNUM("KOPERAT"), M->nOperat ) // кто изменил справочник ENDIF //DBCOMMIT() DBUnlock() ENDIF ENDIF ELSEIF aPoleDost[ nCol ] == "AS" IF Len( aPoleWrite[ nCol, 4 ] ) == 0 aPoleWrite[ nCol, 4 ] := aPoleWrite[ nCol, 3 ] + "2" ENDIF nSRet := Sel_Dim( , , aPoleWrite[ nCol, 1 ], aPoleWrite[ nCol, 2 ], ; aPoleWrite[ nCol, 3 ], aPoleWrite[ nCol, 4 ], "", ,cTitleSpr, .F. ) IF nSRet > -1 //0 cTemp2 := aPoleWrite[ nCol, 2 ] // сетевой захват записи IF ( RecLock( LOCK_RETRY ) ) FIELDPUT(FIELDNUM(cTemp2), nSRet ) IF FIELDNUM( "KOPERAT" ) > 0 FIELDPUT(FIELDNUM("KOPERAT"), M->nOperat ) // кто изменил справочник ENDIF //DBCOMMIT() DBUnlock() ENDIF ENDIF ELSEIF aPoleDost[ nCol ] == "S" IF Len( aPoleWrite[ nCol, 4 ] ) == 0 aPoleWrite[ nCol, 4 ] := aPoleWrite[ nCol, 3 ] + "2" ENDIF IF aFiltBase[ 1 ] == .T. IF aFiltBase[ 4 ] == "N" cTemp := aFiltBase[ 2 ] + " ==" + AllTrim( Str( aFiltBase[ 3 ] ) ) ELSE cTemp := aFiltBase[ 2 ] + " ==" + aFiltBase[ 3 ] ENDIF nSRet := Sel_Dim( , , aPoleWrite[ nCol, 1 ], aPoleWrite[ nCol, 2 ], ; aPoleWrite[ nCol, 3 ], aPoleWrite[ nCol, 4 ], cTemp, "OPEN",cTitleSpr,.F. ) ELSE nSRet := Sel_Dim( , , aPoleWrite[ nCol, 1 ], aPoleWrite[ nCol, 2 ], ; aPoleWrite[ nCol, 3 ], aPoleWrite[ nCol, 4 ], "", ,cTitleSpr,.F., ) ENDIF IF nSRet > -1 //0 cTemp2 := aPoleWrite[ nCol, 2 ] // сетевой захват записи IF ( RecLock( LOCK_RETRY ) ) FIELDPUT(FIELDNUM(cTemp2), nSRet ) IF FIELDNUM( "KOPERAT" ) > 0 FIELDPUT(FIELDNUM("KOPERAT"), M->nOperat ) // кто изменил справочник ENDIF //DBCOMMIT() DBUnlock() ENDIF ENDIF lEditField := .F. ELSEIF aPoleDost[ nCol ] == "T" IF Len( aPoleWrite[ nCol, 4 ] ) == 0 aPoleWrite[ nCol, 4 ] := aPoleWrite[ nCol, 3 ] + "2" ENDIF cPoleTemp := aFiltPole[ nCol ] IF FIELDNUM( cPoleTemp ) > 0 nSRet := FieldGet( FIELDNUM( cPoleTemp ) ) IF nSRet == 0 Message( 'полe "' + cPoleTemp + '" == 0', 5 ) ELSE cTemp := aFiltPole[ nCol ] + " == " + AllTrim( Str( tmp ) ) nSRet := SEL_DIM( , , aPoleWrite[ nCol, 1 ], aPoleWrite[ nCol, 2 ], ; aPoleWrite[ nCol, 3 ], aPoleWrite[ nCol, 4 ], cTemp, "OPEN", cTitleSpr,.F. ) IF nSRet > -1 //0 cTemp2 := aPoleWrite[ nCol, 2 ] // сетевой захват записи IF ( RecLock( LOCK_RETRY ) ) FIELDPUT(FIELDNUM(cTemp2), nSRet ) IF FIELDNUM( "KOPERAT" ) > 0 FIELDPUT(FIELDNUM("KOPERAT"), M->nOperat ) // кто изменил справочник ENDIF //DBCOMMIT() DBUnlock() ENDIF ENDIF ENDIF ELSE Message( 'Нет поля "' + cPoleTemp + '" в БД' + Alias(), 5 ) ENDIF lEditField := .F. ELSEIF aPoleDost[ nCol ] == "R" Message( "Нельзя редактировать поле", 2 ) lEditField := .F. ELSEIF aPoleDost[ nCol ] == "J" cRunFun := aPoleWrite[ nCol, 1 ] IF ( RecLock( LOCK_RETRY ) ) aRet := &cRunFun cTemp2 := aRet[ 1 ] nSRet := aRet[ 2 ] // сетевой захват записи FIELDPUT(FIELDNUM(cTemp2), nSRet ) IF FIELDNUM( "KOPERAT" ) > 0 FIELDPUT(FIELDNUM("KOPERAT"), M->nOperat ) // кто изменил справочник ENDIF //DBCommit() DBUnlock() ENDIF lEditField := .F. ELSE IF nCol == 1 // первое поле КОД // &cBrw:aColumns[1]:lEdit := .F. // Редактирование поля 1 всегда ЗАПРЕЩЕНО // нужно делать отдельный доступ для оператора 101 // т.к. в справочниках 1-е поле это КОД НАИМЕНОВАНИЯ IF oBrw_1:nFireKey == VK_F9 .AND. M->nOperat == 101 lEditField := .T. // Можно редактировать эту ячейку ! ELSE MyMessage( "Нельзя редактировать это поле !", 2 ) ENDIF ELSE cPoleEdit := FieldGet( FIELDNUM( cPoleField ) ) // обработка на ТИП ПОЛЯ // MsgDebug(nCol," > ", "обработка на ТИП ПОЛЯ", cPoleField) IF FIELDTYPE(FIELDNUM( cPoleField )) == "M" cTitle := aPoleWrite[ nCol, 1 ] cFuncName := aPoleWrite[ nCol, 2 ] cT := Type( cFuncName ) IF .NOT.( cT == 'UI' .OR. cT == 'UE' ) MyMessage( 'Функции '+cFuncName+' нет в EXE-файле !; Обратитесь к разработчику программы !', 1 ) cRetval := "" ELSE cRetval := &cFuncName ENDIF // сетевой захват записи IF ( RecLock( LOCK_RETRY ) ) IF VALTYPE(aPoleWrite[nCol,3]) # "A" MyMessage( 'Нет массива координат !; Обратитесь к разработчику программы !', 1 ) Edit_Memo(cTitle+cRetval ,'' , cPoleField, .T., ) ELSE Edit_Memo(cTitle+cRetval ,'' , cPoleField, .T., aPoleWrite[nCol,4] ,aPoleWrite[nCol,3] ) ENDIF cPoleEdit := FieldGet( FIELDNUM( cPoleField ) ) //DBCommit() DBUnlock() ENDIF ELSE //MsgDebug("Line23ed()", "Set CURSOR ON","@ y, x GET cPoleEdit PICTURE cPolePict","READ") lEditField := .T. // Можно редактировать эту ячейку ! ENDIF IF lEditField // сетевой захват записи IF ( RecLock( LOCK_RETRY ) ) FieldPut( FIELDNUM( cPoleField ), cPoleEdit ) IF FIELDNUM( "KOPERAT" ) > 0 FIELD->KOPERAT := M->nOperat ENDIF //DBCommit() DBUnlock() ENDIF ENDIF ENDIF // nCol == 1 // первое поле КОД ENDIF // aPoleDost[ nCol ] == "SF", "S" ..... ENDIF IF lEditField == .F. oBrw_1:Refresh() ENDIF DoMethod( 'Form_Spr',"oBrw_1", "SetFocus" ) RETURN lEditField Только до редактирования же НЕ ДОХОДИТ !!! Я колёсиком вверх-вниз и алиас уже слетает !!! Т.е. стоя на 5-7 записях в справочнике уже видно что база отвалилась !!! 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() = "" - убит !!! Кем ? На экране таблица есть (в объекте) а все связи разорваны ! А вот еще облом, если записей много колёсиком-мышки нужно подергать вверх-вниз (просто на экране, не на всю длину) и то же вылетает .... 0/0 записей....


Andrey: Haz пишет: в bPrevEdit тыкни MsgDebug( Alias() ) Где поставить проверку ?

Haz: Andrey пишет: Где поставить проверку ? так уже поставил , выяснил что текущий алиас меняется . поставь первой строкой в MyFieldEdit dbSelectArea("STREET")

Andrey: Haz пишет: поставь первой строкой в MyFieldEdit dbSelectArea("STREET") Понял, СПАСИБО БОЛЬШОЕ ! Только я через статик переменную это поставил в MyChangeBrowse() и в MyFieldEdit() IF LEN(ALIAS()) == 0 dbSelectArea( cStaticAliasMain ) ENDIF Спасибо БОЛЬШОЕ всем кто помогал !!!

Haz: Andrey пишет: Только я через статик переменную а лучше так dbSelectArea( oBrw:cAlias ) ты ж бровс редактируешь а в нем алиас и так есть

Andrey: Опять Как создать колонку для показа/редактирования записей из массива ? Т.е. в базе содержится поле KGROUP и взамен его значения нужно показывать значение из массива MyDimGroup() ADD COLUMN TO oBrw9 HEADER CRLF + "Группа" SIZE 150 ; ALIGN DT_CENTER,DT_CENTER,DT_RIGHT ; DATA FieldWBlock( "KGROUP", Select() ) ; // как здесь определить ? EDITABLE oBrw9:aColumns[6]:bPrevEdit := { || MyDimGroup(), FALSE } // как здесь сделать вызов ? Если делаю напрямую, без oBrw9:aColumns[6]:bPrevEdit := .... ...... EDITABLE MyDimGroup() то справочник вызывается....

Haz: Andrey пишет: Как создать колонку для показа/редактирования записей из массива Вот стандартный из TSCOLUMN для понимания как работает Function ArrayWBlock( oBrw, nEle ) Return {|x| If(PCount() > 0, oBrw:aArray[ oBrw:nAt, nEle ] := x, oBrw:aArray[ oBrw:nAt, nEle ] ) } Вообще любой блок выборки записи упрощенно работает так 1. Если ему передают параметр - присваивает значение этого параметра ( запись) 2. Если не передают - читает ( выборка ) т.е. выборка должна быть типа aArray[ Ascan( aArray, (Alias())->KGROUP )] , при этом учитывать что если не найдет - будет вылет по ошибке aArray[0] ЗЫ. Пример условный т.к. не ясно что за массив ЗЫЫ Или опять тот же совет - смотреть как используется ::SetData() в исходниках tsBrowse - 100% твой случай

Andrey: Haz пишет: Пример условный т.к. не ясно что за массив Приблизительно так: AADD( aDim, { 0 , "---" } ) AADD( aDim, { 1 , "Новичок" } ) AADD( aDim, { 2 , "Руководство" } ) AADD( aDim, { 3 , "Специалисты" } ) AADD( aDim, { 4 , "Опытные пользователи" } ) AADD( aDim, { 5 , "Администратор БД" } ) AADD( aDim, { 90, "Уволенные с фирмы" } ) AADD( aDim, { 99, "Удаленные записи" } ) FOR nI := 1 TO LEN(aDim) AADD( aCod, aDim[nI,1] ) AADD( aNum, aDim[nI,2] ) NEXT DATA FieldWBlock( "KGROUP", Select() ) ; // как здесь определить ?

Haz: для колонки 1 по полю KGROUP примерно так oBrw:SetData( 1, ComboWBlock( oBrw, "KGROUP", 1, aArr ) ) в бровсе будет отображаться значение из массива только aArr := { aNom, aCod } нужно заменить на aArr := { aCod, aNom } все ж есть в примерах

Andrey: Haz пишет: все ж есть в примерах Спасибо БОЛЬШОЕ ! Кое что не получалось.... А как назначить блок выбора из массива ? oBrw9:aColumns[6]:bPrevEdit := { || MyDimGroup(), FALSE } // как здесь сделать вызов ? Если делаю напрямую, без oBrw9:aColumns[6]:bPrevEdit := .... ...... EDITABLE MyDimGroup() то справочник вызывается....

Haz: Andrey пишет: А как назначить блок выбора из массива ? oBrw9:aColumns[6]:bPrevEdit := { || MyDimGroup(), FALSE } // как здесь сделать вызов ? А какова цель этого ^^^ ? При чем тут блок выбора и :bPrevEdit ?

Andrey: Haz пишет: А какова цель этого ^^^ ? Хочу при нажатии на этой колонке, осуществлять выбор из справочника. Я не понимаю как делать отдельный выбор (вызов функции обработки) по колонке. Для мемо-поля (или другой отдельной функции) такой вариант проходит, а для выбора из ComboWBlock( oBrw, "KGROUP", 1, aArr ) почему то нет. Вот например эти функции нормально вызываются (по клавише ENTER): oBrw9:aColumns[4]:bPostEdit := {|| SeekLogin(), FALSE } // проверка после ввода oBrw9:aColumns[7]:bPrevEdit := { || SavePassword(), FALSE } // запись пароля А так не вызывается: (почему ? ) ADD COLUMN TO oBrw9 HEADER "Группа" ; ALIGN DT_CENTER,DT_CENTER,DT_RIGHT ; EDITABLE oBrw9:aColumns[6]:bPrevEdit := { || MyDimGroup(), FALSE } // вызов справочника Нужно делать только так (без блока): ...... EDITABLE MyDimGroup() Функция MyDimGroup() - переделана из примера \MiniGUI\SAMPLES\Advanced\Tsb_config FUNCTION MyDimGroup() LOCAL nI, aDim := {}, aArr:={},aCod := {}, aNom := {} LOCAL cPCode := "KGROUP" // поле записи в базу LOCAL nVal := 6 // номер колонки в таблице AADD( aDim, { 0 , "---" } ) AADD( aDim, { 1 , "Новичок" } ) AADD( aDim, { 2 , "Руководство" } ) AADD( aDim, { 3 , "Специалисты" } ) AADD( aDim, { 4 , "Опытные пользователи" } ) AADD( aDim, { 5 , "Администратор БД" } ) AADD( aDim, { 90, "Уволенные с фирмы" } ) AADD( aDim, { 99, "Удаленные записи" } ) FOR nI := 1 TO LEN(aDim) AADD( aCod, aDim[nI,1] ) AADD( aNom, aDim[nI,2] ) NEXT aArr := { aNom, aCod } // показ справочника (вариант 1) // oBrw:SetData( nVal, ComboWBlock( oBrw, cAlias+"->"+cPName, nVal, aDim ) ) // показ справочника (вариант 2) oBrw9:SetData( nVal, NIL, aArr) oBrw9:aColumns[nVal]:lEdit := .t. // Редактирование поля nI разрешено // oBrw9:aColumns[nVal]:bEditing := { |uVar,oBrw| CreateHelpLabel(), oBrw9:aColumns[oBrw9:nCell]:oEdit:LButtonDown() } oBrw9:aColumns[nVal]:bEditing := { |uVar,oBrw| oBrw9:aColumns[oBrw9:nCell]:oEdit:LButtonDown() } oBrw9:aColumns[nVal]:bEditEnd := { |uVal,oBrw,lSave| SaveOp(uVal,lSave,cPCode) } RETURN .T.

Haz: Andrey пишет: Функция MyDimGroup() - переделана из примера С этого и надо было начинать ... (с исходника) Вот это тоже переделано от туда же -> oBrw9:aColumns[6]:bPrevEdit := { || MyDimGroup(), FALSE } Тогда какого художника там делает FALSE ? Читаем справку по TSBrowse из поставки Minigui ============== читаем ОТ сюда ======================== <bPrevEdit> ( OPTIONAL ) Code Block that will be evaluated before starting the bData editing. This Code Block combined with bPostEdit, will be of great help when need to update the variable used in the Footer of the column, without going through the entire database. It also conditions the editing during run time, if it returns a False value, then the cell editing does not take place. TSBrowse passes as parameter to this Block the value of the variable before editing. ============== читаем ДО сюда ======================== И осмысливаем почему редактирования не происходит Andrey пишет: Для мемо-поля (или другой отдельной функции) такой вариант проходит,а для выбора из ComboWBlock( oBrw, "KGROUP", 1, aArr ) почему то нет. Потому что там редактирование у тебя сделано не в самой ячейке а во внешней фунции, а непосредственного редактирования ячейки также не происходит. PS. месье знает толк в извращениях. Сначала сам себе создает проблему на ровном месте, а потом трахается с ней неделю и тже сам

Andrey: Всем привет ! Подскажите пожалуйста как сделать следующее: 1) Редактирование ячейки по формату (см.картинку) 2) При нажатие редактирования 8-строки сделать вызов отдельной функции, которая прописана в поле PICTURE ? Файл программы 2DBF.7z здесь - https://cloud.mail.ru/public/5d315f972a72/MiniGui-Error

Dima: picture "@R 9(999) 999-999-99" picture "@R 999.999.999.999.999"

Andrey: Dima пишет: picture "@R 9(999) 999-999-99" picture "@R 999.999.999.999.999" Не всё так просто. Если сразу добавить, то и отображаться так будет. А мне надо только при редактировании.

Dima: Andrey пишет: А мне надо только при редактировании. [pre2] proc main local a:=space(12) local b:=space(15) cls @ 10,10 get a picture "@R 9(999) 999-999-99" @ 11,10 get b picture "@R 999.999.999.999.999" read return [/pre2]

Andrey: Dima пишет: @ 10,10 get a picture "@R 9(999) 999-999-99" @ 11,10 get b picture "@R 999.999.999.999.999" Dima это для терминалки подойдет. А для МиниГуи нет. См. пример: Файл программы 2DBF.7z здесь - https://cloud.mail.ru/public/5d315f972a72/MiniGui-Error



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