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

Ответов - 231, стр: 1 2 3 4 5 6 7 8 9 10 11 12 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: Подправил ! Спасибо за помощь !



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