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

Andrey: Haz пишет: Зачем такой изврат , если драйвер самое быстрое и надежное решение ? Это да, не спорю. Просто делаю тест для 2-х видов: движение по таблице и драйвером. Что бы было из чего посмотреть/выбирать. Haz пишет: а в цикле oBrw:Skip(1) и указать по какой колонке . в моем примере - по всем ( да и пример этот только показывает как использовать ::bData ) Это уже не пойдёт ! [pre2] // допустим колонка LMETKA bBlock := oBrw:GetColumn("LMETKA"):bData nCol := oBrw:nColumn("LMETKA") nRec := oBrw:nAt // номер текущей строки FOR nI := 1 TO oBrw:nLen ????? // позиционирование по строке таблицы - подойдёт ли oBrw:GoPos(nI,nCol) lMark := Eval(bBlock) IF (cAlias)->(RLock()) Eval(bBlock, !lMark) (cAlias)->( DbUnlock() ) ELSE MsgStop("Line " +HB_NtoS(nI)+ " in the table is blocked!") ENDIF NEXT oBrw:GoPos(nRec,nCol) // передвинуть на номер где первоначально стоял МАРКЕР [/pre2]

Haz: Andrey пишет: позиционирование по строке таблицы - подойдёт ли oBrw:GoPos(nI,nCol) Не подойдёт. :: nAt не является номером строки в таблице. А в RDDADS валиасе из SQL запроса, вообще как генератор случайных чисел. Для этого есть ::nRowPos, причём это именно строка в таблице а не запись в базе. Далее в твоём примере не произойдёт смены строки бровса, т. к. нет obrw:Skip(1) Почему просто не сделать в 4 строки nRec := (recno()) Dbeval({¦¦ lMetka :=! lMetka}) Dbgoto(nRec) Obrw:drawSelect() Рассинхронизации бровсе не произойдёт. Alias не указавал т. к. напрягает код писать с телефона. Напиши чего хочешь то? Менять поле по всей таблице используя только методы бровса? Это можно, но не эффективно и тормозит. Не понимаю зачем? Если есть желание, то движение по таблице можно через ::Down() Вернуть обратно на нужную запись ::GotoRec( nrec) Только твой тест заранее в пользу драйвера будет и в разы. Навигация по таблице и пр. все и так использует драйвер. [pre2] n := 1 oBrw:GoTop() nRec := (oBrw:cAlias)->(Recno()) While n <= oBrw:nLen IF (oBrw:cAlias)->(Rlock()) Eval( nBlock, ! Eval(bBlock)) (oBrw:cAlias)->(dbUnlock()) End oBrw:Down() n++ end oBrw:GotoRec(nRec) [/pre2] Вместо ::Down() можно использовать ::Skip() будет быстрее но не наглядно т. к. курсор бровса остаётся на месте. А вообще бросай ты эту затею))

SergKis: Haz пишет Это можно, но не эффективно и тормозит. Не понимаю зачем? Думаю, Андрей хочет построчное изменение тсб, с визуальным эффектом. Ты такое проделывал, кажется с excel, отбирая по одной записи из адс и закидывая через оле. Не эффективно, но наглядно.


Haz: SergKis пишет: Андрей хочет построчное изменение тсб, с визуальным эффектом. делал и в бровсе и в екселе. В екселе это себя еще оправдывает. В бровсе визуальный эффект напрягает 😀 Ну примерно как делать предложено, хочет пусть делает

Andrey: Haz пишет: Напиши чего хочешь то? Менять поле по всей таблице используя только методы бровса? Это можно, но не эффективно и тормозит. Не понимаю зачем? Да ! Просто чтобы было, как ещё второй доступный вариант ! Haz пишет: Если есть желание, то движение по таблице можно через ::Down() Вернуть обратно на нужную запись ::GotoRec( nrec) Это уже использование средства драйвера, через псевдо-метод бровса. Haz пишет: Только твой тест заранее в пользу драйвера будет и в разы. Навигация по таблице и пр. все и так использует драйвер. Это и понятно, я уже у себя в тесте заметил даже на небольших базах. У меня получилось использовать только один вариант с оператором oBrw:GoPos(nI,nCol) ! Здесь спрашивал, можно ещё как нибудь сделать. Свой тест высылаю на почту к тебе, чтобы было понятней о чём идёт речь.

Haz: Andrey пишет: Это уже использование средства драйвера, через псевдо-метод бровса. А ничего что блокировка записи через драйвер? И блок через драйвер работает. Более того в бровсе ты работаешь с текущей записью и никакими средствами не сможешь Получить данные из любой другой пока она не станет текущей, а как тут то без драйвера по Записям прыгать? Все что ты видишь на экране бровса это прошлое- картинка на момент прорисовки и не более. Так что без драйвера увы никак.

Andrey: По итогу всех обсуждений сделал краткую справку ! Как переходить/работать по записям в таблице ? (работа с базой методами бровса - Tsbrowse) 1) - с отображением строки: [pre2]oBrw:GoTop() // передвинуть на первую запись базы oBrw:GoBottom() // передвинуть на последнюю запись базы oBrw:GoDown() // передвинуть на одну запись базы вниз oBrw:GoUp() // передвинуть на oBrw:GotoRec( nRecNo ) // передвинуть на номер записи базы - или так: // меняет указатель записи с помощью GoTo() на нужную запись oBrw:GoPos(nI,nCol) // передвинуть МАРКЕР на nI-строку, nCol-колонку // Или можно так - меняет указатель записи с помощью ::Skip() ПЕРЕБОРОМ в цикле. Правда перебор оптимизирован по разнице nRec := oBrw:nAt // номер текущей строки в таблице nCell := oBrw:nCell // номер текущего столбца в таблице nRPos := oBrw:nRowPos // номер текущей строки в таблице - не меняет указатель записи nRecAll := oBrw:nLen // общее кол-во записей в таблице nRecAll := oBrw:nRowCount // общее кол-во записей в таблице nCol := oBrw:nColumn("LMETKA") // номер колонки LMETKA oCol := oBrw:GetColumn(nCol) bBlock := oCol:bData Eval(bBlock, .F./.T.) // запись значения в колонку LMETKA oCol:cFooting := 'Foot' // запись в подвал колонки или Eval( {|| oBrw:nColumn("LMETKA"):bData }, .F./.T. ) // запись значения в колонку LMETKA oBrw:nColumn("LMETKA"):cFooting := 'Foot' // запись в подвал колонки oBrw:DrawLine() // перерисовать текущую строку таблицы oBrw:DrawSelect() // перерисовать текущую текущую стоку выделенными цветами ( цветом курсора) [/pre2] 2) - без отображения строки: [pre2]cAls := oBrw:cAlias nRec := (cAls)->( RecNo() ) (cAls)->( dbGotop() ) DO WHILE ! (cAls)->( EOF() ) IF (cAls)->(RLock()) // записать в базу .................. (cAls)->( DbUnlock() ) ELSE MsgStop("Recording in the database is blocked!") ENDIF oBrw:Skip(1) ENDDO (cAls)->( dbGoto( nRec ) ) (cAls)->( DBCOMMIT() ) oBrw:Refresh() // или oBrw:Refresh(.T.) oBrw:SetFocus() [/pre2] Работа с базой методами бровса (прислал Игорь Назаров): [pre2]bBlock := oBrw:GetColumn("LMARK"):bData nRec := Eval( ::bRecNo ) oBrw:GoTop() While !oBrw:Eof() if Eval(oBrw:bRecLock()) Eval(bBlock, !Eval(bBlock)) end oBrw:GoDown() // вызовет смещение текущей строки в бровсе и указателя записи в базе // Можно использовать oBrw:Skip(1) НЕ вызовет смещение текущей строки в // бровсе, но сместит указатель записи в базе (бровс рассинхронизируется) End oBrw:GotoRec(nRec) // синхронизация бровса[/pre2] !!! Перемещение и заполнение "средствами таблицы" невозможно в принципе. !!! Все операции в бровсе делаются только через RDD драйвера базы. Рабочий пример смотреть - MiniGUI\SAMPLES\Advanced\Tsb_4bases Функция (вариант 3) присланная SerKis для примера в папке SAMPLES\Advanced\Tsb_4bases\: [pre2]////////////////////////////////////////////// FUNCTION Metka_Test3(cFltr) LOCAL nI LOCAL nO := select() LOCAL oB := oStaticBrw LOCAL cA := oB:cAlias LOCAL cF := 'DIR'+SUBSTR(cA,5) LOCAL bF := oB:GetColumn(cF):bData LOCAL nR := (cA)->( RecNo() ) LOCAL aR := {}, aE := {} dbSelectArea(cA) If ! empty(cFltr) SET FILTER TO &cFltr EndIf dbGotop() DO WHILE ! EOF() If RLock() EVal(bF, ! EVal(bF)) dbUnLock() Else AAdd(aR, RecNo()) EndIf DO EVENTS SKIP ENDDO If ! empty(cFltr) SET FILTER TO EndIf If Len(aR) > 0 FOR nI := 1 TO Len(aR) dbGoto(aR[ nI ]) If RLock() EVal(bF, ! EVal(bF)) dbUnLock() aR[ nI ] := 0 Else AAdd(aE, aR[ nI ]) EndIf NEXT EndIf nI := 0; AEval(aE, {|nv,nn| nI += iif( nv > 0, 1, 0 ) } ) If nI > 0 MsgStop("Строки " +HB_ValToExp(aE)+ " не доступны !") EndIf dbGoto(nR) dbSelectArea(nO) oB:Refresh() oB:SetFocus() RETURN NIL[/pre2]

Vlad04:

Haz: Андрей пишет: oBrw:DrawSelect() // перерисовать текущую ячейку Поправлю, этот метод перерисовывает текущую стоку выделенными цветами ( цветом курсора) и тут не верно oCol:bData := .F./.T. // запись значения в колонку LMETKA bData должно быть блоком кода {¦¦} в примере Eval() не просто так.

SergKis: Haz пишет Поправлю ... Я то же поправлю, как было[pre2] FUNCTION Metka_Test2( cFltr ) LOCAL nI, cFltr ... LOCAL nR := (cA)->( RecNo() ) ... dbSelectArea(cA) cFltr : = DBSETFILTER() ... If ! empty(cFltr) SET FILTER TO &cFltr // восстановить фильтр, если был EndIf dbGoto(nR) [/pre2]

Andrey: Подправил ! Спасибо за помощь !

Andrey: Пишу пример для новой таблицы, с помощью SetArrayTo() и опять засада ! Ну что за диагностика ошибок в SetArrayTo() ... Ничего не понятно из неё !!! [pre2] ? cTbrName, cForm, aArray, aFontHF, aHead, aFSize, aFoot, aPict, aAlign, aName возвращает: oBrwTxt Form_Txt ARRAY[1] NIL ARRAY[16] ARRAY[16] ARRAY[16] ARRAY[16] ARRAY[16] ARRAY[16] oBrw1 := SetArrayTo( cTbrName, cForm, aArray, aFontHF, aHead, aFSize, aFoot, aPict, aAlign, aName )[/pre2] При выполнении ошибка: Error BASE/1132 Переполнение массива: Неверное количество аргументов</p><BR> Called from SETARRAYTO(410) in module: h_tbrowse.prg Called from TABLECREATESTEPONE(160) in module: tsb_form.prg Нельзя указать в каком массиве ошибка ?

SergKis: Andrey пишет Нельзя указать в каком массиве ошибка ? а посмотреть ? [pre2] Function SetArrayTo( ControlName, ParentForm, Arr, uFontHF, aHead, aSizes, uFooter, aPicture, aAlign, aName ) *-----------------------------------------------------------------------------* Local ix, oBrw ix := GetControlIndex (ControlName, ParentForm) oBrw := _HMG_aControlIds [ix] // 410 oBrw:SetArrayTo(Arr, uFontHF, aHead, aSizes, uFooter, aPicture, aAlign, aName) Return oBrw [/pre2] есть др. варианты SetArray(...) и команды, если не подходит SetArrayTo

Andrey: Блин, разобрался... Но всё равно осадок от непонятных ошибок остался... [pre2] cTbrName := "oBrwTxt" DEFINE TBROWSE oBrw1 ; // нужно вместо oBrw1 писать &cTbrName ...... END TBROWSE ? cTbrName, cForm, aArray, aFontHF, aHead, aFSize, aFoot, aPict, aAlign, aName oBrw1 := SetArrayTo( cTbrName, cForm, aArray, aFontHF, aHead, aFSize, aFoot, aPict, aAlign, aName )[/pre2] Желательно бы подправить ошибку на такой случай ! Как всегда ищем ошибку не в том месте !

Andrey: SergKis пишет: а посмотреть ? Посмотрел до этого, но ничего с ходу и не понял... Это видно для знатоков понятно !

Andrey: Первоначально в таблице SetArrayTo было 26 столбцов. Меняю таблицу на 8 столбцов. [pre2] nColMax := LEN(aDim[1]) nColMaxOld := oBrw1:nColCount() For nI := nColMax + 1 To nColMaxOld oBrw1:DelColumn( nI ) Next ? nColMax, oBrw1:nColCount()[/pre2] Результат: [pre2]8 26 8 == 8 [/pre2] Далее пытаюсь заполнить таблицу по новому массиву: [pre2] oBrw1:DeleteRow( .T. ) // Delete All aArray := aDim // переопределяем на новый входящий массив For nI := 1 TO Len(aArray) ? nI, HB_VALTOEXP(aArray[nI]) if ! empty(aArray[ nI ]) ADD ITEM aArray[ nI ] TO &cBrw OF &cForm // строка 384 EndIf Next[/pre2] Вылет с ошибкой: Error BASE/1132 Переполнение массива: Неверное количество аргументов Called from TSBROWSE:SETARRAY(10562) in module: h_tbrowse.prg Called from TSBROWSE:ADDITEM(7901) in module: h_tbrowse.prg Called from _ADDITEM(771) in module: h_controlmisc.prg Called from DOMETHOD(4960) in module: h_controlmisc.prg Called from TABLEFILLSTEPTWO(384) in module: tsb_form.prg Почему ? Что не так делаю ?

Haz: Andrey пишет: Желательно бы подправить ошибку на такой случай ! Как всегда ищем ошибку не в том месте ! Тут не ошибу поправлять надо.... Андрей, ты передал в функцию несуществующий контрол, и ошибка тебе говорит что не могу найти индекс массива по этому контролу. Забивать исходники проверкой на дурака можно но не нужно. Но если это очень важно, ничто не мешает написать обертку для SetarrayTo(), в которой сначала перепроверить все переданные параметры, а потом отдать их в саму SetarrayTo()

Haz: Andrey пишет: Почему ? Что не так делаю ? А по простому в цикле чего не заполнять? oBrw:aArray[x] [y] := aDim[x] [y]

Andrey: oBrw1:DeleteRow( .T. ) // Delete All aArray := ACLONE(aDim) // переопределяем на новый входящий массив For nI := 1 TO Len(aArray) ? nI, HB_VALTOEXP(aArray[nI]) if ! empty(aArray[ nI ]) //ADD ITEM aArray[ nI ] TO &cBrw OF &cForm aRows := Array(1, 8) aRows[1][1] := aArray[nI,1] aRows[1][2] := aArray[nI,2] aRows[1][3] := aArray[nI,3] aRows[1][4] := aArray[nI,4] aRows[1][5] := aArray[nI,5] aRows[1][6] := aArray[nI,6] aRows[1][7] := aArray[nI,7] aRows[1][8] := aArray[nI,8] ? "aRows[1]=" , HB_VALTOEXP(aRows[1]) oBrw1:AddItem( aRows[1] ) EndIf Next Вылет на строке - oBrw1:AddItem( aRows[1] ) Почему ?

Andrey: Поставил отладку в h_tbrowse.prg и выяснил ОЧЕНЬ интересную вещь !!! Оказывается в таблице ОСТАЛОСЬ 26 столбцов ! Почему ? Я же делал удаление: [pre2] For nI := nColMax + 1 To nCol oBrw1:DelColumn( nI ) Next[/pre2] и перепроверял у себя в коде : ? oBrw1:nColCount() -> возвращает 8. А в модуле h_tbrowse.prg строка 10561: [pre2] For nI := 1 To nColumns ? nI, "/", nColumns ? ::aArray[ 1, nI ] cType := ValType( ::aArray[ 1, nI ] )[/pre2] ? nColumns возвращает 26 !!! Как так ? Может как то очистить надо ? Типа oBrw1:Reset() ?



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