On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
Vlad04
постоянный участник


Пост N: 420
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 19.12.13 18:16. Заголовок: TsBrowse в Минигуи (продолжение)


TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений
К примеру

 цитата:

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


Здесь я собрал параметры из разных tBrows
Можно или нет и какие парметры заменить
выражением ( и каким) ?
oBrw2:....
oBrw2:....



Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


Andrey
постоянный участник




Пост N: 5616
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.12.17 21:46. Заголовок: Haz пишет: Зачем та..


Haz пишет:

 цитата:
Зачем такой изврат , если драйвер самое быстрое и надежное решение ?



Это да, не спорю.
Просто делаю тест для 2-х видов: движение по таблице и драйвером.
Что бы было из чего посмотреть/выбирать.

Haz пишет:

 цитата:
а в цикле
oBrw:Skip(1)
и указать по какой колонке . в моем примере - по всем ( да и пример этот только показывает как использовать ::bData )



Это уже не пойдёт !
 
// допустим колонка 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) // передвинуть на номер где первоначально стоял МАРКЕР


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1140
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.12.17 22:04. Заголовок: Andrey пишет: позиц..


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)
Только твой тест заранее в пользу драйвера будет и в разы.
Навигация по таблице и пр. все и так использует драйвер.
  
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)


Вместо ::Down() можно использовать ::Skip() будет быстрее но не наглядно т. к.
курсор бровса остаётся на месте.
А вообще бросай ты эту затею))

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1662
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.12.17 22:48. Заголовок: Haz пишет Это можно,..


Haz пишет
 цитата:
Это можно, но не эффективно и тормозит. Не понимаю зачем?


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

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1141
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.12.17 22:53. Заголовок: SergKis пишет: Андр..


SergKis пишет:

 цитата:
Андрей хочет построчное изменение тсб, с визуальным эффектом.


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

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5617
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.12.17 22:53. Заголовок: Haz пишет: Напиши ч..


Haz пишет:

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


Да ! Просто чтобы было, как ещё второй доступный вариант !

Haz пишет:

 цитата:
Если есть желание, то движение по таблице можно через ::Down()
Вернуть обратно на нужную запись ::GotoRec( nrec)


Это уже использование средства драйвера, через псевдо-метод бровса.

Haz пишет:

 цитата:
Только твой тест заранее в пользу драйвера будет и в разы.
Навигация по таблице и пр. все и так использует драйвер.


Это и понятно, я уже у себя в тесте заметил даже на небольших базах.

У меня получилось использовать только один вариант с оператором oBrw:GoPos(nI,nCol) !
Здесь спрашивал, можно ещё как нибудь сделать.
Свой тест высылаю на почту к тебе, чтобы было понятней о чём идёт речь.


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1142
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.12.17 23:02. Заголовок: Andrey пишет: Это у..


Andrey пишет:

 цитата:
Это уже использование средства драйвера, через псевдо-метод бровса.


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


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5622
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.12.17 23:47. Заголовок: По итогу всех обсужд..


По итогу всех обсуждений сделал краткую справку !

Как переходить/работать по записям в таблице ?
(работа с базой методами бровса - Tsbrowse)


1) - с отображением строки:
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() // перерисовать текущую текущую стоку выделенными цветами ( цветом курсора)


2) - без отображения строки:
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()

Работа с базой методами бровса (прислал Игорь Назаров):
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) // синхронизация бровса


!!! Перемещение и заполнение "средствами таблицы" невозможно в принципе.
!!! Все операции в бровсе делаются только через RDD драйвера базы.


Рабочий пример смотреть - MiniGUI\SAMPLES\Advanced\Tsb_4bases

Функция (вариант 3) присланная SerKis для примера в папке SAMPLES\Advanced\Tsb_4bases\:
Скрытый текст


Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 740
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 08.12.17 06:42. Заголовок: :sm36: ..




Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1143
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.12.17 08:32. Заголовок: Vlad04 пишет: oBrw:..


Андрей пишет:

 цитата:
oBrw:DrawSelect() // перерисовать текущую ячейку


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


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1663
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.12.17 09:29. Заголовок: Haz пишет Поправлю ...


Haz пишет
 цитата:
Поправлю ...


Я то же поправлю, как было
 
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)




Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5623
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.12.17 10:39. Заголовок: Подправил ! Спасибо ..


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

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5652
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.17 16:49. Заголовок: Пишу пример для ново..


Пишу пример для новой таблицы, с помощью SetArrayTo() и опять засада !
Ну что за диагностика ошибок в SetArrayTo() ... Ничего не понятно из неё !!!

  ? 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 )

При выполнении ошибка:
Error BASE/1132 Переполнение массива: Неверное количество аргументов</p><BR>
Called from SETARRAYTO(410) in module: h_tbrowse.prg
Called from TABLECREATESTEPONE(160) in module: tsb_form.prg


Нельзя указать в каком массиве ошибка ?



Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1678
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.12.17 17:23. Заголовок: Andrey пишет Нельзя ..


Andrey пишет
 цитата:
Нельзя указать в каком массиве ошибка ?


а посмотреть ?
 
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

есть др. варианты SetArray(...) и команды, если не подходит SetArrayTo


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5653
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.17 17:37. Заголовок: Блин, разобрался... ..


Блин, разобрался... Но всё равно осадок от непонятных ошибок остался...

   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 )


Желательно бы подправить ошибку на такой случай !
Как всегда ищем ошибку не в том месте !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5654
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.17 17:39. Заголовок: SergKis пишет: а по..


SergKis пишет:

 цитата:
а посмотреть ?


Посмотрел до этого, но ничего с ходу и не понял...

Это видно для знатоков понятно !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5655
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.17 18:11. Заголовок: Первоначально в табл..


Первоначально в таблице SetArrayTo было 26 столбцов.
Меняю таблицу на 8 столбцов.
   nColMax := LEN(aDim[1]) 
nColMaxOld := oBrw1:nColCount()
For nI := nColMax + 1 To nColMaxOld
oBrw1:DelColumn( nI )
Next
? nColMax, oBrw1:nColCount()

Результат:
8	26	 
8 == 8

Далее пытаюсь заполнить таблицу по новому массиву:
   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

Вылет с ошибкой:
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

Почему ? Что не так делаю ?




Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1145
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.12.17 18:19. Заголовок: Andrey пишет: Желат..


Andrey пишет:

 цитата:
Желательно бы подправить ошибку на такой случай !
Как всегда ищем ошибку не в том месте !


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

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1146
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.12.17 18:29. Заголовок: Andrey пишет: Почем..


Andrey пишет:

 цитата:
Почему ? Что не так делаю ?


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

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5656
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.17 18:59. Заголовок: oBrw1:DeleteRow( .T...


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] )
Почему ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5657
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.17 20:01. Заголовок: Поставил отладку в h..


Поставил отладку в h_tbrowse.prg и выяснил ОЧЕНЬ интересную вещь !!!
Оказывается в таблице ОСТАЛОСЬ 26 столбцов ! Почему ?
Я же делал удаление:
   For nI := nColMax + 1 To nCol 
oBrw1:DelColumn( nI )
Next

и перепроверял у себя в коде : ? oBrw1:nColCount() -> возвращает 8.

А в модуле h_tbrowse.prg строка 10561:
   For nI := 1 To nColumns 
? nI, "/", nColumns
? ::aArray[ 1, nI ]
cType := ValType( ::aArray[ 1, nI ] )


? nColumns возвращает 26 !!!
Как так ?
Может как то очистить надо ?
Типа oBrw1:Reset() ?


Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 43
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет