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 [только новые]


Dima
администратор




Пост N: 6355
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.04.17 15:16. Заголовок: Andrey Рассчитывай ..


Andrey
Рассчитывай ширины столбцов так , что бы не было виртуального столбца , тогда и красить ни чего не придется.

PS
Или юзай nAdjColumn

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




Пост N: 5352
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.04.17 15:33. Заголовок: Dima пишет: Рассчит..


Dima пишет:

 цитата:
Рассчитывай ширины столбцов так , что бы не было виртуального столбца , тогда и красить ни чего не придется.



Есть справочники состоящие из 2 колонок всего.
Так что без виртуального столбца на экране никак не обойтись.

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




Пост N: 1081
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 14.04.17 16:43. Заголовок: Andrey пишет: Так ..


Andrey пишет:

 цитата:
Так что без виртуального


См obrw:hBrush в примерах

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




Пост N: 6356
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.04.17 16:44. Заголовок: Andrey Где то была ..


Andrey
Где то была процедура заливки фантома (строки и столбца) , Has показывал , но с ходу
не найду
Еще можно попробовать поиграть с фантомным столбцом через объект oPhant (это я по быстрому на сырец глянул)


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




Пост N: 5353
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.04.17 20:10. Заголовок: Haz пишет: См obrw:..


Haz пишет:

 цитата:
См obrw:hBrush в примерах



Нашёл. Поставил себе - не работает !!!

Делаю у себя 10 колонку:
      ADD COLUMN TO oBrw1 HEADER "Lang"       ; 
..........
COLOR CLR_BLACK, CLR_WHITE ;
.....

Потом ставлю для блокировки цвета ещё 11 колонку:
     // для избавления от белого цвета конца таблицы 
ADD COLUMN TO oBrw1 HEADER "" ;
DATA {|| NIL } ;
SIZE 0 ;
COLOR nBackTable, nBackTable ;
NAME ZERO

Только тогда цвет виртуального столбца становиться в цвет фона таблицы.
Но на экране некрасиво это выглядит, да и курсор туда убегает (становиться невидимым) - юзер теряться будет.....



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




Пост N: 6357
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.04.17 21:28. Заголовок: Andrey пишет: Тольк..


Andrey пишет:

 цитата:
Только тогда цвет виртуального столбца становиться в цвет фона таблицы.
Но на экране некрасиво это выглядит, да и курсор туда убегает (становиться невидимым) - юзер теряться будет.....


Растягивай первую колонку что бы не было фантомной.


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




Пост N: 1082
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 14.04.17 23:21. Заголовок: Andrey пишет: Нашёл..


Andrey пишет:

 цитата:
Нашёл. Поставил себе -


Тогда до понедельника

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




Пост N: 1083
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.04.17 12:23. Заголовок: Andrey пишет: Толь..


Andrey пишет:

 цитата:

Только тогда цвет виртуального столбца становиться в цвет фона таблицы.
Но на экране некрасиво это выглядит, да и курсор туда убегает (становиться невидимым) - юзер теряться будет.....


А в исходники посмотреть? Там же буквами написано, что фантомная колонка ВСЕГДА красится в цвет той, которая перед ней.
Другого указания цвета фантому в TS нет. Это было к вопросу почему фантом белый

Теперь как исправить. Так же посмотреть в исходники и увидеть что после назначения цвета фантому по последней колонке выполняется ::bOnDrawLine ( если он определен ) и тогда исправить цвет становится просто - в этом блоке вызываем функцию , которая все лечит
oBrw:bOnDrawLine := {|oBrw| SetPhantomBackcColor(oBrw) }


 
FUNC SetPhantomBackcColor(oBrw)
IF oBrw:oPhant <> Nil
oBrw:oPhant:nClrBack := RGB( 111, 183, 155 ) // к примеру пусть будет грязно голубой
end
RETURN NIL



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




Пост N: 1084
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.04.17 13:16. Заголовок: Бонус трек


Ну и напоследок бонус трек
Самое простое и очевидное решение, просто поражающее простотой.
Сделать колонку 11 скрытой

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




Пост N: 6358
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.04.17 13:23. Заголовок: Haz пишет: Сделать ..


Haz пишет:

 цитата:
Сделать колонку 11 скрытой


Игорь крась яйца уже

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




Пост N: 1085
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.04.17 13:35. Заголовок: Dima пишет: крась я..


Dima пишет:

 цитата:
крась яйца


Все покрашено с утра
И яйца и фантом, хожу с кисточкой и думаю гдеб еще мазнуть

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




Пост N: 6359
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.04.17 13:37. Заголовок: Haz :sm54: ..


Haz

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




Пост N: 5354
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.04.17 23:30. Заголовок: Haz пишет: Самое пр..


Haz пишет:

 цитата:
Самое простое и очевидное решение, просто поражающее простотой.
Сделать колонку 11 скрытой


Да подумал я об этом, сразу не сделал так как посчитал SIZE 0 будет 0, а не 2-3 пиксела как на экране.
Спасибо за решение !

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




Пост N: 1412
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 09:17. Заголовок: gfilatov2002 Добави..


gfilatov2002
Добавил, у себя, возмозможность уст. высоту Edit отличную от высоты Cell
 
CLASS TSBrowse FROM TControl
...
DATA nHeightEdit AS NUMERIC INIT 0 // GetBox cell height
...
METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, nClrBack ) CLASS TSBrowse
...
IF ::nColSpecHd != 0
nRow := ::nHeightHead + ::nHeightSuper + If( oCol:l3DLook, 2, 0 )
nCol := nStartX + If( oCol:l3DLook, 2, 0 )
nWidth := ::GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 1 )
nHeight := ::nHeightSpecHd - If( oCol:l3DLook, 1, -1 )
else
nRow := ::nRowPos - 1
nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ;
::nHeightSuper + ::nHeightSpecHd + If( oCol:l3DLook, 2, 0 )
nCol := nStartX + If( oCol:l3DLook, 2, 0 )
nWidth := ::GetColSizes()[ nCell ] - If( oCol:l3DLook, 2, 0 )
nHeight := ::nHeightCell - If( oCol:l3DLook, 1, -1 )
If ::nHeightEdit > 0
nI := nHeight - ::nHeightEdit
If nI > 4
nHeight := ::nHeightEdit
nRow += int(nI / 2)
EndIf
EndIf

endif

If oCol:cResName != Nil .or. oCol:lBtnGet
...

Полезно при исп. тсб как аналог списка пар Label+GetBox без линий и с исп. image > 24

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




Пост N: 6376
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.04.17 09:20. Заголовок: SergKis Так ее же м..


SergKis
Так ее же можно установить в bPrevEdit с помощью SetGetAdjustBrw , нет ?

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




Пост N: 1413
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 09:34. Заголовок: Dima если ты имеешь..


Dima
если ты имеешь ввиду aEditCellAdjust := {0,0,0,0}, то да, так можно управлять, но в моей версии этого нет и ...
тогда предложение снимаю.


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




Пост N: 6377
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.04.17 09:56. Заголовок: SergKis я имел в ви..


SergKis
я имел в виду примерно такой код
 
obrw3:GetColumn("cod"):bPrevEdit := { |a, b, lLock| SetGetAdjustBrw(b,{2,0,-2,-3}) .............


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




Пост N: 1414
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 10:22. Заголовок: Дима, где есть SetG..


Дима, где есть SetGetAdjustBrw(...) ? Просканировал MiniGui, не получил результата.
Потом bPrevEdit исп. для простой ситуации (а если много колонок) ..., слишком сложно.
В целом имея высоту getbox мне хватает того, что у себя сделал. А ширина всегда по ширине cell,
этим манипулирует пользователь, а я - picture

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




Пост N: 6378
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.04.17 10:34. Заголовок: Сергей я тупанул :s..


Сергей я тупанул
Это я свою функцию заюзал
Func SetGetAdjustBrw(o,amas)
o:aEditCellAdjust[1]:=amas[1]
o:aEditCellAdjust[2]:=amas[2]
o:aEditCellAdjust[3]:=amas[3]
o:aEditCellAdjust[4]:=amas[4]
return .t.

Ты был прав насчет aEditCellAdjust


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




Пост N: 1415
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 10:48. Заголовок: Дима, зачем ты в это..


Дима, зачем ты в это делаешь в bPrevEdit, разве не достаточно простого на весь tsb
nHget := 22
nH := :nHeightCell - nHget
If nH > 4
:aEditCellAdjust[1] := int(nH / 2)
:aEditCellAdjust[4] := nHget
EndIf
для мультистрок будет своя высота пересчитана, а для др. ситуаций сделанного, достаточно

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




Пост N: 1416
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 10:54. Заголовок: PS :aEditCellAdjust ..


PS
:aEditCellAdjust[4] := -nH

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




Пост N: 1417
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 11:34. Заголовок: Похоже :aEditCellAdj..


Похоже :aEditCellAdjust - возможность задать отступы в Cell (:aEditCellAdjust := {-2,-1,-1,-2}),
а размеры редактирования это свойства колонки и должны быть в TColumns. Что то такое
 
DATA nEditWidth AS NUMERIC INIT 0 // editing width
DATA nEditHeight AS NUMERIC INIT 0 // editing height

с вытекающими из этого действиями ...

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




Пост N: 6379
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.04.17 13:08. Заголовок: SergKis пишет: Дима..


SergKis пишет:

 цитата:
Дима, зачем ты в это делаешь в bPrevEdit


Кто то подсказал в свое время , так и прижилось.

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




Пост N: 1091
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.04.17 13:51. Заголовок: Dima пишет: Кто то ..


Dima пишет:

 цитата:
Кто то подсказал в свое время , так и прижилось.


прижилось с каких-то давних версий , где еще не было корректирующего массива размеров.
В PrevEdit я ровнял окно редактирования , т.к. она раньше категорически не хотело выравниваться под ячейку.
Потом проблема была решена и с тех пор не тспользую

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




Пост N: 6380
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.04.17 13:59. Заголовок: Haz У меня проблема..


Haz
У меня проблема была другого плана.
После выхода из режима редактирования ячейки , "сетка" по периметру ячейки исчезала , поэтому координаты GET пришлось
изменить что бы он не налазил на края ячейки.

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




Пост N: 1418
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 14:09. Заголовок: Dima пишет координат..


Dima пишет
 цитата:
координаты GET пришлось изменить что бы он не налазил на края ячейки.


Так это Григорий подправлял и сейчас все нормуль

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




Пост N: 6381
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.04.17 14:15. Заголовок: SergKis пишет: Так ..


SergKis пишет:

 цитата:
Так это Григорий подправлял и сейчас все нормуль


У меня версия еще от июня 2016 года , он правил позже ?

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




Пост N: 1419
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 14:20. Заголовок: Дима, трудно сказать..


Дима, трудно сказать, надо искать (там было GoLeft() и что то еще)
Но уже давно, переносил изм. к себе помню ...

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




Пост N: 6382
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.04.17 14:24. Заголовок: SergKis пишет: над..


SergKis пишет:

 цитата:
надо искать (там было GoLeft() и что то еще)


Пороюсь.
А GoLeft() был в 2008 году

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




Пост N: 1420
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.04.17 19:06. Заголовок: Dima пишет А GoLeft(..


Dima пишет
 цитата:
А GoLeft() был в 2008 году


Позже было и GoRight и GoDown
Нашел http://clipper.borda.ru/?1-1-40-00000454-000-180-0
пост N 848 от 06.11.15 21:33.
gfilatov2002 пишет
 цитата:
Вроде удалось поправить прорисовку разделительной линии в методах GoRight и GoDown


С тех пор прорисовка линий после edit нормальная.

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




Пост N: 6383
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.04.17 21:39. Заголовок: SergKis пишет: Позж..


SergKis пишет:

 цитата:
Позже было и GoRight и GoDown


Да я чисто шарил по C:\MiniGUI\Doc\ChangeLog.txt а там только 8 год всплыл , да и фиг с ним ))


SergKis пишет:

 цитата:
пост N 848 от 06.11.15 21:33.


И да , версия Минигуи у меня была уже старше и точно не 15 год ))

SergKis пишет:

 цитата:
С тех пор прорисовка линий после edit нормальная.


Не понятно зачем я тогда правил все это дело на свежем Минигуи 2016 года
Но глючило 100 %


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




Пост N: 1092
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.04.17 22:10. Заголовок: Dima пишет: Но глю..


Dima пишет:

 цитата:
Но глючило 100 %


И сейчас глючит. Без белых засветов вокруг закрытого гет обьекта, но линии гряды трет

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




Пост N: 1421
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.04.17 08:33. Заголовок: Haz пишет но линии г..


Haz пишет
 цитата:
но линии гряды трет


В какой ситуации ? Погонял примеры - не трет.
У меня версия, тоже не трет.


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




Пост N: 1093
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.04.17 09:02. Заголовок: SergKis пишет: В к..


SergKis пишет:

 цитата:

В какой ситуации ?


В ситуации обычного гетбокса. Сейчас точно сказать не могу т. к не на работе.
Стандартная библиотека, прошлая или позапрошлая. Без выравнивани границ гет обьекта.
После редактирования затирается одна из горизонтальных границ.
Из дополнительных условий- двойной курсор с градиентом и браш на бровсе в цвет фона строк.
Завтра погоняю, напишу подробнее. Но в принципе не напрягает, белых засветов нет и при желании легко исправляется выравниванием границ гет поля.

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




Пост N: 1423
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.04.17 09:08. Заголовок: Haz пишет Но в принц..


Haz пишет
 цитата:
Но в принципе не напрягает


Только не хотелось, что бы клиент носом ткнул в эту ситуёвину

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




Пост N: 1094
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.04.17 09:33. Заголовок: SergKis пишет: Толь..


SergKis пишет:

 цитата:
Только не хотелось, что бы клиент носом


Перед сдачей клиенту всех мелких тараканов обычно принято давить.
Но иногда и не до них бывает т. к есть и не мелкие)
К примеру иногда наблюдаю традиционное залипание нижней строки.
Понятно что исправимо, и не на всех рабочих местах у клиента проявляется.
Такие вещи полирую уже при тестовой эксплуатации, т. к. с вероятностью больше 50%
будут изменения в интерфейсе когда люди начнут работать.



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1089
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.04.17 10:24. Заголовок: Haz пишет: Но иногд..


Haz пишет:

 цитата:
Но иногда и не до них бывает т. к есть и не мелкие


Подтверждаю
Вот набрел на ошибку, возникающую при использовании SPINNER внутри GetBox поля (при использовании метода oBrw:SetSpinner()).
Проблема заключается в том, что при нажатии на ползунки этого Spinnerа начинает убегать указатель с текущей записи

Haz
Может, поможите побороть эту бяку

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




Пост N: 1095
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.04.17 12:06. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Может, поможите побороть эту бяку


Григорий завтра посмотрю. Сейчас сижу болею дома

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




Пост N: 6385
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.04.17 14:14. Заголовок: Haz пишет: Сейчас с..


Haz пишет:

 цитата:
Сейчас сижу болею дома


Выздоравливай !!!


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




Пост N: 1096
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.04.17 14:34. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Проблема заключается в том, что при нажатии на ползунки этого Spinnerа начинает убегать указатель с текущей записи


Это следствие , причина в том, что бровс получает команду сдвинуть этот указатель ползунками или кнопками не важно.
Если в METHOD Command( nWParam, nLParam ) CLASS TControl закоментировать убиение фокуса
 
case nNotifyCode == EN_KILLFOCUS
::LostFocus()


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


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




Пост N: 1097
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.04.17 14:43. Заголовок: Поправлюсь не закоме..


Поправлюсь
не закоментить KillFoсus а нооборот показать добавив ниже
case nNotifyCode == EN_SETFOCUS
::SetFocus()

Пока все что выяснил - При нажатии какой-либо стрелки спина он посылает родительскому окну сообщение WM_VSCROLL. а родительским заявлено окно бровса и это заставляет бровс бегать по записям. Можно попробовать использовать флаг ::lDontChange , который учитывать при обработке событий в TSBrowse:HandleEvent() , можно попробовать в событиях просто фильтрануть lParam в котором будет передан дескриптор спина ( он определяется как ::hWndChild в METHOD TBtnBox:New() но в нем и хоронится и никуда не передается )
На скорую руку попробовал , частично помогает , но при выходе из режима редактирования чтото уперто сдвигает указатель на ::GoTop()



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




Пост N: 1098
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.04.17 15:04. Заголовок: Григорий По поводу..


Григорий
По поводу спиннера и дергания записей
это частично решает проблему ( просто фильтруем в бровсе сообщения от спеннера)
 
* ============================================================================
* METHOD TSBrowse:HandleEvent() Version 9.0 Nov/30/2009
* ============================================================================

METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse

#ifdef __HARBOUR__
ElseIf nMsg == WM_KEYUP
Return ::KeyUp( nWParam, nLParam )
ElseIf nMsg == WM_VSCROLL
If ::lDontchange
Return Nil
EndIf
if nLParam == 0
Return ::VScroll( Loword( nWParam ), HiWord( nWParam ) )
endif
#EndIf


т.е. исключаем из обработки бровсом сооющения от спенера, но пока частично решает
при первом клике в колонке со спином и выходе из редактирования запись улетает на GoTop() потом сколько не редактируй и не кликай по спину - все ОК
скорее всего после первого редактирования выставляется какой нить внутренний флаг и потом его обрабатывает правильно
что переводит запись в GoTop - так и не нашел, тк не смог поймать пока это единственное первое событие


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1091
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 25.04.17 15:29. Заголовок: Haz Благодарю за ре..


Haz
Благодарю за реальную помощь в этом вопросе!

Haz пишет:

 цитата:
исключаем из обработки бровсом сообщения от спайнера


Принимается

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




Пост N: 1425
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.04.17 12:14. Заголовок: gfilatov2002 METHO..


gfilatov2002
 
METHOD LDblClick( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse
...
If ( nClickRow == ::nRowPos .and. nClickRow > 0 ) .or. ( nClickRow == ::nRowPos .and. ! ::lDrawHeaders )

If ::lCellBrw .and. ::IsEditable( nCol )

::nColSpecHd := 0
If ValType( Eval( ::aColumns[ nCol ]:bData ) ) == "L" .and. ;
::aColumns[ nCol ]:lCheckBox // virtual checkbox
::PostMsg( WM_CHAR, VK_SPACE, 0 )
ElseIf ::aColumns[ nCol ]:oEdit != Nil
::PostMsg( WM_KEYDOWN, VK_RETURN, 0 )
ElseIf ::bLDblClick != Nil
Eval( ::bLDblClick, uPar1, uPar2, nKeyFlags, Self )

Else
::PostMsg( WM_KEYDOWN, VK_RETURN, 0 )
EndIf
...

по мне, так правильнее будет.
bLDblClick задан, но не срабатывает в этой ситуации (так было)

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1094
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.04.17 13:02. Заголовок: SergKis пишет: bLDb..


SergKis пишет:

 цитата:
bLDblClick задан, но не срабатывает в этой ситуации


Понимаю Вашу логику, но у автора библиотеки этот кодовый блок используется только для НЕ редактируемых TSBrowse
Это явно следует из кода метода LDblClick


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




Пост N: 1427
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.04.17 13:40. Заголовок: gfilatov2002 пишет ..


gfilatov2002 пишет
 цитата:
но у автора библиотеки этот кодовый блок используется только для НЕ редактируемых


Мне кажется, у автора не до конца продумано.
При наличии :nFireKey посылать надо oBr:PostMsg( WM_KEYDOWN, VK_F4, 0 ) а не VK_RETURN
К примеру edit включаем VK_F4 ( :nFireKey := VK_F4 ), а VK_RTUEN назначить надо выбор строки.
При работе со справочниками это сплошь и рядом - на окне где ТОЛЬКО справочник VK_RETURN может включать edit,
а в вызове справочника (GrtBox) для выбора из списка (все операции по ведению спр. присутствуют) - VK_ENTER\bDblClick - это выбор строки для занесения данных в документ. В сегодняшней версии это затруднительно сделать простым способом

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




Пост N: 1428
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.04.17 13:41. Заголовок: PS правильно посылат..


PS
правильно посылать надо oBr:PostMsg( WM_KEYDOWN, oBr:nFireKey, 0 )

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1095
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.04.17 14:18. Заголовок: SergKis пишет: При ..


SergKis пишет:

 цитата:
При работе со справочниками это сплошь и рядом


Тогда принимается - Вам виднее
Благодарю за дополнительное разъяснение

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




Пост N: 5374
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.05.17 18:00. Заголовок: Что то перестал отоб..


Что то перестал отображаться чекбокс в Tsbrowse.
Версия MiniGUI Extended Edition 16.11 - работает отлично !
Версия MiniGUI Extended Edition 17.04 - не отображает....

Вот скрин экрана:


Мышкой по чекбоксу кликаешь - нет отображения...

Что там нужно доп. сделать у себя в коде чтобы отображалась ?

В коде создаю колонку так:
 // создать 3-ю колонку  
ADD COLUMN TO oBrw2 HEADER "Печать"+CRLF+"в таблице" ;
DATA FieldWBlock( "VIEW", Select() ) ;
......
oBrw2:aColumns[3]:bPrevEdit := {|| HeadCheckField(), FALSE } // проверка до ввода

В функции HeadCheckField() в конце обработки ставлю:
   oBrw1:Reset()  
oBrw1:Refresh(.T.)
oBrw2:Refresh(.T.)
RETURN NIL

Больше никаких функций не использую...


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




Пост N: 6413
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.05.17 18:05. Заголовок: Andrey пишет: Верси..


Andrey пишет:

 цитата:
Версия MiniGUI Extended Edition 17.04 - не отображает....


Чеканул пример C:\MiniGUI\SAMPLES\Advanced\Tsb_array_2\
Все кажет норм !

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




Пост N: 5375
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.05.17 18:19. Заголовок: Dima пишет: Чеканул..


Dima пишет:

 цитата:
Чеканул пример C:\MiniGUI\SAMPLES\Advanced\Tsb_array_2\
Все кажет норм !


Там по другому создаётся бровс.
У меня конкретно в версии 16.11 работает, а в 17.04 - не отображает чекбокс.
Что там сделали в исходниках я не знаю, но правка была же, если перестало работать !
По пробелу или по клику мышке ПЕРЕСТАЛ работать чекбокс после версии 16.11 !
Может быть из-за того что использую сразу ДВА бровса ?

Как можно перерисовать конкретно 3 колонку после ввода ?
Поможет ли это ?
Попробовал поставить -
oBrw2:aColumns[3]:bPostEdit := {|| oBrw2:DrawSelect(), FALSE } // проверка после ввода
НЕ ПОМОГАЕТ !!!

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




Пост N: 6414
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.05.17 18:45. Заголовок: Andrey пишет: По пр..


Andrey пишет:

 цитата:
По пробелу или по клику мышке ПЕРЕСТАЛ работать чекбокс после версии 16.11 !


Долго же ты ждал пока понял что не пашет :)

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




Пост N: 5376
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.05.17 18:56. Заголовок: Dima пишет: Долго ж..


Dima пишет:

 цитата:
Долго же ты ждал пока понял что не пашет :)


Да это не главное меню в программе. Редко кто пользуется. Вот и обнаружил с таким промежутком времени.
Попробую проверить другие версии...


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




Пост N: 5377
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.05.17 19:14. Заголовок: Проверил. В версии 1..


Проверил. В версии 17.02 работает, а в 17.03 - уже не отображает чекбокс.
Т.е. - по пробелу или по клику мышке ПЕРЕСТАЛ работать чекбокс после версии 17.02 !
Что нужно мне добавить в свой код чтобы по клику мышки стал отображаться чекбокс ?
Использую сразу ДВА бровса на одном окне.

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




Пост N: 6415
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.05.17 19:46. Заголовок: Andrey пишет: Т.е. ..


Andrey пишет:

 цитата:
Т.е. - по пробелу или по клику мышке ПЕРЕСТАЛ работать чекбокс после версии 17.02


Так это не чекбокс по ходу а просто BMP как и на другом бровсе в твоем скрине

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1096
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.05.17 20:02. Заголовок: Andrey пишет: oBrw2..


Andrey пишет:

 цитата:
oBrw2:aColumns[3]:bPrevEdit := {|| HeadCheckField(), FALSE } // проверка до ввода


Попробуй изменить это кодовый блок таким образом

 цитата:
oBrw2:aColumns[3]:bPrevEdit := {|| HeadCheckField(), TRUE }



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




Пост N: 5378
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.05.17 21:13. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:

Попробуй изменить это кодовый блок таким образом



Так заработало ! Спасибо большое !

Хотя если только ОДИН бровс, то работает и со старым синтаксисом.
Смотри пример Tsb_composite_(1.2).7z который я высылал...
Там в 3х местах используется:
         oBrw1:aColumns[3]:bPrevEdit := {|| FieldCheckBoxEdit(), FALSE }   
oBrw1:aColumns[4]:bPrevEdit := {|| FieldCheckBoxEdit(), FALSE }
oBrw1:aColumns[5]:bPrevEdit := {|| FieldCheckBoxEdit(), FALSE }



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




Пост N: 5379
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.05.17 21:45. Заголовок: Ха, в версии 17.04 п..


Ха, в версии 17.03 и выше перестал работать пример Tsb_composite_(1.2).7z - там где выбор флагов производиться...
Один раз выбрать можно, на втором - программа НАГЛУХО ВИСНЕТ !!!
Вот сам проект - https://cloud.mail.ru/public/2SXc/UtNfso4gf
Что-то в коде нужно добавить ?

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




Пост N: 5380
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.05.17 19:56. Заголовок: Опять непонятка в ра..


Опять непонятка в работе функций....
Григорий, проект у тебя есть - Send2Mail.hbp
Там вызов функции в модуле Tsb_send.prg строка:
    oBrw:Excel2(cFile, lActivate, NIL, "_"+Space(70)+Form_0.Title, lSave )

Версия 17.02 - работает, а в других уже НЕТ !!!
Что там докрутить/исправить нужно, чтобы заработало ?

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




Пост N: 5383
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.05.17 21:39. Заголовок: Разобрался сам... Ок..


Разобрался сам... Оказывается если нет такого пути к файлу, то Ексель и не создаёт и не открывает его !

Григорий, там можно в исходниках поставить проверку на создания по пути файла ?

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




Пост N: 6417
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.05.17 21:44. Заголовок: Andrey пишет: Разоб..


Andrey пишет:

 цитата:
Разобрался сам... Оказывается если нет такого пути к файлу, то Ексель и не создаёт и не открывает его


Про это уже писалось и не раз !
Бывает :)

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


Пост N: 696
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 10.05.17 13:57. Заголовок: Haz Редактирование ..


Haz
Редактирование Ключевого поля в TsBrows. Я писал, что после выхода из редактирования курсор не поднимается на нужную строку
Игорь, как-то выкладывал пример редактирования ключевого поля, но в примере были особенности- вторая форма для редактирования,
программное построение Бровса и т.д.
Посмотрите пример построенный в основном в Дизайнере - click here,
может удастся заставить курсор подниматься ?
И еще , при входе в редактирование сетка пропадает.

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




Пост N: 6418
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.05.17 14:08. Заголовок: Vlad04 пишет: И еще..


Vlad04 пишет:

 цитата:
И еще , при входе в редактирование сетка пропадает.


Почитай начиная с поста 6376 этой темы

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


Пост N: 697
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 10.05.17 14:25. Заголовок: Dima Все темы читаю..


Dima
Все темы читаю. В примере кода практически нет, все должно работать по- умолчанию ( или почти всё)
без танцев с бубном.

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




Пост N: 1434
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.05.17 16:11. Заголовок: Vlad04 пишет В прим..


Vlad04 пишет
 цитата:
В примере кода практически нет, все должно работать по- умолчанию ( или почти всё)
без танцев с бубном.


Танцы вы сами придумали себе кодом:
oBrw_1:aColumns[1]:bPrevEdit := { || oBrw_1:Upstable() , oBrw_1:Refresh(.T.) , oBrw_1:ResetVScroll() , .t. }
запустив перед edit кучу процедур по прорисовке тсб, при этом совершенно забыв про очередь сообщений, по которой и происходят действия прорисовки.

 цитата:
Все темы читаю


но чуть чуть по диагонали. В примере Tsb_addrecord_3 ситуация с обработкой очереди для прорисовки показана была:
 
STATIC FUNC Add_Rec( oBrw )
...
If ! Empty(aResult)
dbSelectArea(cAls)
dbAppend()
If ! NetErr() .and. RLock()
nRec := RecNo()
REPL KODS with aResult[1], ;
NAME with aResult[2]
If oBrw:nLen == oBrw:nRowCount()
oBrw:oHScroll:SetRange(0,0)
EndIf
oBrw:GotoRec(nRec)
nCol := oBrw:nColumn("NAME")
If nCol != oBrw:nCell
oBrw:nCell := nCol
oBrw:DrawSelect()
EndIf
oBrw:lChanged := .T.
oBrw:PostEdit(aResult[2], nCol, Nil)
DO EVENTS
oBrw:PostMsg(WM_KEYDOWN, VK_F4, 0)
EndIf
EndIf
...

т.е. если убрать DO EVENTS много разного увидите

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




Пост N: 1103
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.05.17 16:34. Заголовок: Dima пишет: может у..


Vlad04 пишет:

 цитата:
может удастся заставить курсор подниматься ?
И еще , при входе в редактирование сетка пропадает.



Нет ничего проще

1) в Form_0.fmg удалить это ON INIT Init_Form_0() и соответственно саму функцию в програмном модуле tsb.prg
2) в tsb.prg сделать так

LOAD WINDOW Form_0

oBrw_1:SetIndexCols( 1 )
oBrw_1:SetOrder( 1 )

Form_0.Center
Form_0.Activate

PS Сергей прав по поводу танцев, но уверен со временем все уляжется в голове и танцы будут не нужны



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


Пост N: 698
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 10.05.17 17:45. Заголовок: SergKis примере Tsb..


SergKis

 цитата:
примере Tsb_addrecord_3


Конечно,смотрел и этот пример. Многое не понял. Для такого простого результата - на форме одна таблица с 4-мя кнопками, код
очень сложный. А если на форме несколько таблиц, а в программе десяток форм....

Haz

 цитата:

oBrw_1:SetIndexCols( 1 )
oBrw_1:SetOrder( 1 )


просто и работает


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


Пост N: 699
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 10.05.17 17:57. Заголовок: Курсор поднимается ,..


Курсор поднимается , но на одно строку промахивается.
При движении вниз так же ошибка на одну строку.

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




Пост N: 1435
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.05.17 18:08. Заголовок: Vlad04 пишет А если ..


Vlad04 пишет
 цитата:
А если на форме несколько таблиц


Код в примере практически не изменится для всех таблиц, используемых на окне(ах). Изменятся параметры задания колонок, валидности и др. не стандартных действий. И в примере есть ввод, едит и удаление (все сводится к примерно tsb_array_2 для таблиц). В вашем нет (якобы кода) ничего,кроме едит, но будет куча fmg для справочников в чилд\модал окнах, привязанных к железным алиасам. Не уверен, что это проще.

 цитата:
Многое не понял


Так лучше спросить, чем оставаться в не понятках.

 цитата:
просто и работает


Так это работало со времен примера Tsb_addrecord_2
 
oBrw:SetIndexCols( oBrw:nColumn("ID"), ;
oBrw:nColumn("INFO") )
oBrw:SetOrder( oBrw:nColumn("ID") )


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




Пост N: 1436
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.05.17 18:46. Заголовок: Vlad04 пишет но на о..


Vlad04 пишет
 цитата:
но на одно строку промахивается.


После редактирования у колонки есть свойство, куда деть курсор после, по умолчанию переместиться дальше ...
Потому такой результат. Поставьте
 
oBrw_1:aColumns[1]:nAlign := DT_LEFT
oBrw_1:aColumns[ 1 ]:nEditMove := DT_DONT_MOVE

oBrw_1:SetIndexCols(1)
oBrw_1:SetOrder(1)
oBrw_1:SetFocus()

Form_0.Center
Form_0.Activate


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


Пост N: 700
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 10.05.17 18:53. Заголовок: SergKis куча fmg дл..


SergKis

 цитата:
куча fmg для справочников в чилд\модал окнах, привязанных к железным алиасам. Не уверен, что это проще.


Это и хорошо , что есть варианты.У меня есть одна универсальная форма для типовых справочников и отдельные формы для остальных случаев.


 цитата:
Так это работало со времен примера Tsb_addrecord_2



Не понял сразу, в Делфи для Бровса( там это грид) несколько другая идеология - отображать данные, а не управлять ими.Да и консольный Харбор
ведет себя по-другому.

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


Пост N: 701
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 10.05.17 18:58. Заголовок: Уф!! Теперь все норм..


Уф!!
Теперь все нормально ! Спасибо всем !

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




Пост N: 1437
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.05.17 19:07. Заголовок: Vlad04 пишет У меня ..


Vlad04 пишет
 цитата:
У меня есть одна универсальная форма для типовых справочников и отдельные формы для остальных случаев.


т.е. из меню главного окна у вас нельзя вызвать несколько окон справочников одновременно, только по очереди, т.к. в fmg прописан конкретный алиас в одной унив. форме ?

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




Пост N: 5384
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.05.17 19:55. Заголовок: SergKis пишет: т.е...


SergKis пишет:

 цитата:
т.е. из меню главного окна у вас нельзя вызвать несколько окон справочников одновременно


А зачем юзеру редактировать/смотреть сразу несколько справочников ?
Я тоже сделал одно модальное окно для справочника и туда передаю параметры из ини-файла (алиасы, поля базы и т.д.) для различных справочников.
Иначе юзера начинают путаться с большим количеством справочников на экране.

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




Пост N: 1438
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.05.17 20:42. Заголовок: Andrey пишет А зачем..


Andrey пишет
 цитата:
А зачем юзеру редактировать/смотреть сразу несколько справочников ?


Загнать в рамки дос пользователя - это вариант.
А при работе с док. и спр. номенклатуры, разве не может возникнуть вопрос (по тел., от др. службы) по клиентскому спр., по автотранспорту (свой\чужой), по адресам погрузки\разгрузки, по ценнику клиента ...Что бросать (выходить) из того с чем работал или откладывать ответы на потом ...

 цитата:
Иначе юзера начинают путаться с большим количеством справочников на экране


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


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




Пост N: 5385
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.05.17 20:54. Заголовок: SergKis пишет: Не д..


SergKis пишет:

 цитата:
Не демократично как то.



Не... с юзерами демократию разводить не надо ! Сказали бурундук птичка и никаких зверьков и все !

С другой стороны, действительно можно дать возможность юзеру вернуться к отложенному справочнику.

Интересно а как в 1С это реализовано или в других системах ?
Но это наверное уже для другой ветки обсуждения, а не здесь.


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


Пост N: 1308
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 10.05.17 21:14. Заголовок: Andrey пишет: Интер..


Andrey пишет:

 цитата:
Интересно а как в 1С это реализовано или в других системах ?


Демократично)

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


Пост N: 702
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 11.05.17 08:13. Заголовок: SergKis у главного ..


SergKis


 цитата:
у главного окна у вас нельзя вызвать несколько окон справочников одновременно


Можно, форма универсальная для простых справочников, типа - код, наименование и т.д. В такой Форме алиасы , поля не прописаны и у меня считываются из файла
при открытии формы.Эта форма описана полностью в виде кода, т.е. без дизайнера ( в нем в этом случае точно нет смысла) .

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




Пост N: 5388
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.05.17 22:05. Заголовок: Есть мой тестировочн..


Есть мой тестировочный проект. Раньше работал, сейчас нет. С какой версии перестал работать, даже не знаю.
Сейчас вешается ВЕСЬ проект вот с таким сообщением:


Вот сам проект - https://cloud.mail.ru/public/2SXc/UtNfso4gf

Виснет - там где выбор флагов производиться...
Один раз выбрать можно, на втором - программа НАГЛУХО ВИСНЕТ !!!
Там даже второй выбор не нужно производить.
Первый раз выбираем меню с флагами, потом мышкой кликаем на другой колонке (или стрелкой вверх/вниз) и тоже программа НАГЛУХО виснет !!

Методом отладки определил, что перестают работать вот эти функции ПОСЛЕ выбора из модуля Form_Lang.prg:
_SetMenuItemBitmap ( "MYTABLERECNOMARK" , cForm , "CheckF28" )	 
_SetMenuItemBitmap ( "MYTABLERECNOPRINT", cForm , "CheckF28" )
_SetMenuItemBitmap ( "MYTABLERECNOSAVE" , cForm , "CheckF28" )
_SetMenuItemBitmap ( "MYTABLERECNOMAIL" , cForm , "CheckF28" )

Модуль demo.prg - строка 534

Помогите пожалуйста разобраться....

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


Пост N: 707
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 15.05.17 09:28. Заголовок: Выбор правой мышкой ..


Выбор правой мышкой из контекстного меню ?

Все работает !

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




Пост N: 5389
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.05.17 11:24. Заголовок: Vlad04 пишет: Выбор..


Vlad04 пишет:

 цитата:
Выбор правой мышкой из контекстного меню ?


НЕТ !
Vlad04 пишет:

 цитата:
Все работает !



Виснет - там где выбор флагов производиться...
Один раз выбрать можно, на втором - программа НАГЛУХО ВИСНЕТ !!!
Там даже второй выбор не нужно производить.
Первый раз выбираем меню с флагами, потом мышкой кликаем на другой колонке (или стрелкой вверх/вниз) и тоже программа НАГЛУХО виснет !!

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




Пост N: 5398
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.05.17 19:32. Заголовок: Привет всем ! Забыл ..


Привет всем !
Забыл как сделать чтобы после выбора из tsbrowse оставалась серая линия на выбранной строке таблицы.
Подскажите пожалуйста ?

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




Пост N: 1445
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.05.17 09:25. Заголовок: Andrey пишет Забыл к..


Andrey пишет
 цитата:
Забыл как сделать чтобы после выбора из tsbrowse оставалась серая линия на выбранной строке таблицы.


См. Tsb_addrecord_3
Del_Rec(...)
:lNoGrayBar

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




Пост N: 1446
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.05.17 19:21. Заголовок: Надоело везде писать..


Надоело везде писать (как бы лишнее, по мне)
:bUserKeys := {|nKy,nFl,oBr| OnKeyDown(nKy, nFl, oBr) }
и
STATIC FUNC OnKeyDown( nKey, nFlg, oBrw ) // обработка KeyDown
...
IF nKey == VK_RETURN
...
ELSEIF nKey == VK_F2
...
ENDIF

RETURN uRet

Немного добавил в TsBrowse
 
CLASS TSBrowse FROM TControl
...
DATA aUserKeys INIT hb_Hash()
DATA lUserKeys INIT .F.
...
METHOD UserKeys( nKey, bKey, lCtrl, lShift )
...

ENDCLASS

METHOD UserKeys( nKey, bKey, lCtrl, lShift ) CLASS TSBrowse
Local cKey := 'other', uVal

If HB_ISBLOCK(bKey) // установить блок на ключ в hash
If ! empty(nKey)
If HB_ISNUMERIC(nKey)
cKey := hb_ntos(nKey)
cKey += iif( empty(lCtrl ), '', '#' )
cKey += iif( empty(lShift), '', '^' )
ElseIf HB_ISCHAR(nKey)
cKey := nKey
EndIf
EndIf
hb_HSet( ::aUserKeys, cKey, bKey )
::lUserKeys := len(::aUserKeys) > 0
Else // выполнить блок по ключу из hash
If HB_ISNUMERIC(nKey)
cKey := hb_ntos(nKey)
ElseIf HB_ISCHAR(nKey)
cKey := nKey
EndIf
If ::lUserKeys // есть уст. блоки кода
uVal := hb_HGetDef( ::aUserKeys, cKey, NIL )
If HB_ISBLOCK(uVal)
cKey := Eval( uVal, Self, nKey, cKey, bKey, lCtrl, lChift )
EndIf
EndIf
EndIf

RETURN cKey

METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse
...
::lNoPaint := .F.
::oWnd:nLastKey := ::nLastKey := ::nUserKey := nKey

If ::lUserKeys
uTemp := hb_ntos(nKey)
uTemp += iif( _GetKeyState( VK_CONTROL ), "#", "" )
uTemp += iif( _GetKeyState( VK_SHIFT ), "^", "" )
uVal := hb_HGetDef( ::aUserKeys, uTemp, NIL )
If ! HB_ISBLOCK(uVal)
uTemp := 'other'
uVal := hb_HGetDef( ::aUserKeys, uTemp, NIL )
Endif
If HB_ISBLOCK(uVal)
uReturn := Eval( uVal, Self, nKey, uTemp )
If uTemp == 'other' .and. ! HB_ISLOGICAL(uReturn)
uReturn := .T.
EndIf
If uReturn == Nil .or. ( HB_ISLOGICAL(uReturn) .and. ! uReturn )
::nLastKey := 255
Return 0
EndIf
uReturn := NIL
EndIf
uTemp := uVal := NIL
EndIf

If ::bUserKeys != Nil
...

теперь в проге можно писать так

:nFireKey := VK_F4 // default Edit

If lRec_Select // режим выбор записи
:bLDblClick := {|uP1,uP2,nFl,oBr| Get_Rec(oBr, uP1, uP2, nFl) }
:UserKeys(VK_RETURN, {|oBr | Get_Rec(oBr) })
Else // режим Edit записи
:bLDblClick := {|uP1,uP2,nFl,oBr| uP1 := uP2 := nFl := Nil, ;
oBr:PostMsg( WM_KEYDOWN, oBr:nFireKey, 0 ) }
:UserKeys(VK_RETURN, {|oBr | oBr:PostMsg( WM_KEYDOWN, oBr:nFireKey, 0 ) })
EndIf

:UserKeys(VK_F2 , {|oBr,nKy,cKy| Add_Rec(oBr, nKy, cKy) })
:UserKeys(VK_F3 , {|oBr,nKy,cKy| Del_Rec(oBr, nKy, cKy) })
:UserKeys(VK_F3 , {|oBr,nKy,cKy| MsgBox(cKy, 'Ctrl + F3') }, .T.)
:UserKeys(VK_F3 , {|oBr,nKy,cKy| MsgBox(cKy, 'Shift + F3') }, , .T.)
:UserKeys(VK_F3 , {|oBr,nKy,cKy| MsgBox(cKy, 'C + S + F3') }, .T., .T.)
// :UserKeys( , {|oBr,nKy,cKy| _LogFile(.T.,cKy, 'other', nKy ) })
// это обработка др. нажатий, уст. на ключ 'other' default

Если уст. блок кода возвращает Nil или .F. Method KeyDown завершается (все выполнено),
при возврате .T. Method KeyDown работает дальше.
Может будет полезно, a c :bUserKeys осталось, как раньше



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




Пост N: 1450
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.05.17 08:27. Заголовок: Поясню назначение ко..


Поясню назначение кода
Else // выполнить блок по ключу из hash
...
Установив на тсб
:UserKeys(1.1, {|o|...})
:UserKeys(1.2, {|o|...})
:UserKeys('rpt1', {|o|...})
:UserKeys('rpt2', {|o|...})
...
на кнопках, пунктах, меню и т.д. ( для этого тсб) можно вызывать
oBrw1:UserKeys(1.1, Param1, Param2, Param3)
oBrw1:UserKeys('rpt2', Param1, Param2, Param3)
...
если несколько тсб на окне, то для каждого делаем такие манипуляции


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1101
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.05.17 11:03. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может будет полезно, a c :bUserKeys осталось, как раньше


Благодарю за Ваше предложение и примеры использования этого расширения!
Очень интересное дополнение, которое будет доступно, если в коде библиотеки будет определена константа
// #define __EXT_USERKEYS__


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




Пост N: 1455
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.05.17 12:20. Заголовок: gfilatov2002 пишет ..


gfilatov2002 пишет
 цитата:
будет доступно, если в коде библиотеки будет определена константа
// #define __EXT_USERKEYS__


А смысл пересобирать либу ?
Изменения минимальны, старые алгоритмы не затронуты.
Я забыл, когда последний раз пересобирал либу, пользуюсь (для примеров и проб) родной сборкой.
Думается так многие делают.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1102
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.05.17 15:00. Заголовок: SergKis пишет: Изме..


SergKis пишет:

 цитата:
Изменения минимальны, старые алгоритмы не затронуты.


Все правильно, но, вероятно, потребуется определить

 цитата:

#ifndef __XHARBOUR__
#define __EXT_USERKEYS__
#endif


поскольку, например, функция hb_HGetDef() недоступна в xHarbour

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




Пост N: 1456
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.05.17 18:48. Заголовок: gfilatov2002 Пример..


gfilatov2002
Пример для Harbour (на моей lib):

и надо подправить (ошибочка)
 
METHOD UserKeys( nKey, bKey, lCtrl, lShift ) CLASS TSBrowse
...
If ::lUserKeys // есть уст. блоки кода
uVal := hb_HGetDef( ::aUserKeys, cKey, NIL )
If HB_ISBLOCK(uVal)
cKey := Eval( uVal, Self, nKey, cKey, bKey, lCtrl, lShift )
EndIf
EndIf


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




Пост N: 1457
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.05.17 18:53. Заголовок: PS Забыл в примере в..


PS
Забыл в примере вывести в StatusBar сообщение о наличии меню на правую кнопку мыши (на тсб)

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




Пост N: 1458
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.05.17 19:08. Заголовок: PS в моей lib не раб..


PS
в моей lib не работает (надо исп. вариант без DEFINE ...)
DEFINE SPLITBOX HANDLE hSplit
поэтому в примере StatusBar закрыт (на родной MiniGui.lib должно быть Ok!)

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1103
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.05.17 20:24. Заголовок: SergKis пишет: Прим..


SergKis пишет:

 цитата:
Пример для Harbour


Благодарю за наглядный пример!

SergKis пишет:

 цитата:
Забыл в примере вывести в StatusBar сообщение о наличии меню на правую кнопку мыши


Поправил - пример работает нормально

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


Пост N: 1482
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 28.05.17 20:57. Заголовок: Конечно - это полез..


Конечно - это полезное дополнение.

Только мне кажется, что UserKeys не совсем подходящее название метода и того, что этот метод делает.

Не помешало бы и добавить что-то вроде SetUserKeys/GetUserKeys

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




Пост N: 1459
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.05.17 21:27. Заголовок: Петр пишет Не помеша..


Петр пишет
 цитата:
Не помешало бы и добавить что-то вроде SetUserKeys/GetUserKeys


Тогда + DoUserKeys (выполнение), т.е. еще несколько доп. методов.
Но в МиниГуи уклон к функциям с параметрами и пляской от них, потому пошел таким путем ("что бы не выделяться" (с))


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


Пост N: 1483
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 28.05.17 22:24. Заголовок: SergKis пишет: Но в..


SergKis пишет:

 цитата:
Но в МиниГуи уклон к функциям с параметрами и пляской от них, потому пошел таким путем ("что бы не выделяться" (с))


Понятно, но название неподходящее: bUserKeys/UserKeys - клавиша/ключ, дезориентировать будет.


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




Пост N: 1460
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.05.17 23:01. Заголовок: Петр пишет но назван..


Петр пишет
 цитата:
но название неподходящее: bUserKeys/UserKeys - клавиша/ключ, дезориентировать будет.


Т.к. действия bUserKeys с новым методом схожи, то не должно дезориентировать.
Что там обработка пользовательских клавиш\ключей, что тут, от этого и брал название.
Но если есть подходящее название - нет возражений.

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




Пост N: 1461
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.05.17 23:04. Заголовок: gfilatov2002 В прим..


gfilatov2002
В примере надо заменить _HMG_ThisControlName на This.Name - это будет правильнее.

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


Пост N: 1484
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 28.05.17 23:54. Заголовок: SergKis пишет: Что ..


SergKis пишет:

 цитата:
Что там обработка пользовательских клавиш\ключей, что тут


Там обработка клавиш, тут - клавиши\ключа
Причем у вас обработка события по ключу может быть и не связанной с нажатием какой-либо клавиши.

Название должно отображать суть того, что происходит. А что здесь происходит я лично определиться не могу

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




Пост N: 1462
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.05.17 00:06. Заголовок: Петр пишет я лично о..


Петр пишет
 цитата:
я лично определиться не могу


Тогда, отдадим на откуп Григорию ( типа, наша хата с краю )

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




Пост N: 1463
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.05.17 00:20. Заголовок: Петр пишет Причем у ..


Петр пишет
 цитата:
Причем у вас обработка события по ключу может быть и не связанной с нажатием какой-либо клавиши.


В связи с отсутствием на окне механизма работы через очередь (городить свой обработчик не хочется к каждому окну), к примеру WM_USER + 55 и через Post\SendMessage(hWnd, WM_USER + 55, nIndex\hControl, 0) и на окно вешать подобный механизм UserKeys, приходится вешать клавиши в :UserKeys VK_F21, VK_F22, ... и делать oBrw:PostMsg(...) + oBrw:Cargo с данными. Нажатия клавиш существуют всегда, причем клиент ТРЕБУЕТ дублирование кнопок клавишами КАТЕГОРИЧЕСКИ


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




Пост N: 1464
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.05.17 09:30. Заголовок: Петр Может смущает ..


Петр
Может смущает наличие многих параметров в блоках и функциях (это в основном для информации в MsgBox(...)), так в реальности, можно, практически, обойтись без них (oBrw1 Public\Private):
 
oBrw:bLDblClick := {|| oBrw1:PostMsg( WM_KEYDOWN, oBrw1:nFireKey, 0 ) }
oBrw:UserKeys(VK_RETURN, {|| oBrw1:PostMsg( WM_KEYDOWN, oBrw1:nFireKey, 0 ) }) или
oBrw:UserKeys(VK_RETURN, {|obr| obr:PostMsg( WM_KEYDOWN, obr:nFireKey, 0 ) })
:UserKeys('SetMode_1' , {|obr| Set_Mode(obr, 1)})
:UserKeys('SetMode_2' , {|obr| Set_Mode(obr, 2)}) или
:UserKeys('SetMode_1' , {|| Set_Mode(oBrw1, 1)})
:UserKeys('SetMode_2' , {|| Set_Mode(oBrw1, 2)}) или
:UserKeys('SetMode_1' , {|| Set_Mod1()}) // внутри функций
:UserKeys('SetMode_2' , {|| Set_Mod2()}) // используем oBrw1
...




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




Пост N: 1465
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.05.17 10:26. Заголовок: gfilatov2002 пишет ф..


gfilatov2002 пишет
 цитата:
функция hb_HGetDef() недоступна в xHarbour


Может вместо
 цитата:
#ifndef __XHARBOUR__
#define __EXT_USERKEYS__
#endif


сделать
 
#ifndef __XHARBOUR__
FUNC hb_HGetDef( hHash, xKey, xDef )
Local nPos := HGetPos( hHash, xKey )
Return iif( nPos > 0, HGetValuePos( hHash, nPos ), xDef )
#endif


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




Пост N: 1466
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.05.17 10:31. Заголовок: PS вернее #ifdef __X..


PS
вернее #ifdef __XHARBOUR__
...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1104
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 29.05.17 11:45. Заголовок: SergKis пишет: верн..


SergKis пишет:

 цитата:
вернее #ifdef __XHARBOUR__


Заменил вызов HGetValuePos() на HGetValueAt() и добавил переопределение еще для двух функций

 цитата:
#ifdef __XHARBOUR__
/* Hash item functions */
#xtranslate hb_Hash( [<x,...>] ) => Hash( <x> )
#xtranslate hb_HSet( [<x,...>] ) => HSet( <x> )
#endif


теперь UserKeys работает и под xHarbour

Благодарю за помощь

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


Пост N: 1485
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 29.05.17 12:53. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может смущает наличие многих параметров в блоках и функциях


Вот как раз это меня не смущает
И даже наоборот, смущает то, что, например, в Events параметры не передаются в оконные события.

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




Пост N: 1468
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.05.17 07:49. Заголовок: gfilatov2002 Дополн..


gfilatov2002
Дополнительно, что бы было
#ifdef __XHARBOUR__
#xtranslate hb_HHasKey( h, k ) => HHasKey( h, k )
#xtranslate hb_HDel( h, k ) => HDel( h, k )


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


Пост N: 1488
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 30.05.17 08:20. Заголовок: SergKis пишет: Допо..


SergKis пишет:

 цитата:
Дополнительно, что бы было



Включите hbcompat.ch из contrib/hbxhb

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




Пост N: 5405
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.06.17 12:50. Заголовок: Вопрос по индексам в..


Вопрос по индексам в Tsbrowse.

К базе подключёны индексы. 3 индекс создан с ключом = "DESCEND(STR(KView))+UPPER(NAME)"
Добавляю запись в базу.
            nOrderTek := INDEXORD() 
DBSetOrder( 1 )
....
DBAppend()
nTekRec := (oBrw:cAlias)->(RecNo())
lAppend := .T.
DBSetOrder( nOrderTek )
....
IF lAppend // была добавлена запись
oBrw:Refresh(.T.)
oBrw:GoToRec(nTekRec)
ENDIF
Form_1.oBrw.Setfocus
RETURN Nil

После добавления курсор НЕ становиться на добавленной записи, а становиться на первую запись по индексу.

Как нужно правильно сделать установку на добавленную запись ?

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




Пост N: 6446
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.06.17 13:05. Заголовок: Andrey пишет: nOrd..


Andrey пишет:

 цитата:
nOrderTek := INDEXORD()
DBSetOrder( 1 )
....
DBAppend()
nTekRec := (oBrw:cAlias)->(RecNo())
lAppend := .T.
DBSetOrder( nOrderTek )



А так ?

 
nOrderTek := (oBrw:cAlias)->(INDEXORD())
(oBrw:cAlias)->(DBSetOrder( 1 ))
....
(oBrw:cAlias)->(DBAppend())
nTekRec := (oBrw:cAlias)->(RecNo())
lAppend := .T.
(oBrw:cAlias)->(DBSetOrder( nOrderTek ))


PS
Вместо INDEXORD() лучше юзать ordsetfocus() ежели это CDX

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




Пост N: 5406
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.06.17 13:12. Заголовок: Dima пишет: А так ?..


Dima пишет:

 цитата:
А так ?


Равнозначно. Можно и так написать. С обычным порядком в индексе у меня всё работает.
А если поставить другой индекс с обратным порядком в ключе = "DESCEND(STR(KView))+UPPER(NAME)"
То запись перестаёт вставать на правильное место.

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




Пост N: 6447
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.06.17 13:15. Заголовок: Была такая кака. При..


Была такая кака. Пришлось базу открывать 2 раза с разными алиас , добавление и смену ордера делаем
во вспомогательной базе и после в основной (бровс по ней живет) прыгаем куда надо , не меняя ордера естественно.
Такую "фигню" под консолью делать не нужно.....

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




Пост N: 6448
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.06.17 13:22. Заголовок: Andrey пишет: Можно..


Andrey пишет:

 цитата:
Можно и так написать


Я имел в виду OrdSetFocus по имени тега

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




Пост N: 1510
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.06.17 19:44. Заголовок: Anderey пишет С обы..


Anderey пишет
 цитата:
С обычным порядком в индексе у меня всё работает.


Dima пишет
 цитата:
Пришлось базу открывать 2 раза с разными алиас , добавление ...


По мне, это нормальная практика, т.е. просмотр[ы] по одной, а ввод, удаление, edit по вновь открываемой.
А учитывая "тонкости" TsBrowse, возможно, лучший вариант. Повторное открытие, для модификаций еще с s87 практикую.

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




Пост N: 5418
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.06.17 15:52. Заголовок: MiniGUI Extended Edi..


MiniGUI Extended Edition 17.05
У меня сделано так:
            oBrw:aColumns[nJ]:bPrevEdit := {|| nRecBuff := (oBrw:cAlias)->(RecNo()), ; 
MyFieldEdit( oBrw:aColumns[oBrw:nCell]:Cargo ) }

oBrw:aColumns[nI]:bPostEdit := {|| oBrw:GoToRec(nRecBuff), oBrw:Refresh(.T.) }

К базе подключёно 3 индекса.
Последний индекс типа: STR(KView)+STR(KFILI)+UPPER(FIO)

Всё работает отлично, но после редактирования поля входящее в индекс (например FIO) - курсор прыгает на 6 позиции вниз.
Правка столбцов полей KView и KFILI - происходит нормально.
Почему ?

В FUNCTION MyFieldEdit(aCargo) нет переходов по базе. Только редактирование поля в зависимости от условий:
            IF lEditField   
// сетевой захват записи
IF (oBrw:cAlias)->(RLock())
FieldPut( FIELDNUM( cPoleField ), cPoleEdit )
(oBrw:cAlias)->KOPERAT := M->nOperat
DBCommit()
DBUnlock()
ENDIF
ENDIF



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




Пост N: 6456
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.06.17 16:46. Заголовок: Andrey пишет: Почем..


Andrey пишет:

 цитата:
Почему ?


Покажи скрин до и после редактирования поля FIO

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




Пост N: 5419
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.06.17 17:05. Заголовок: Dima пишет: Покажи ..


Dima пишет:

 цитата:
Покажи скрин до и после редактирования поля FIO



Вот:


Если редактировать последние записи в таблице, то курсор перескакивает НИЖЕ записей таблице и на экране становится дублирование записей... Совсем юзер пугается...

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




Пост N: 6457
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.06.17 17:14. Заголовок: а если закоментить с..


а если закоментить строку
oBrw:aColumns[nI]:bPostEdit := {|| oBrw:GoToRec(nRecBuff), oBrw:Refresh(.T.) }

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




Пост N: 6458
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.06.17 17:20. Заголовок: Andrey пишет: В FUN..


Andrey пишет:

 цитата:
В FUNCTION MyFieldEdit(aCargo) нет переходов по базе. Только редактирование поля в зависимости от условий:

IF lEditField
// сетевой захват записи
IF (oBrw:cAlias)->(RLock())
FieldPut( FIELDNUM( cPoleField ), cPoleEdit )
(oBrw:cAlias)->KOPERAT := M->nOperat
DBCommit()
DBUnlock()
ENDIF
ENDIF



Прикольно
Только RLOCK смотрит в правильный ALIAS , все что ниже х.... знает куда


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




Пост N: 5420
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.06.17 17:32. Заголовок: Dima пишет: а если ..


Dima пишет:

 цитата:
а если закоментить строку



Сделал так:
oBrw:aColumns[nI]:bPostEdit := {|| /*oBrw:GoToRec(nRecBuff)*/, oBrw:Refresh(.T.) }

Стало отлично ! Не перескакивает. НО ТЕПЕРЬ другой справочник не работает.
Если к базе подключаю только 2 индекса и 2-ой индекс типа: UPPER(NAME), то
при редактировании поля NAME и изменению его на другое значение (было: "ООО СтройСервис", стало "1ООО СтройСервис")
то КУРСОР остаётся на текущем месте, а отредактированная запись улетает вверх.

Как теперь быть ?

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




Пост N: 5421
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.06.17 17:34. Заголовок: Dima пишет: Только ..


Dima пишет:

 цитата:
Только RLOCK смотрит в правильный ALIAS , все что ниже х.... знает куда


Из терминалки перенёс. Как правильно сделать ?

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


Пост N: 716
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 19.06.17 20:01. Заголовок: В примере Tsb_lastro..


В примере Tsb_lastrow динамически можно изменить высоту заголовка таблицы.А можно подобное делать с высотой строк таблицы ?

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




Пост N: 5422
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.06.17 23:08. Заголовок: Vlad04 пишет: А мож..


Vlad04 пишет:

 цитата:
А можно подобное делать с высотой строк таблицы ?


Можно так (или по другому):
oBrw:nHeightCell += INT(nNumberLines * nFontSize/2) // расчёт высоты строки


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




Пост N: 6459
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.06.17 09:05. Заголовок: Vlad04 А ты уже зад..


Vlad04
А ты уже задавал этот вопрос в 2005 году и Has ответил
http://clipper.borda.ru/?1-1-0-00000399-000-10001-0-1418918839

Спасибо: 0 
Профиль
Veeha



Пост N: 20
Зарегистрирован: 07.02.13
ссылка на сообщение  Отправлено: 21.06.17 14:00. Заголовок: оффтоп Andrey пишет..


оффтоп

Andrey пишет:

 цитата:
Совсем юзер пугается...






Изучай основы построения интерфейсов ...

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




Пост N: 5424
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.06.17 14:09. Заголовок: Veeha пишет: Изучай..


Veeha пишет:

 цитата:
Изучай основы построения интерфейсов ...


Это терминалка была, я сделал по другому на МиниГу - юзера потребовали вернуть обратно !
Спасибо за картинку !

Спасибо: 0 
Профиль
Veeha



Пост N: 21
Зарегистрирован: 07.02.13
ссылка на сообщение  Отправлено: 21.06.17 14:30. Заголовок: Andrey пишет: Это т..


Andrey пишет:

 цитата:
Это терминалка была, я сделал по другому на МиниГу - юзера потребовали вернуть обратно !


Если что - я про цвета ... Чурки твои пользователи ( а может и ты) !
Тут, на форуме, есть ещё тебе подобные - в том числе и админ Dima

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




Пост N: 5425
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.06.17 17:03. Заголовок: Veeha пишет: Чурки ..


Veeha пишет:

 цитата:
Чурки твои пользователи ( а может и ты) !


В г.Николаеве пользователи программы есть. Да и по России немало, где работают (я точно знаю) диспетчера-украинцы.
Выводы у тебя просто хамские.
Всех подряд как правило критикуют те - у кого нет нормальных и тиражируемых программ, только и могут на г... исходить.

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




Пост N: 6465
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.06.17 17:18. Заголовок: Andrey пишет: Вывод..


Andrey пишет:

 цитата:
Выводы у тебя просто хамские


Veeha ушел копать картошку на луну

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


Пост N: 717
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 22.06.17 09:02. Заголовок: Dima Vlad04 А ты у..


Dima

 цитата:

Vlad04
А ты уже задавал этот вопрос в 2005 году и Has ответил


В 2005 году не помню, не нашел , вряд ли. В 2005 я только с Харбор познакомился. А MiniGui - позже, тема начата в 2013.

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




Пост N: 1107
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.06.17 10:44. Заголовок: Dima пишет: Veeha у..


Dima пишет:

 цитата:
Veeha ушел копать картошку на луну


А чего так далеко то ??? Мне мастер класс по основам построения интерфейсов пригодился бы

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




Пост N: 1108
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.06.17 10:55. Заголовок: Haz пишет: В 2005 г..


Haz пишет:

 цитата:
В 2005 году не помню, не нашел , вряд ли. В 2005 я только с Харбор познакомился. А MiniGui - позже, тема начата в 2013.



Ошибся Дима годом, бывает Но ссылку дал правильную. По которой написано что "почти все что в классе определено как DATA может быть переопределено во время исполнения бровса"
nHeightCell определен как DATA и отвечает за высоту строк при ПРОРИСОВКЕ бровса , а раз так то в любой момент можно изменить значение и перерисовать бровс

Добавьте на форму бровса код ниже и увидете магию

DEFINE TIMER Timer_1 OF FORM_1 INTERVAL 1000 ACTION {|| oBrw:nHeightCell++, oBrw:Refresh(TRUE) } // Каждую секунду на 1 пиксель увеличиваем строки


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




Пост N: 6467
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.06.17 11:01. Заголовок: Haz пишет: Ошибся Д..


Haz пишет:

 цитата:
Ошибся Дима годом


Точно
Зрение подвело...

Спасибо: 0 
Профиль
VeeIha



Пост N: 1
Зарегистрирован: 26.06.17
ссылка на сообщение  Отправлено: 27.06.17 14:32. Заголовок: Haz пишет: Мне маст..


Haz пишет:

 цитата:
Мне мастер класс по основам построения интерфейсов пригодился бы



Я бы постеснялся на твоём месте. А какие проблемы, если не прикалываешься? Ты же, вроде, не "чайник"

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




Пост N: 1109
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.06.17 17:13. Заголовок: VeeIha пишет: А ка..


VeeIha пишет:

 цитата:
А какие проблемы, если не прикалываешься?


Проблема одна - на разработку интерфейсов уходит половина времени кодинга, Про цветовую палитру я не говорю , это как "на вкус и цвет все фломастеры разные", а вот впихнуть невпихуемое в окно программы - вечная дилема.
PS. Продолжу. Критиковать оно всегда легче, предложить вариант - всегда лень.
Сама разработка интерфейса - занятие очень неблагодарное, у каждого пользователя свои предпочтения.
Цветовая гамма это маленькая часть. И эта гамма может подчеркивать свой фирменный стиль. Мне к примеру не нравится сочетание зелёного и фиолетового, это визитка мегафона. Но я везде узнаю эту визитку именно по этому сочетанию.
Ты накинулся на Андрея с критикой, а слабо дать ему вариант который на твой вкус красивее? Правда в том что мы все не идеальны. Андрюха в своей текучке зачастую просто затыкает дыру в коде используя те же подсказки, причём не вникая в
суть глубоко т.к. просто надо удовлетворить клиента срочно. Мне такой подход тоже не нравится, и я тоже покусывал Андрея незлобными нападками, но он не обижался, а у меня не было цели обидеть. А ведь многие интересные темы на форуме выросли именно из риторических вопросов, на которые просто ктото попытался ответить.
Так что велкам с луны, и включайся в нормальное обсуждение.
А теперь вернёмся к проблемам, мне очень бы помогли примеры интерфейсов других коллег.
Изобретение велосипеда в тысячный раз просто сжирает много времени и опыт коллег не был бы лишний




Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1124
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.06.17 18:06. Заголовок: Haz пишет: мне очен..


Haz пишет:

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


Мне прислали скриншоты программ, написанных на минигуи с использованием tsbrowse, и размещенных на сайте www.hardoffice.rs






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




Пост N: 1110
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.06.17 19:28. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Мне прислали скриншоты программ, написанных на минигуи


Григорий спасибо. Начало положено. Могу свои шоты выложить. Может в отдельную ветку или вообще на сайт hmg?
По этим скринам видно боковое меню. Пробовал делать похожее, при смене пункта этого меню на той части формы что справа удалял все контролы и рисовал новые для нового пункта. Работает, но не понравился подход. Пробовал не удаляя прятать старые и это пошло лучше. Боковую ленту делал тоже на tsbrowse Дизайн в принципе понятен. Пусть поживет в коллекции.

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




Пост N: 5430
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.07.17 17:24. Заголовок: Что то не понимаю по..


Что то не понимаю почему СУПЕРХИДЕР не доходит до конца таблицы ?
Пишу так:
     // создать СУПЕРХИДЕР таблицы 
Add Super Header To oBrwV From Column 1 To Column 10 ;
Color CLR_WHITE, { nBackForm, nHeadColor1 } ;
Title cTableName

Вот что получается:


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




Пост N: 1566
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.07.17 21:49. Заголовок: Andrey Возможно это..


Andrey
Возможно это связано с несовпадением кол. колонок в тсб и суперхидера.
У тебя была хитрая колонка с раскраской. Может дело в ней ?

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




Пост N: 5441
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.17 21:01. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может дело в ней ?


Нет. Такая фигня получается если делаешь 2 строки в одной колонке...


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




Пост N: 5442
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.07.17 21:15. Заголовок: Почему происходит пе..


Почему происходит перенос значения из справочника (подчинённой таблицы) на основную таблицу при выборе ?
Т.е. имеется Основной Tsbrowse, открываю второй Tsbrowse и значение второго переносится на Основной Tsbrowse.

Вот 1-ый экран:


Нажимаю ENTER, выходит 2-ой Tsbrowse - новый и ПЕРВОЕ значение перекидывается на Основной Tsbrowse
Вот 2-ой экран:


После отказа от выбора, не делаю oBrw:Refresh( .T. ) и остаётся МУСОР с предыдущего справочника !
Т.е. тогда нужно всегда делать oBrw:Refresh( .T. ) даже если юзер ничего не выбрал...
Ерунда получается.

А на ХР вообще чудеса происходят... Колонка целиком чиститься:


Как избавиться от этого ?
Исходники посмотрите пожалуйста !

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




Пост N: 5444
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.07.17 17:51. Заголовок: Григорий написал мне..


Григорий написал мне что:
Вы используете команду SET RELATION TO ПО ПЕРВОМУ ИНДЕКСУ базы справочника, а когда вызываете окно выбора из справочника, то переключаете индекс этой базы на 2 для сортировки по имени. 
Естественно, что связанное поле в основном бровсе сразу отображает первую строку из базы справочника, ведь индекс теперь сбит.


Теперь стало понятно такое поведение. На терминалке такого не было !

Попробовал очищать SET RELATION TO на Основной базе ПЕРЕД вызовом справочника - не помогает...

Сделал вызов справочника по 1-ому индексу - та же беда !
1-я запись справочника перепрыгивает в текущую запись основной таблицы !!!

Как исправить этот глюк ?



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




Пост N: 5445
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.07.17 20:17. Заголовок: Ещё заметил. Если ес..


Ещё заметил.
Если есть 1-ый столбец по индексу и запись в основной таблице стоит на 2-ой записи - №№=2
     ADD COLUMN TO oBrwV HEADER "№№" ; 
DATA {|| OrdKeyNo() } ;

то после показа справочника 2-ка превращается в 1, т.е. №№=1 и в таблице 2 значения с 1 !

Вот экран:


Наверное каким то волшебным образом перерисовывается Основная таблица ?

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




Пост N: 6510
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.07.17 12:50. Заголовок: Andrey пишет: Тепер..


Andrey пишет:

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


Да не было на терминалке.
Открывай нужные базы несколько раз.
Например справочник у тебя завязан на Relation , и есть момент когда ты его вызываешь в бровсе , так вот в этом
месте юзай другой алиас этого же справочника.


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




Пост N: 5446
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.17 15:58. Заголовок: Dima пишет: Открыва..


Dima пишет:

 цитата:
Открывай нужные базы несколько раз.


У меня при старте задачи открываются ВСЕ базы. Повторное открытие не использую.

Наверное буду убирать SET RELATION. Из-за него наверное ошибка. Хотя может и не в нём...
Благо в Tsbrowse можно легко подсунуть функцию в столбец.
Это будет проще.
Спасибо всем за помощь !

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




Пост N: 6513
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.07.17 16:17. Заголовок: Andrey пишет: Повто..


Andrey пишет:

 цитата:
Повторное открытие не использую.


А придется. Я тоже не использовал но пришлось.
Дело не в SET RELATION , уверен , ты налезешь на те же грабли и без него.
Допустим у тебя есть справочник GROUP , данные из него и показывай в основном бровсе а
вот если хочешь показать сам справочник , поверх основной таблицы , то открой его повторно ,
скажем с алиас TMP_GROUP и ходи по нему в справочнике да и основная таблица не пострадает
Решать тебе , просто я нарывался на такие же косяки и мне подсказали как надо сделать.
А подход у меня был такой же как у тебя в терминалке.

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




Пост N: 5447
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.17 16:40. Заголовок: Понял ! Спасибо ! Ч..


Понял ! Спасибо !

Чтобы добиться работы без открытия дубля базы, переделал свой тестовый пример, сделал без SET RELATION.
Теперь уже работает, но тоже как то НЕПОНЯТНО !!! Становиться всё интересней....

Запись из Основной таблицы перескакивает в Справочник, т.е. справочник открывается не с 1-ой записи базы по индексу, а по условию записи из Основной базы. Вот скрин до выбора справочника:


Вот скрин при показе справочника:


Если посмотреть, то с другой стороны - классно получилось, юзеру даётся список с той улицы на которой стоит Основная база.
Так и оставлю ! Это лучший вариант !
Тем более навигация по справочнику работает, буквы и цифры ставят фильтр. Больше юзеру и не надо !


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




Пост N: 6514
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.07.17 16:53. Заголовок: Andrey пишет: букв..


Andrey пишет:

 цитата:
буквы и цифры ставят фильтр


Тут тоже можешь поймать сам знаешь что.

Попробуй с дублем базы и "косяки" уйдут

Andrey пишет:

 цитата:
Больше юзеру и не надо !


Бедные юзера....

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




Пост N: 5448
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.07.17 17:10. Заголовок: Dima пишет: Попробу..


Dima пишет:

 цитата:
Попробуй с дублем базы и "косяки" уйдут



Это не путь Рыцаря-джедая ...

Убрал свой косяк, открывается справочник теперь нормально !
Потестил, всё отлично !


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




Пост N: 6515
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.07.17 17:16. Заголовок: Andrey пишет: Убрал..


Andrey пишет:

 цитата:
Убрал свой косяк, открывается справочник теперь нормально !


Ждем новый

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




Пост N: 5452
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.07.17 17:42. Заголовок: SergKis пишет: Ты х..


SergKis пишет:

 цитата:
Ты хочешь управлять METHOD KeyChar(...) на самом деле и тогда, вероятно, надо делать,
добавив переменную в класс DATA bKeyChar


METHOD KeyChar( nKey, nFlags ) CLASS TSBrowse
...
Default ::nUserKey := nKey

IF ::bKeyChar != Nil .and. !Empty( EVal( ::bKeyChar, Key, Self, nFlag )
RETURN 0
ENDIF

If ::nUserKey == 255 .or. ::lNoKeyChar // from KeyDown() method
Return 0
EndIf



Да, так будет удобней.
Блокировать столбцы на цифры/буквы обязательно надо !
Желательно отдельно - вот так:
 oBrw:aColumns[nI]:lNoKeyChar := .F.

Тогда всем будет понятно.

А то вот при нажатии цифр на колонке флагов - вот что получается:




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




Пост N: 1622
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.07.17 18:03. Заголовок: Andrey пишет oBrw:aC..


Andrey пишет
 цитата:
oBrw:aColumns[nI]:lNoKeyChar := .F.


задавать надо будет так
oBrw:bKeyChar := {|ky,ob| ky := ob, ! hb_ntos(ob:nCell) $ '5,7,9' }
т.е. для колонок 5,7,9 делаем edit от букв\цифр, для других нет.
.T. - не делаем edit
.F. - вкл. edit для колонки
или
oBrw:bKeyChar := {|ky,ob| ky := ob:aColumns[ ob:nCell ]:cName, ky $ 'NAME1,NAME2,NAME3' }
для этих колонок вкл. edit, для др. нет


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




Пост N: 5453
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.07.17 18:21. Заголовок: Скачал со страницы с..


Скачал со страницы сайта только что новую версию.
Для своего примера установил:
    oBrw1:bKeyChar := {|ky,ob| ky := ob, ! hb_ntos(ob:nCell) $ '6,7,8' } 


Осталось без изменений. Редактирование есть.
Вдобавок появилась ошибка на 2,3,4 колонке вылет из программы:
Error BASE/1004 Метод не экспортирован: NCELL
Called from NCELL(0)
Called from (b)MYCREATETABLE(428)
Called from TCONTROL:KEYCHAR(576)
Called from TSBROWSE:KEYCHAR(6420)
Called from TSBROWSE:HANDLEEVENT(7436)
Called from EVENTS(81)


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




Пост N: 1623
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.07.17 18:28. Заголовок: Andrey пишет Вдобаво..


Andrey пишет
 цитата:
Вдобавок появилась ошибка на 2,3,4 колонке вылет из программы:


С чего решил, что это есть ?
Мы скорее фантазировали. Потому как, кто мешает написать
oBrw1:bUserKeys := {|ky,flg,ob| ky := flg := ob, ! hb_ntos(ob:nCell) $ '6,7,8' }
:bKeyChar, если ты решил заменить родной method KeyChar своим, что вряд ли надо.
надо все решать в :bUserKeys

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




Пост N: 5454
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.07.17 18:35. Заголовок: SergKis пишет: Мы с..


SergKis пишет:

 цитата:
Мы скорее фантазировали. Потому как, кто мешает написать
oBrw1:bUserKeys := {|ky,flg,ob| ky := flg := ob, ! hb_ntos(ob:nCell) $ '6,7,8' }



Да я не понял, что мы фантазировали...
Поставил, вообще непонятки. Смотри результат у себя...

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




Пост N: 5458
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.08.17 14:16. Заголовок: Всем привет ! Как см..


Всем привет !
Как сменить редактирование колонки типа ДАТА на обычную цифровую ?
А то юзерам не нравиться.

    ADD COLUMN TO oBrw1 HEADER "Date"          ;  
..............
DATA FIELDWBLOCK("FDATE", Select(cAlias)) ;
PICTURE "99.99.9999" ;
NAME FDATE ;
EDITABLE


Я понимаю, что можно самому написать функцию ввода в окошке.
А стандартное - ввод цифр есть или нет ?

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




Пост N: 1119
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 04.08.17 14:38. Заголовок: Andrey пишет: А ста..


Andrey пишет:

 цитата:
А стандартное - ввод цифр есть или нет ?


 
oBrw1:GetColumn("FDATE"):lPickerMode := FALSE


а можно и

 цитата:
Я понимаю, что можно самому написать функцию ввода в окошке.





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




Пост N: 5460
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.08.17 14:56. Заголовок: Haz пишет: oBrw1:Ge..


Haz пишет:

 цитата:
oBrw1:GetColumn("FDATE"):lPickerMode := FALSE



Ошибка при выполнении:
Error BASE/1005 Message not found: TSCOLUMN:_LPICKERMODE
Called from __ERRRT_SBASE(0)
Called from TSCOLUMN:ERROR(0)
Called from (b)HBOBJECT(0)
Called from TSCOLUMN:MSGNOTFOUND(0)
Called from TSCOLUMN:_LPICKERMODE(0)
Called from MYCREATETABLE(331)
Called from FORMTABLE(106)


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




Пост N: 1120
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 04.08.17 14:59. Заголовок: Andrey пишет: Ошибк..


Andrey пишет:

 цитата:
Ошибка при выполнении:


Да не углядел. Эта переменная не колонки а самого бровса
oBrw:lPickermode
Через пару минут дойду до компа гляну подробнее

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




Пост N: 5461
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.08.17 15:01. Заголовок: Haz пишет: Да не уг..


Haz пишет:

 цитата:
Да не углядел. Эта переменная не колонки а самого бровса
oBrw:lPickermode
Через пару минут дойду до компа гляну подробнее



Вот так работает - oBrw1:lPickerMode := .F.

Спасибо !

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




Пост N: 5481
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.08.17 17:58. Заголовок: Рабочий пример работ..


Рабочий пример работы c Tsbrowse выложен Григорием -
http://hmgextended.com/files/MISC/Tsb_composite.zip
Работает без ошибок с версии МиниГуи 17.07 и исправленной библиотеки tsbrowse.lib (в модуле h_tbrowse.prg)


Спасибо: 0 
Профиль
Alex_Cher





Пост N: 48
Зарегистрирован: 18.06.15
ссылка на сообщение  Отправлено: 24.08.17 08:07. Заголовок: Andrey пишет: Работ..


Andrey пишет:

 цитата:
Работает без ошибок с версии МиниГуи 17.07 и исправленной библиотеки tsbrowse.lib (в модуле h_tbrowse.prg)



Application: C:\MiniGUI\SAMPLES\MY_BASIC\Tsbrowse_7\Tsb_composite.exe
Date: 24.08.17 Time: 09:00:26
Time from start: 0 days 0 hours 0 mins 27 secs
Error BASE/1004 Метод не экспортирован: LAPPEND

Called from LAPPEND(0)
Called from TSBROWSE:EDITEXIT(4134)
Called from (b)TSBROWSE_EDIT(4003)
Called from TCOMBOBOX:LOSTFOCUS(212)
Called from TCOMBOBOX:COMMAND(964)
Called from TCONTROL:HANDLEEVENT(871)
Called from TCOMBOBOX:HANDLEEVENT(155)
Called from EVENTS(1675)
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(1449)
Called from DOMETHOD(4729)
Called from FORMTABLE(161)
Called from (b)MAIN(45)
Called from _PROCESSINITPROCEDURE(1613)
Called from _ACTIVATEWINDOW(1437)
Called from MAIN(58)


Версии МиниГуи 17.07, на счет библиотеки tsbrowse.lib ничего сказать не могу.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1173
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 24.08.17 12:19. Заголовок: Alex_Cher пишет: Ве..


Alex_Cher пишет:

 цитата:
Версии МиниГуи 17.07


Эта ошибка будет исправлена в августовской сборке Минигуи

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




Пост N: 5483
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.17 17:20. Заголовок: У себя в Tsbrowse на..


У себя в Tsbrowse наверху окна вывожу - язык раскладки клавиатуры (RUS/LAT)
При смене языка раскладки остаётся старый язык, пока не нажмешь любую клавишу, тогда язык меняется на правильный.
Как сделать чтобы при смене раскладки языка - показ языка отрабатывал сразу ?



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




Пост N: 6538
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.08.17 17:26. Заголовок: Andrey Ни кто не да..


Andrey
Ни кто не даст ответа не видя как ты выводишь эту самую раскладку.

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




Пост N: 5484
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.17 17:37. Заголовок: Понял. В Tsbrowse на..


Понял. В Tsbrowse назначаю свою обработку:
oBrw:bUserKeys := { |a,b,c| MyKeyEdit(a,b,c) }

Функция обработки:
STATIC FUNCTION MyKeyEdit( nKey, nFlag, oBrw ) 
LOCAL xRet := .T.
.......
IF !Alltrim(cStaticSearch) == Form_0.Text_Seek.Value
cStaticSearch := Form_0.Text_Seek.Value
ENDIF

DO CASE
CASE nKey == VK_ESCAPE
....
CASE nKey == VK_INSERT // [Ins] Добавить запись
...
CASE nKey == VK_DELETE // [Del] Удалить запись
....
CASE nKey == VK_BACK // Backspace
IF LEN(Form_0.Text_Seek.Value) > 0
cStaticSearch := LEFT(cStaticSearch,LEN(cStaticSearch)-1)
Form_0.Text_Seek.Value := cStaticSearch
RefreshBrowse()
ENDIF

CASE nKey > 47 .AND. nKey < 254
cStaticSearch := cStaticSearch + KeyToChar(nKey)
Form_0.Text_Seek.Value := cStaticSearch // показ вверху набранного ФИЛЬТРА по базе
RefreshBrowse()
xRet := .F.
Form_0.Label_KB.Value := '('+KB_LANG()+')'

CASE nKey == 16 .OR. nKey == 17 // Shift+Alt Shift+Ctrl
xRet := .F.
ENDCASE

Form_0.Label_KB.Value := '('+KB_LANG()+')' // вывод раскладки клавиатуры
Form_0.oBrw.SetFocus

RETURN xRet

Не всегда показывает смену языка клавиатуры !!!
Как сделать, чтобы смена языка отображалась правильно ?



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




Пост N: 6540
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.08.17 18:36. Заголовок: Варианты 1. STATIC F..


Варианты
1.
STATIC FUNCTION MyKeyEdit( nKey, nFlag, oBrw )
LOCAL xRet := .T.
Form_0.Label_KB.Value := '('+KB_LANG()+')' // вывод раскладки клавиатуры

2. Повесить показ на таймер

3. Повесить показ в потоке


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




Пост N: 5485
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.08.17 19:15. Заголовок: Dima пишет: Вариант..


Dima пишет:

 цитата:
Варианты
1.


Этот не сработал....
Такая же фигня, меняешь язык - остаётся старый, пока не нажмёшь любую клавишу...

2 - не хочется загружать Tsbrowse сторонними процессами, уменьшать быстродействие

3-вообще экзотика, нафига в простом Tsbrowse отдельный поток.


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




Пост N: 6541
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.08.17 21:21. Заголовок: Andrey Стандартного..


Andrey
Стандартного вывода от OS не хватает ?

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




Пост N: 5487
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.08.17 10:27. Заголовок: Dima пишет: Стандар..


Dima пишет:

 цитата:
Стандартного вывода от OS не хватает ?


Да юзера пристали... Вот и сделал им... А не работает.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1175
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.08.17 13:12. Заголовок: Andrey пишет: не хо..


Andrey пишет:

 цитата:
не хочется загружать Tsbrowse сторонними процессами,


Да, это возможно сделать средствами самого TSBrowse.

Надо добавить в функцию CreateBrw() такой обработчик:

 цитата:
// Вывод подсказки с использованием внутреннего цикла TBrowse
oBrw:bEvents := { |a,b| MyEventBrowse(a,b) }



и перенести вывод подсказки из функции MyKeyEdit() в функцию ниже:
//////////////////////////////////////////////////////////// 
STATIC FUNCTION MyEventBrowse(oBrw, nMsg)
oBrw:=nil
IF _IsControlDefined( "Label_KB", "Form_0" ) .and. !(nMsg==WM_PAINT)
Form_0.Label_KB.Value := '('+KB_LANG()+')'
ENDIF

RETURN 0


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




Пост N: 6543
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.08.17 13:24. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
// Вывод подсказки с использованием внутреннего цикла TBrowse
oBrw:bEvents := { |a,b| MyEventBrowse(a,b) }


Мерцать надпись не будет ?

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




Пост N: 5488
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.08.17 14:29. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Да, это возможно сделать средствами самого TSBrowse.



Заработало !!!
И не мерцает...

А как насчёт других вопросов (1,2 и 3) ?

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


Пост N: 1549
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 28.08.17 14:47. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А как насчёт других вопросов (1,2 и 3)


А где эти вопросы прозвучали?
Были 3 варианта от Dima
и ваше резюме
Andrey пишет:

 цитата:
нафига



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




Пост N: 6544
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.08.17 14:50. Заголовок: Петр пишет: А где э..


Петр пишет:

 цитата:
А где эти вопросы прозвучали?


Думаю только в его голове

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




Пост N: 5489
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.08.17 14:53. Заголовок: Dima пишет: Думаю т..


Dima пишет:

 цитата:
Думаю только в его голове


Я проект Tsb_config2 Григорию на прошлой неделе отослал...

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




Пост N: 5490
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.08.17 15:08. Заголовок: Сам проект - https:/..


Сам проект - https://cloud.mail.ru/public/H4Do/1tDRrPPff
Вопросы:
1) Модуль util_dbase.prg функция DbfCreateRecno()
Нет надписи по команде - WAIT WINDOW "Подождите, создаю тестовую базу...." NOWAIT
Что нужно сделать, чтобы надпись появилась ?

2) Модуль Form_operat.prg функция DimOperat()
Обработка колонки срабатывает ТОЛЬКО после первого ввода.
     oBrw:aColumns[nVal]:bPrevEdit := .....   
oBrw:aColumns[nVal]:bEditing := .....
oBrw:aColumns[nVal]:bEditEnd := .....

Как сделать, чтобы при первом вводе был показ подсказки ?

3) Модуль Tsb_Config.prg - нет отработки команды oBrw:nAt := 5
Например:
 FUNCTION RecnoInsert()  
..........
oBrw:GoTop() // первая запись базы
oBrw:nAt := 5

или при ПЕРВОМ показе бровса
  строка 364 -    oBrw:nAt := 5  // передвинуть МАРКЕР на 5 строку 

Как исправить ?



Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1176
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.08.17 15:11. Заголовок: Andrey пишет: как н..


Andrey пишет:

 цитата:
как насчёт других вопросов (1,2 и 3) ?



 цитата:
Вопросы.
1) Нет надписи по команде - WAIT WINDOW "Подождите, создаю тестовую базу...." NOWAIT
Что нужно сделать, чтобы надпись появилась ?

Проверял под Win7 - нет такой проблемы...

 цитата:
2) Как сделать, чтобы при первом вводе был показ подсказки ?

Не знаю

 цитата:
3) нет отработки команды oBrw:nAt := 5

Попробуйте заменить на oBrw:GoPos( 5 )

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




Пост N: 6545
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.08.17 18:57. Заголовок: Andrey пишет: Нет н..


Andrey пишет:

 цитата:
Нет надписи по команде - WAIT WINDOW "Подождите, создаю тестовую базу...." NOWAIT


Если сделаешь микро-пример я проверю у себя.
Впрочем где то это я уже видел в твоих примерах "Подождите, создаю тестовую базу...." и у меня
работало.

PS
Win-7

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


Пост N: 1550
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 28.08.17 19:52. Заголовок: Dima пишет: Впрочем..


Dima пишет:

 цитата:
Впрочем где то это я уже видел в твоих примерах "Подождите, создаю тестовую базу...." и у меня
работало.



Ну так в том проекте, что он выложил (пост 5490) есть такая штука и она работает - надпись есть (запускал на Win7 и WinXP).

Andrey пишет:

 цитата:
Модуль Tsb_Config.prg - нет отработки команды oBrw:nAt := 5



nAt обьявлено как DATA (VAR), что там может отрабатывать?



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




Пост N: 5491
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.08.17 23:21. Заголовок: Dima пишет: Если сд..


Dima пишет:

 цитата:
Если сделаешь микро-пример я проверю у себя.


Возьми готовый проект, ссылка выше. На микро-примерах, как правило ВСЁ работает !gfilatov2002 пишет:

gfilatov2002 пишет:

 цитата:
Проверял под Win7 - нет такой проблемы...



Значить это у меня под Win8.1 нет надписи !
Тогда можно не заморачиваться...

Петр пишет:

 цитата:
nAt обьявлено как DATA (VAR), что там может отрабатывать?


На других примерах это срабатывает.

gfilatov2002 пишет:

 цитата:
Попробуйте заменить на oBrw:GoPos( 5 )


НЕ ТО ! Мне нужна 1-я запись и положение курсора/маркера на 5+2 столбце ("Событие") ?

Нашёл как исправить:
     ON INIT { || IniGetPosWindow(), IniGetTbrowse(oBrw,aStatClr2Usl), oBrw:GoPos( 1,7 ) } ; 


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




Пост N: 5492
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.08.17 23:53. Заголовок: 1) Нет надписи по ко..


1) Нет надписи по команде - WAIT WINDOW "Подождите, создаю тестовую базу...." NOWAIT
На ХР надпись есть. Видать Win8.1 не срабатывает...

На ХР появляется квадрат Малевича - синего цвета. Почему ?


Вроде осталась последняя "непонятка" в примере и всё остальное работает !
Просьба ко всем - протестировать последнюю версию https://cloud.mail.ru/public/DFuN/tzKsbUF8R


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




Пост N: 6546
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.08.17 08:28. Заголовок: Andrey пишет: 1) Не..


Andrey пишет:

 цитата:
1) Нет надписи по команде - WAIT WINDOW "Подождите, создаю тестовую базу...." NOWAIT
На ХР надпись есть. Видать Win8.1 не срабатывает...


Попробуй с цветами поиграть , может появится...

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




Пост N: 5494
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.08.17 16:29. Заголовок: Dima пишет: Попробу..


Dima пишет:

 цитата:
Попробуй с цветами поиграть , может появится...


А как пробовать то ?
Там просто, без параметров - WAIT WINDOW "Подождите, создаю тестовую базу...." NOWAIT
На ХР, Win7, Win10 надпись есть !


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




Пост N: 6547
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.08.17 16:46. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А как пробовать то ?


Ты прав.
Я бы забил на это дело и сделал своё WaitWindow

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




Пост N: 5495
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.08.17 17:30. Заголовок: Andrey пишет: Вроде..


Andrey пишет:

 цитата:
Вроде осталась последняя "непонятка" в примере и всё остальное работает !


Прямоугольник присутствует на WinXP и Win7. На Win8.1 и Win10 - нет.



Как исправить ?


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




Пост N: 6548
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 29.08.17 18:28. Заголовок: Да , странно , косяк..


Да , странно , косяков вроде нет в MyHelpLabel() а голубой квадрат Малевича , есть :)

Цвет квадрата явно перекочевал из MyToolBar()

PS
Win-7

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




Пост N: 5496
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.08.17 07:08. Заголовок: Dima пишет: Цвет кв..


Dima пишет:

 цитата:
Цвет квадрата явно перекочевал из MyToolBar()



Нет, не оттуда. Этот квадрат копия окна подсказки. Наверное как-то перерисовывается в Tsbrowse.

Я придумал как его убрать. При создании окна делаем NOSHOW:
   DEFINE WINDOW Form_Help          ; 
....
NOSHOW ;

а потом в MyPrevEditDim():
      SetProperty(cForm, "Row"    , nY )  
SetProperty(cForm, "Col" , nX )
SHOW WINDOW &cForm

И всё - заработало !!!

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




Пост N: 5514
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.09.17 13:44. Заголовок: Всем привет ! Можно ..


Всем привет !
Можно ли при наведении мышкой на определённый столбец менять вид курсора (типа пальца) ?

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




Пост N: 6579
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.09.17 17:40. Заголовок: Andrey Можно попроб..


Andrey
Можно попробовать через Brw:cToolTip это реализовать.

C:\MiniGUI\SAMPLES\Advanced\Tsb_calendar\demo2.prg

В блоке кода ловишь нужную колонку и меняешь форму курсора

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




Пост N: 5515
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.09.17 19:36. Заголовок: Dima , СПАСИБО за на..


Dima , СПАСИБО за наводку ! Попробую...

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




Пост N: 5528
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.09.17 12:09. Заголовок: Посмотрел пример C:&..


Посмотрел пример C:\MiniGUI\SAMPLES\Advanced\Tsb_calendar\demo2.prg
Так и не понял как к себе применить.

Есть такая таблица:


Как мне сделать следующие подсказки (oBrw:cToolTip) :
1) В колонке 2 - "Открыть + имя_файла (в колонке)", поле бд FILE1 ?
2) В колонке 5 поставить ТОЛЬКО на красную стрелку подсказку "Конвертировать", поле бд LCONV ?
3) В колонке 6 - "Открыть + имя_файла (в колонке)", поле бд FILE2 - ТОЛЬКО для тех колонок, где есть имена файлов ?

Смог сделать только так:
    cToolTip := "Открыть " 
oBrw1:cToolTip := {|oBr,nCol,nRow| oBr:=nil,IIF( nCol==2, cToolTip + HB_NtoS(nRow),;
IIF( nCol==6, cToolTip + HB_NtoS(nRow), "" ) ) }



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




Пост N: 5530
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.09.17 19:51. Заголовок: Как не изгалялся, та..


Как не изгалялся, так и не смог сделать/получить имена файлов и условие по красной стрелке.
Единственно получилось, так это чтобы cToolTip не высвечивался на условиях if( nRow > 0 .AND. nRow < oBr:nLen+1 :
     oBrw1:cToolTip := {|oBr,nCol,nRow| if( nRow > 0 .AND. nRow < oBr:nLen+1, IIF( nCol==2, "Открыть" ,; 
IIF( nCol==6, "Открыть" , IIF(nCol==5,"Конвертировать","" ) ) ),;
) }



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




Пост N: 1630
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.17 14:08. Заголовок: Andrey пишет Как не ..


Andrey пишет
 цитата:
Как не изгалялся,...


 
примерно такая схема (как надо сделаешь сам)
...
DEFINE TBROWSE oBrw AT ...
...
__objAddData( oBrw, 'aRowPosRec' )
... // последними строками перед end tbrowse
If empty(oBrw:aRowPosRec)
oBrw:aRowPosRec := array(oBrw:nRowCount())
AFill(oBrw:aRowPosRec, 0)
EndIf

oBrw:bOnDrawLine := {|obr | On_DrawLine(obr) }
oBrw:cToolTip := {|obr,col,row| On_ToolTip(obr,col,row) }

END TBROWSE
...

STATIC FUNC On_DrawLine( oBr )
LOCAL nRow := If( oBr:lDrawHeaders, Max( 1, oBr:nRowPos ), oBr:nRowPos )

If oBr:lPainted
oBr:aRowPosRec[ nRow ] := (oBr:cAlias)->( RecNo() )
EndIf

RETURN Nil

STATIC FUNC On_ToolTip( oBr, nCol, nRow )
LOCAL cTxt := ''
LOCAL nRec := 0
LOCAL cAls := oBr:cAlias
LOCAL nOld := (cAls)->( RecNo() )
LOCAL cFil, nImg, cOut

If nRow > 0 .and. nRow <= Len( oBr:aRowPosRec )
nRec := oBr:aRowPosRec[ nRow ]
EndIf

If nRec > 0 .and. ( nCol == 2 .or. nCol == 5 .or. nCol == 6 )
(cAls)->( dbGoto( nRec ) )
cFil := AllTrim(Eval(oBr:GetColumn(2):bData))
cOut := AllTrim(Eval(oBr:GetColumn(6):bData))
nImg := Eval(oBr:GetColumn(5):bData) // номер image:
If empty(cOut) .or. nImg == 1 // 1 - '+', 2 - '-->'
// image стрелка
cTxt := 'Конвертировать ' + cFil
Else
// image плюсик
cTxt := 'Открыть '
cTxt += iif( nCol == 6, cOut, cFil )
EndIf
(cAls)->( dbGoto( nOld ) )
EndIf

RETURN cTxt

// Переменная DATA aRowPosRec, ее инициализация и содержимое On_DrawLine у меня
// встроено в класс TsBrowse, без назначения :bDrawLine (для упрощения работы
// с cToolTip)


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




Пост N: 5531
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.09.17 14:33. Заголовок: SergKis пишет: If ..


SergKis пишет:

 цитата:
If empty(cOut) .or. nImg == 1 // 1 - '+', 2 - '-->'
// image стрелка
cTxt := 'Конвертировать ' + cFil
Else
// image плюсик
cTxt := 'Открыть '
cTxt += iif( nCol == 6, cOut, cFil )
EndIf


Для 2 и 6 колонки нужно писать "Открыть "+ имя файла / ALLTRIM(то что стоит соответственно в колонках)
Для 5 колонки: для "+" ничего не писать, а для красной стрелке писать просто "Конвертировать"

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




Пост N: 1631
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.17 16:22. Заголовок: SergKis пишет STATIC..


SergKis пишет
 цитата:
STATIC FUNC On_DrawLine( oBr )


пропустил
 
STATIC FUNC On_DrawLine( oBr )
LOCAL nRow := If( oBr:lDrawHeaders, Max( 1, oBr:nRowPos ), oBr:nRowPos )

If oBr:lPainted
If nRow == 1
AFill(oBr:aRowPosRec, 0)
EndIf

oBr:aRowPosRec[ nRow ] := (oBr:cAlias)->( RecNo() )
EndIf

RETURN Nil


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




Пост N: 1632
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.17 16:23. Заголовок: Andrey пишет Для 2 и..


Andrey пишет
 цитата:
Для 2 и 6 колонки нужно писать "Открыть "+ имя файла / ALLTRIM(то что стоит соответственно в колонках)
Для 5 колонки: для "+" ничего не писать, а для красной стрелке писать просто "Конвертировать"


Это все сам, как надо, так делай
 цитата:
примерно такая схема (как надо сделаешь сам)



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




Пост N: 5532
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.09.17 16:31. Заголовок: SergKis СПАСИБО БОЛЬ..


SergKis СПАСИБО БОЛЬШОЕ !

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




Пост N: 5533
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.09.17 20:39. Заголовок: Всем привет ! А мож..


Всем привет !

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

Про параметр знаю :
oBrw:nAdjColumn  := 6      // растянуть колонку до заполнения пустоты в бровсе справа 



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




Пост N: 6595
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.09.17 15:21. Заголовок: Andrey пишет: Про п..


Andrey пишет:

 цитата:
Про параметр знаю :


Типа не юзаешь его ?

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




Пост N: 5534
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.09.17 16:23. Заголовок: Dima пишет: Типа не..


Dima пишет:

 цитата:
Типа не юзаешь его ?


Не помогает !
Ширина таблицы на форме больше на 2 пиксела, чем сумма ширины всех колонок.
Ставлю/не ставлю этот параметр - все равно присутствует пустая колонка.
Как от неё избавиться не знаю.

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




Пост N: 6596
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.09.17 17:07. Заголовок: Andrey Попробуй пои..


Andrey
Попробуй поиграть с nfreeze и lLockFreeze

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




Пост N: 5535
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.09.17 12:55. Заголовок: Dima пишет: Попробу..


Dima пишет:

 цитата:
Попробуй поиграть с nfreeze и lLockFreeze



У меня уже стоит :
     oBrw1:nFreeze     := 1     // Заморозить столбец 
oBrw1:lLockFreeze := .T. // Избегать прорисовки курсора на замороженных столбцах


А если убрать, то всё равно пустой столбец появляется, последним и вся таблица с пустым столбцом становиться.

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


Пост N: 1560
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.09.17 13:06. Заголовок: Andrey пишет: У мен..


Andrey пишет:

 цитата:
У меня уже стоит :
oBrw1:nFreeze := 1


Ну так все 8 или сколько там есть попробуйте заморозить.

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




Пост N: 5536
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.09.17 14:44. Заголовок: Петр пишет: Ну так ..


Петр пишет:

 цитата:
Ну так все 8 или сколько там есть попробуйте заморозить.



Сразу не понял что нужно заморозить ВСЕ столбцы.
Сделал ! Получилось !!! Таблица вправо перестала сдвигаться.
Спасибо БОЛЬШОЕ !

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




Пост N: 5537
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.09.17 15:27. Заголовок: Рано радовался. Табл..


Рано радовался. Таблица заморозилась и выбора в колонках теперь НЕТ !!!
Значит заморозку использовать НЕЛЬЗЯ для этих целей...

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


Пост N: 1561
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.09.17 15:54. Заголовок: Andrey пишет: выбо..


Andrey пишет:

 цитата:
выбора в колонках теперь НЕТ


И при oBrw1:lLockFreeze := .F. ?

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




Пост N: 6597
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.09.17 15:54. Заголовок: oBrw1:lLockFreeze :=..


oBrw1:lLockFreeze := .F.

PS
Хэх одновременно написали

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




Пост N: 5538
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.09.17 16:27. Заголовок: Dima пишет: oBrw1:l..


Dima пишет:

 цитата:
oBrw1:lLockFreeze := .F.


Enter заработал, двойной клик мышки нет !
Ерунда опять получается...
Писать отдельную функцию на срабатывание мышки - не есть хорошо, когда уже стандартная подключена по умолчанию.
Дело в том что хочется обойтись стандартным кодом.
У меня везде на нужных колонках стоит только:
         // обработка до ввода 
oBrw1:aColumns[2]:bPrevEdit := {|| FieldEditFile(1), FALSE }
oBrw1:aColumns[5]:bPrevEdit := {|| FieldImageEdit(), FALSE }
oBrw1:aColumns[6]:bPrevEdit := {|| FieldEditFile(2), FALSE }



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




Пост N: 1633
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.09.17 12:57. Заголовок: SergKis пишет STATI..


SergKis пишет
 цитата:
STATIC FUNC On_DrawLine( oBr ) ...


Правильно так
 
STATIC FUNC On_DrawLine( oBr )
LOCAL nRow

If oBr:lPainted
nRow := oBr:nPaintRow
If nRow == 1
AFill(oBr:aRowPosRec, 0)
EndIf

oBr:aRowPosRec[ nRow ] := (oBr:cAlias)->( RecNo() )
EndIf

RETURN Nil


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


Пост N: 736
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 06.12.17 10:40. Заголовок: oBrw1:aColumns:bPre..



 цитата:
oBrw1:aColumns[2]:bPrevEdit := ...



А можно сделать вызов общий для всех колонок, без указания № колонки ?
Т.е. при выходе с редактирования из любой колонки вызывается одна функция или блок.

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




Пост N: 1659
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.12.17 10:52. Заголовок: Vlad04 1. AEval(oBr..


Vlad04
1.
 
AEval(oBrw1:aColumns, {|oCol| oCol:bPrevEdit := {|val, brw | Prev( val, brw ) }, ;
oCol:bPostEdit := {|val, brw, add| Post( val, brw, add ) } )

2. или FOR ... применить

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


Пост N: 737
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 06.12.17 11:06. Заголовок: Ниже неправильно (вы..


Ниже неправильно (выдает ошибку)

AEval(Brw_3:aColumns, {|oCol| oCol:bPostEdit := {|val, brw, add| brw_3:Upstable() } )

Но как-то так хочется, т.е. для всех колонок Brw_3 при выходе с редактирования выполнять стабилизацию Бровса


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




Пост N: 1660
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.12.17 11:12. Заголовок: Vlad04 в блок кода ..


Vlad04
в блок кода передаются параметры val, brw, add, используйте их
{|val, brw| brw:Upstable() }



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




Пост N: 1661
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.12.17 11:17. Заголовок: PS Vlad04 пишет Но к..


PS
Vlad04 пишет
 цитата:
Но как-то так хочется, т.е. для всех колонок Brw_3 при выходе с редактирования выполнять стабилизацию Бровса


усложните блок кода, если надо после 2-ой колонки, то
AEval(Brw_3:aColumns, {|oCol,nCol| oCol:bPostEdit := iif( nCol == 2, {|val, brw, add| brw:Upstable() }, NIL ) )



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


Пост N: 738
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 06.12.17 11:20. Заголовок: Скобка одна } пропу..


Скобка одна } пропущена, а так нормально

 цитата:
AEval(Brw_3:aColumns, {|oCol| oCol:bPostEdit := {|val, brw | brw:Upstable() }} )



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




Пост N: 5613
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.12.17 14:40. Заголовок: Пробежаться для чтен..


Пробежаться для чтения по колонке для oBrw := SetArrayTo(...) можно так:

// Итог по колонке 
FUNCTION ItogoColumn( oBrw, cNameColumn )
LOCAL nCol := oBrw:nColumn(cNameColumn)
LOCAL oCol, nItg := 0

aEval(oBrw:aArray, { |aVal,nElm| nItg += aVal[ nCol ] })

oCol:GetColumn(cNameColumn):cFooting := hb_ntos(nItg)
oBrw:DrawFooters()

// или
// oCol := oBrw:GetColumn(nCol)
// oCol:cFooting := hb_ntos(nItg)

RETURN NIL

или так
   LOCAL nCol := oBrw:nColumn(cNameColumn) 
LOCAL nItg := 0

FOR nI := 1 TO LEN(oBrw:aArray) // или oBrw:nLen
nItg += oBrw:aArray[ nI, nCol ]
NEXT

Пробежаться для записи по всей таблице для oBrw := SetArrayTo(...) можно так:
( Запись осуществляется средствами таблицы !)

   // допустим колонка LMETKA 
nCol := oBrw:nColumn("LMETKA")
FOR nI := 1 TO LEN(oBrw:aArray) // или oBrw:nLen
lMark := oBrw:aArray[nI,nCol]
oBrw:aArray[nI,nCol] := !lMark
NEXT

А как такую же операцию сделать для обычного TBROWSE, средствами таблицы ?
И не средствами драйвера базы - (oBrw:cAlias)->LMETKA := !lMark



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




Пост N: 1137
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.12.17 16:36. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А как такую же операцию сделать для обычного TBROWSE, средствами таблицы ?


Примерно так
 
FOR nI := 1 TO oBrw:nLen
AEval( oBrw:aColumns, {|oCol| Eval(oCol:bData, !Eval(oCol:bData)) })
NEXT



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




Пост N: 5614
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.12.17 16:59. Заголовок: Haz пишет: Примерно..


Haz пишет:

 цитата:
Примерно так


А позиционирование по строке таблицы - разве не нужно ?

По массиву же стоит - oBrw:aArray[nI,nCol] =
Или я просто не понял...
Можешь написать без Eval() ...

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




Пост N: 1138
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.12.17 17:36. Заголовок: Andrey пишет: А поз..


Andrey пишет:

 цитата:
А позиционирование по строке таблицы - разве не нужно


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

Без Eval() только через драйвер базы, да и Eval тоже неявно использует драйвер.
Зачем такой изврат , если драйвер самое быстрое и надежное решение ?


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




Пост N: 1139
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.12.17 17:47. Заголовок: Haz пишет: пример э..


Haz пишет:

 цитата:
пример этот только показывает как использовать ::bData


bData - это блок выборки / записи , такой же как и в Clipper , он же возвращается функцией FieldWBlock().
при предаче в блок парамера как Eval( ::bData, x ) -этот параметр присваивается в поле.
При вызове без параметра - как Eval(::bdata ) возвращает значение поля.
в классическом виде это примерно так {|x| if(pCount() == 0, FieldGet(nCol), FieldPut(nCol, x))}.
Замечу - блок не заботится о блокировке записи.
PS впрочем именно этот блок мы с тобой уже неоднократно обсуждали на форуме.
PPS Оно тебе надо ? чем драйвер не угодил то
if (oBrw:cAlias)->(Rlock())
(oBrw:cAlias)->&(oBrw:aColumns[oBrw:nCell]:cName) := 'новое значение'
(oBrw:cAlias)->(dbUnlock())
end

Спасибо: 0 
Профиль
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 
Профиль
Andrey
постоянный участник




Пост N: 5658
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.17 22:41. Заголовок: Чтобы не было путани..


Чтобы не было путаницы, описываю кратко задачу которую делаю.
1) На форму вывожу таблицу из ОДНОЙ строки 26 колонок. Просто для краткости.
2) Далее эту таблицу удаляю и меняю на нужную - пусть будет 50 записей и 8 колонок.

Вылет происходит при присваивании нового массива в таблицу.
Пробовал двумя методами:
 
ADD ITEM aArray[ nI ] TO &cBrw OF &cForm
и
aRows := Array(1, 8)
aRows[1][1] := aArray[nI,1]
.....
oBrw1:AddItem( aRows[1] )

Полазив по h_tbrowse.prg понял что там не правильно определяется размер колонок.
Остаётся старая длина колонок - 26.
Исходник h_tbrowse.prg строка 10558:
 
nColumns := If( ! Empty( aHead ), Len( aHead ), If( ! Empty( ::aArray ), Len( ::aArray[ 1 ] ), 0 ) )
::aDefValue := Array( Len( aArray[ 1 ] ) )
? "--------- h_tbrowse.prg nColumns=",nColumns // моя отладка возвращает 26
? "Len( aHead )=", Len( aHead ), "Len( ::aArray[ 1 ] )=", Len( ::aArray[ 1 ] ) // моя отладка возвращает 26 и 8
For nI := 1 To nColumns
...........


Вопрос - как у себя в программе обнулить массив - aHead который в h_tbrowse.prg ?
Почему не срабатывает удаление колонок для массива заголовков таблицы, т.е. не работает этот код:
   nCol  := oBrw1:nColCount()  // сколько колонок в текущем массиве 
nColMax := LEN(aDim[1]) // сколько колонок в новом массиве

For nI := nColMax + 1 To nCol
oBrw1:DelColumn( nI )
Next

Может я не так удаляю ?




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


Пост N: 1571
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 24.12.17 01:32. Заголовок: Просто для краткости..


Просто для краткости - лезьте снова в h_tbrowse.prg и попытайтесь понять, как же работает метод DelColumn

..
hb_ADel( ::aColumns, nPos, .T. ) // это в виде бонуса
..


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




Пост N: 1147
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 10:38. Заголовок: Петр пишет: лезьте..


Петр пишет:

 цитата:
лезьте снова в h_tbrowse.prg


Это правильный посыл.
Петр пишет:

 цитата:
это в виде бонуса


Петр, это надо расписать подробнее для Андрея . Когда допиливалось заполнение бровса из массивов параметров, метод ::DelColumn(), прошли мимо.
Думаю просто до него не дошли в тестах.
Андрей в исходнике правильно нашёл 2 ключевых места.
1) количество колонок приоритено определяется по длинне массива заголовков
2) ::DelColumn не меняет массивы заголовков, шаблонов, и выравнивания.
Но поскольку все это определено в данных объекта бровса, то легко доступно из прикладной программы.
Вопрос Андрея понимаю так "как удалить элемент из массива?"
И вот тут короче чем твой бонус уже не скажешь.

PS. Но по большому счету это нужно добавить в :DelColumn() тремя аналогичными строками.

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




Пост N: 5659
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.17 11:21. Заголовок: Haz пишет: Но по бо..


Haz пишет:

 цитата:
Но по большому счету это нужно добавить в :DelColumn() тремя аналогичными строками.


Да, это было бы отлично !
Но увы, я не смогу, знаний у меня пока ещё не хватает...
Если не сложно, сделайте пожалуйста это.
Всё равно потом другой кто-то наткнётся на эти

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




Пост N: 1679
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.12.17 11:43. Заголовок: У нас уже была диску..


У нас уже была дискуссия по oBrw:DelColumn() nn времени назад.
Результатом было отказ от него, т.к. проще сделать release и пересоздать тсб как нужно, чем корячится с отладкой тсб.
Кинул пример Андрею, пусть поделится, если хочет, там его небольшая база использована

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




Пост N: 1148
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 11:54. Заголовок: Andrey пишет: Но ув..


Andrey пишет:

 цитата:
Но увы, я не смогу, знаний у меня пока ещё не хватает...


Не пойму какие знания нужны для 1 строки кода
 
MEIHOD DelColumn()
...
...
oCol := ::aColumns[ nPos ]
ARRDEL_( ::aColumns, nPos )
ARRDEL_( ::aColSizes, nPos )
ARRDEL_( ::aHeaders, nPos ) // можно и с проверкой что такой элемент есть в этом массиве
...
...


можно попутно резануть и массивы
::aFormatPic
::aJustify
но на расчет nColumns в методе StArray/SetArrayTo они не влияют.


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




Пост N: 1149
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 12:04. Заголовок: SergKis пишет: У на..


SergKis пишет:

 цитата:
У нас уже была дискуссия по oBrw:DelColumn() nn времени назад.
Результатом было отказ от него, т.к. проще сделать release и пересоздать тсб как нужно, чем корячится с отладкой тсб



Сергей , я видимо пропустил эту дискуссию или был в коматозе от работы. Но даже в случае отказа от ::DelColumn - не велика потеря, хотя для полноты класса он нужен. Всегда можно написать свою функцию при необходимости. Я использую иногда у себя DelColumn тк это быстрее чем собирать сложный бровс. А вот HideColumn не люблю, на бровсе с большим количеством полей визуально как резиновый "растягай" себя ведет ))
Release и пересоздание использую только когда на этом месте нужно показать другой бровс

Вообще интересно , почему в методе SetArray ( который являлся изначальным шаблоном для твоего SetArrayTo ) количество столбцов определяется через Len( ::aHeading ), а не как Len( ::aColumns )




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




Пост N: 1680
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.12.17 13:16. Заголовок: Haz пишет интересно ..


Haz пишет
 цитата:
интересно , почему в методе SetArray ( который являлся изначальным шаблоном для твоего SetArrayTo ) количество столбцов определяется через Len( ::aHeading ), а не как Len( ::aColumns )


ответ на кусочке из примера
 
STATIC FUNCTION MyTest()
LOCAL aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF
LOCAL oBrw := _HMG_aControlIds [ (This.oBrw.Index) ]
LOCAL cForm := oBrw:cParentWnd
LOCAL cBrw := oBrw:cControlName
LOCAL nSet := This.Cargo // это StatusBar.Cargo

If empty(nSet)
aArray := AClone( ThisWindow.Cargo[ 1 ] )
aHead := ASize(AClone( ThisWindow.Cargo[ 2 ] ), 6)

aSize := ASize(AClone( ThisWindow.Cargo[ 3 ] ), 6)
aFoot := ASize(AClone( ThisWindow.Cargo[ 4 ] ), 6)
aPict := ASize(AClone( ThisWindow.Cargo[ 5 ] ), 6)
aAlign := ASize(AClone( ThisWindow.Cargo[ 6 ] ), 6)
aName := ASize(AClone( ThisWindow.Cargo[ 7 ] ), 6)
This.Cargo := 1
Else
aArray := AClone( ThisWindow.Cargo[ 1 ] )
aHead := AClone( ThisWindow.Cargo[ 2 ] )

aSize := AClone( ThisWindow.Cargo[ 3 ] )
aFoot := AClone( ThisWindow.Cargo[ 4 ] )
aPict := AClone( ThisWindow.Cargo[ 5 ] )
aAlign := AClone( ThisWindow.Cargo[ 6 ] )
aName := AClone( ThisWindow.Cargo[ 7 ] )
This.Cargo := 0
EndIf

_ReleaseControl(cBrw, cForm) // delete picture object

oBrw := CreateTsb(cBrw, cForm, aArray, aHead, aSize, aFoot, aPict, aAlign, aName)

RETURN Nil

т.е. достаточно сменить шапку и остальное не трогать, где то смысл есть в этом.


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




Пост N: 1681
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.12.17 13:28. Заголовок: Haz пишет ::DelColum..


Haz пишет
 цитата:
::DelColumn - не велика потеря, хотя для полноты класса он нужен.



Но лезть в класс, лично у меня, нет сил, если кто то ...

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




Пост N: 5660
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.17 14:48. Заголовок: Haz пишет: Не пойму..


Haz пишет:

 цитата:
Не пойму какие знания нужны для 1 строки кода



А кто ж знал что нужно добавить только 1 строчку ?
Я думал, что кучу всего тащить придётся !

Haz пишет:

 цитата:
можно попутно резануть и массивы
::aFormatPic
::aJustify
но на расчет nColumns в методе StArray/SetArrayTo они не влияют.


Нужно ОБЯЗАТЕЛЬНО !
Т.е. если не переопределить, то при присвоении новых данных будет вылет по ошибке.

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


Пост N: 1572
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 24.12.17 14:55. Заголовок: Для Andrey Не вника..


Для Andrey

Не вникая в реализацию DelColumn, могу сказать, что он не заточен на удаление столбцов в цикле

procedure main() 

local aTest := Array( 26 )

local nSize := Len( aTest )
local i := 8

for i := i + 1 to nSize
? i, nSize, Len( hb_ADel( aTest, i, .T. ) )
next


ps. по крайней мере это относится к циклу for, который вы собрались использовать

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




Пост N: 5661
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.17 16:24. Заголовок: Haz пишет: MEIHOD D..


Haz пишет:

 цитата:
MEIHOD DelColumn()
...
...
oCol := ::aColumns[ nPos ]
ARRDEL_( ::aColumns, nPos )
ARRDEL_( ::aColSizes, nPos )
ARRDEL_( ::aHeaders, nPos ) // можно и с проверкой что такой элемент есть в этом массиве
...



Не могу найти это кусок кода. Брал последний МиниГуи 17.12, в исходнике h_tbrowse.prg:
* ============================================================================ 
* METHOD TSBrowse:DelColumn() Version 9.0 Nov/30/2009
* ============================================================================
METHOD DelColumn( nPos ) CLASS TSBrowse
..........
Строка 2078:
oCol := ::aColumns[ nPos ]
hb_ADel( ::aColumns, nPos, .T. )
hb_ADel( ::aColSizes, nPos, .T. )


То или не то ?


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




Пост N: 1150
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 17:17. Заголовок: Andrey пишет: То ил..


Andrey пишет:

 цитата:
То или не


То, у меня видимо старее версия.


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




Пост N: 1151
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 17:39. Заголовок: Сергей пишет : Но ле..


Сергей пишет :

 цитата:
Но лезть в класс, лично у меня, нет сил,


Аналогично, только если мелкими шагами. Поскольку этот класс в последние годы активно меняется
Вижу только вариант постепенного доведения до условно оптимального.
Что касается SetArray или SetArrayto, испозую редко. Но именно SetArrayTo логично востребован.
У меня есть свой типа ComboBox на основе бровса. Для разных полей нужен разный выбор, и тут SetArrayTo отлично вписался.


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




Пост N: 1682
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.12.17 18:16. Заголовок: Игорь пишет и тут Se..


Игорь пишет
 цитата:
и тут SetArrayTo отлично вписался.


У меня, большинство, чтение csv и txt файлов. Типа ранее сохраненных hb_memowrit(cFile, hb_valtoexp(aArray)) потом читаемых
aArray := &( hb_memoread(cFile) ) или
aTemp := hb_ATokens(hb_memoread(cFile), CRLF)
aArray := {}; AEVal(aTemp, {|cv| iif( empty(cv), Nil, AAdd(aArray, &cv) ) })
и т.д., т.е. отчеты\отборы, прием\обмен табл.данными


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




Пост N: 5662
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.17 20:44. Заголовок: Григорий - можно сде..


Григорий - можно сделать правку в исходнике ?
последний МиниГуи 17.12, в исходнике h_tbrowse.prg:
* ============================================================================  
* METHOD TSBrowse:DelColumn() Version 9.0 Nov/30/2009
* ============================================================================
METHOD DelColumn( nPos ) CLASS TSBrowse
..........
Строка 2078:
oCol := ::aColumns[ nPos ]
hb_ADel( ::aColumns, nPos, .T. )
hb_ADel( ::aColSizes, nPos, .T. )
hb_ADel( ::aHeaders, nPos, .T. ) // новая строка
hb_ADel( ::aFormatPic, nPos, .T. ) // новая строка


С этой правкой мой проект заработал !
Т.е. удаление столбцов и присваивание новых массивов и показ новой таблицы проходит отлично !
Единственно что не проверил это добавление новых столбцов. Но это уже чуть позже.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1219
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 24.12.17 23:10. Заголовок: Andrey пишет: можн..


Andrey пишет:

 цитата:
можно сделать правку в исходнике ?


Да, конечно.
По итогу обсуждения добавил такие строки

 цитата:
 
If ValType( ::aHeaders ) == "A" .and. Len( ::aHeaders ) >= nPos
hb_ADel( ::aHeaders, nPos, .T. )
EndIf
If ValType( ::aFormatPic ) == "A" .and. Len( ::aFormatPic ) >= nPos
hb_ADel( ::aFormatPic, nPos, .T. )
EndIf



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


Пост N: 1573
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.12.17 00:05. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
По итогу обсуждения добавил такие строки



Григорий, проверки здесь излишние.
hb_ADel и так их выполняет, не сваливаясь при этом в обработчик ошибок.

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


Пост N: 308
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 25.12.17 17:39. Заголовок: Haz пишет: А вот H..


Haz пишет:

 цитата:
А вот HideColumn не люблю, на бровсе с большим количеством полей визуально как резиновый "растягай" себя ведет ))


— Соломон Моисеевич, вы любите жизнь?
— Люблю!
— А почему?
— А куда деваться?
SergKis пишет:

 цитата:
т.е. достаточно сменить шапку и остальное не трогать, где то смысл есть в этом.


Правый клик по шапке и в меню. Убрал птичку -нет столбца. Поставил птичку - есть столбец ...






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




Пост N: 1152
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.12.17 20:27. Заголовок: ММК пишет: Убрал пт..


ММК пишет:

 цитата:
Убрал птичку -нет столбца. Поставил птичку - есть столбец ...


Да спрятать или показать колонку не сложно. я высказал свое отношение к спрятанным колонкам.
Мне проще её удалить, чем тянуть в бровсе лишнее. Да и от удаления колонки поле в базе никуда не денется.
В качестве абсурда можно сделать пример бровса из 200 колонок и скрыть от 5 и далее все остальное , потом сдвинуться вправо дальше 5. Такой пример скорее не логичен, но демонстрирует хорошо.
Кстати то что делает Андрей ( перестраивает бровс по колонкам удаляя лишние и добавляя нужные)
Я тоже использую. К примеру классический бюджет подразделения по статьям, левая часть названия, статьи, коды. Правая часть движение денег по периодам. При этом периоды произвольные, если за год по дням то их 365, если по месяцам 12, если по неделям то 52(53). Тупо строю SQL запрос на нужное число периодов, удаляю правую часть бровса и подсунув ему новую рабочую область добавляю колонки. Бюджет из поквартального с 4 колонками превращается в недельный с 52 за 2 секунды. В подням на тригода вперёд за 5 сек, а это 1000 полей. Ясно что практически такая детализация не нужна, но эффект впечатляет.
Так это я к тому, если бы я прятал колонки, то сколько мне их нужно было заранее держать в бровсе

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




Пост N: 1683
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.12.17 20:42. Заголовок: MMK пишет Правый кли..


MMK пишет
 цитата:
Правый клик по шапке и в меню. Убрал птичку -нет столбца. Поставил птичку - есть столбец ...



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


Имел ввиду, что поля не вошедшие в таблицу отображаются рядом в вертикальной развертке (режим "карточка") и кликами можно переключать с табличного на "карточный" режим

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




Пост N: 5664
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.12.17 00:18. Заголовок: Хрень получается при..


Хрень получается при очистке таблицы.
Один раз чистит от записей, второй нет. Или я опять что то не то делаю.

Команда oBrw1:DeleteRow( .T. ) делает полную очистку таблицы для SetArrayTo() ?
Ещё что-то нужно делать для очистки таблицы ?

Вывожу таблицу (функция допустим TsbView(aDim,.F.) ) первый раз с условиями (допустим код колонки 7 < 11) .
На чекбокс делаю показ этой же самой функции в зависимости от чекбокса TsbView(aDim,lFilter).
Если чекбокс равет .T. то показываю записи - код колонки 7 == 11.

При повторном показе записей в таблице остаются записи от первого показа + новые.
Если ещё раз кликнуть чекбоксом, записи в таблице прибавляются...

Почему ? Я же делаю для SetArrayTo() :
   oBrw1:DeleteRow( .T. )       // Delete All 
oBrw1:Reset()

и только потом делаю добавление построчно:
oBrw1:AddItem( aRows[1] )       

----
P.S. И первый раз не чистит.
Кажись если колонки удалили - оператор oBrw1:DeleteRow( .T. ) перестаёт работать ...

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1220
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.12.17 12:55. Заголовок: Andrey пишет: что-т..


Andrey пишет:

 цитата:
что-то нужно делать для очистки таблицы ?


Посмотри рабочий пример ниже
 
#include "minigui.ch"
#include "tsbrowse.ch"

Procedure Main ()

Public oBrw1
Public aDatos_origen

DEFINE WINDOW Form1 ;
AT 0,0 ;
WIDTH 640 ;
HEIGHT 480 ;
TITLE "TsBrowse Array Test" ;
MAIN ;
FONT 'Tahoma' SIZE 9;
ON INIT Sample1()
END WINDOW

ACTIVATE WINDOW Form1

RETURN

*--------------------------------------------------------------

Function Sample1()

Local bColor := { || If( Val(oBrw1:aArray[oBrw1:nAt,4]) < 200, CLR_RED, CLR_WHITE ) }

aDatos_origen := {}

AADD( aDatos_origen, {"Ena ", "Art01", "Mod01", "200"} )
AADD( aDatos_origen, {"Dyo ", "Art02", "Mod01", "200"} )
AADD( aDatos_origen, {"Tria ", "Art03", "Mod01", "200"} )
AADD( aDatos_origen, {"Tessera ", "Art04", "Mod01", "200"} )
AADD( aDatos_origen, {"Pente ", "Art05", "Mod01", "200"} )
AADD( aDatos_origen, {"Exi ", "Art06", "Mod01", "200"} )
AADD( aDatos_origen, {"Epta ", "Art07", "Mod01", "200"} )
AADD( aDatos_origen, {"Okto ", "Art08", "Mod01", "200"} )
AADD( aDatos_origen, {"Ennea ", "Art09", "Mod01", "100"} )
AADD( aDatos_origen, {"Deka ", "Art10", "Mod02", "200"} )
AADD( aDatos_origen, {"Enteka ", "Art11", "Mod02", "200"} )
AADD( aDatos_origen, {"Dodeka ", "Art12", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekatria ", "Art13", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekatessera ", "Art14", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekapente ", "Art15", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekaexi ", "Art16", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekaepta ", "Art17", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekaokto ", "Art18", "Mod02", "200"} )


DEFINE TBROWSE oBrw1 ;
AT 60,10 ;
OF Form1 ;
WIDTH 330 ;
HEIGHT 340 ;
FONT "Verdana" ;
SIZE 9 ;
GRID

oBrw1:SetArray( aDatos_origen )

ADD COLUMN TO TBROWSE oBrw1 ;
DATA ARRAY ELEMENT 1;
TITLE "Rubro" SIZE 120

ADD COLUMN TO TBROWSE oBrw1 ;
DATA ARRAY ELEMENT 2;
TITLE "Articulo" SIZE 80

ADD COLUMN TO TBROWSE oBrw1 ;
DATA ARRAY ELEMENT 3;
TITLE "Marca" SIZE 80

ADD COLUMN TO TBROWSE oBrw1 ;
DATA ARRAY ELEMENT 4;
TITLE "M" SIZE 30 ;
COLORS CLR_BLACK, bColor

oBrw1:lNoVScroll := .t.

End TBROWSE

oBrw1:Refresh(.T.)

@ 110,355 BUTTON Button_1 OF Form1;
CAPTION "Change";
ACTION Change() ;
WIDTH 80;
HEIGHT 28 ;
FONT "Arial" SIZE 9


RETURN Nil


Function Change()

Local aArray := {}, n

AADD( aArray, {"Ena ", "Art01", "Mod01", "200"} )
AADD( aArray, {"Dyo ", "Art02", "Mod01", "200"} )
AADD( aArray, {"Tria ", "Art03", "Mod01", "200"} )
AADD( aArray, {"Tessera ", "Art04", "Mod01", "200"} )
AADD( aArray, {"Pente ", "Art05", "Mod01", "200"} )
AADD( aArray, {"Exi ", "Art06", "Mod01", "200"} )
AADD( aArray, {"Epta ", "Art07", "Mod01", "200"} )
AADD( aArray, {"Okto ", "Art08", "Mod01", "200"} )
AADD( aArray, {"Ennea ", "Art09", "Mod01", "100"} )
AADD( aArray, {"Deka ", "Art10", "Mod02", "200"} )

oBrw1:aArray:={}

for n:=1 to len(aArray)
ADD ITEM aArray[n] TO oBrw1 OF Form1
next

oBrw1:Refresh(.T.)

Return Nil

Надеюсь, что вопросы по очистке массива отпадут

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




Пост N: 1684
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.12.17 13:20. Заголовок: gfilatov2002 пишет П..


gfilatov2002 пишет
 цитата:
По итогу обсуждения добавил такие строки


наверно надо добавить в :DelColumn и удаление элементов из ::aJustify и ::aDefValue

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1221
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.12.17 13:50. Заголовок: SergKis пишет: надо..


SergKis пишет:

 цитата:
надо добавить в :DelColumn


Благодарю за помощь
Добавил эти массивы и убрал лишние проверки, как предложил ранее Петр...

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




Пост N: 5665
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.12.17 13:55. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Надеюсь, что вопросы по очистке массива отпадут


Точно, не хватало oBrw1:aArray:={} !!!

Это называется - нужно учить матчасть...


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


Пост N: 309
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 26.12.17 14:25. Заголовок: Haz пишет: Так это ..


Haz пишет:

 цитата:
Так это я к тому, если бы я прятал колонки, то сколько мне их нужно было заранее держать в бровсе



Извините , виноват . Мне надо было сразу написать, что это пример на FW. А там это просто опция бровса ( встроенная ), как поиск, фильтр, экспорт в эксель.... ну и много еще что :)) Выложил просто в виде подсказки ( как вариант) , как в будущем можно будет доработать ( или переписать ) бровс
Думаю Сергей прав - удобнее работать с столбцами на уровне шапки.

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




Пост N: 5667
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.12.17 21:16. Заголовок: Осталась мелочёвка п..


Осталась мелочёвка по SetArrayTo():
1) Пропадает нижняя стрелка в строке скролинга:


2) Отключаю показ горизонтального скролинга, а он всё равно отображается:


3) Не убирается дырка внизу таблицы (один раз срабатывает, второй нет).
Может быть из за показа горизонтального скролинга ?

4) В конце функции делаю фокус на таблицу. Не срабатывает !

Вот код в конце функции, которая выводит SetArrayTo():
   oBrw1:HideColumns( {6,7,8} ,.t.)   // скрыть колонки 
oBrw1:Reset()
oBrw1:SetNoHoles(2)
oBrw1:lNoHScroll := .T. // нет показа горизонтального скролинга
oBrw1:Display()
oBrw1:Refresh(.T.) // перечитывает данные в таблице
oBrw1:GoPos(1,4) // передвинуть МАРКЕР на Х строку и Х колонку
ItogoNN(oBrw1)
oBrw1:SetFocus()

Что не так делаю ?

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




Пост N: 6666
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.17 22:28. Заголовок: Andrey пишет: Что н..


Andrey пишет:

 цитата:
Что не так делаю ?


Спишь мало
Проспись и все получится !

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




Пост N: 1685
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.12.17 00:36. Заголовок: Dima пишет Проспись ..


Dima пишет
 цитата:
Проспись и все получится !


Возможно ты уже поборол такую ситуевину ?
У меня получилось так
 
DEFINE TBROWSE &cBrw ;
AT 1 + iif( IsVistaOrLater(), GetBorderWidth()/2, 0 ), ;
1 + iif( IsVistaOrLater(), GetBorderHeight()/2, 0 ) ;
OF &cForm ;
WIDTH ThisWindow.WIDTH - 2 * GetBorderWidth() ;
HEIGHT ThisWindow.HEIGHT - GetTitleHeight() - ;
This.StatusBar.Height - 2 * GetBorderHeight() ; // ENUMERATOR ;
FONT cFontName SIZE nFontSize ;
GRID // EDIT

oBrw := _HMG_aControlIds [ GetControlIndex(cBrw, cForm) ]
oBrw:Hide()

aFontHF := aFont[2] // bold Header, Footer

oBrw := SetArrayTo( cBrw, cForm, aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName )

WITH OBJECT oBrw
:aColumns[1]:nAlign := DT_CENTER
:aColumns[2]:nAlign := DT_CENTER
:aColumns[3]:nWidth += 20 // колонку даты расширили
:aColumns[4]:nAlign := DT_RIGHT

AEval(:aColumns, {|oc| oc:lEmptyValToChar := .T. })

:lNoHScroll := .T.
:nWheelLines := 1
:nClrLine := COLOR_GRID
:nHeightCell += 5
:nHeightHead += 5
IF ! Empty( aFoot )
:nHeightFoot += 5
ENDIF
IF :lEnum
:nHeightSpecHd := :nHeightCell
ENDIF
END WITH

MyTsbColor( oBrw )

END TBROWSE

oBrw:SetNoHoles()
oBrw:Show()
oBrw:SetFocus()
_PushKey(VK_PRIOR)

или отказаться от
:lNoHScroll := .T.



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




Пост N: 1686
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.12.17 10:56. Заголовок: Andrey пишет Отключа..


Andrey пишет
 цитата:
Отключаю показ горизонтального скролинга, а он всё равно отображается:


При первом отображении тсб, у него нет HScroll, после переформирования array, он проявляется и не убирается,
потому получается дырка. Т.к. колонок больше экрана, то смысла убирать HScroll нет. Если поставить
oBrw1:lNoVScroll := .F. // TRUE
oBrw1:lNoHScroll := .F. // нет показа горизонтального скролинга
то дырки не будет. В данном случае логично работать с HScroll.



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




Пост N: 1687
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.12.17 12:11. Заголовок: PS oBrw1:oHScroll :=..


PS
oBrw1:oHScroll := Nil
не помогает, HScroll проявляется

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




Пост N: 5669
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.12.17 12:45. Заголовок: Всем привет ! Сделал..


Всем привет !
Сделал менюшку показа адреса через COMBOBOX. Выбор города, улицы, номер дома - отлично показывается.
А список квартир бывает большой, листать юзеру неудобно будет.
Решил переделать через SetArrayTo()
Можно ли убрать показ заголовка таблицы и как ?

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




Пост N: 1688
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.12.17 16:53. Заголовок: Andrey пишет Можно л..


Andrey пишет
 цитата:
Можно ли убрать показ заголовка таблицы и как ?


1.
DATA lDrawHeaders AS LOGICAL INIT .T. // condition for headers drawing
DATA lDrawFooters // condition for footers drawing
2.
сделать высоту header, footer в пару пикселей, если они цветные , будут полоски.

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




Пост N: 5678
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.01.18 23:21. Заголовок: Сделал менюшку показ..


Сделал менюшку показа списка квартир через SetArrayTo(). Вроде красивенько получилось.
А как можно закрасить Tsbrowse в "шашечку" ?
Ну чтобы была как шахматная доска. Это не для показа юзеру, просто для себя.

У себя раскраску делаю так:
   // ---- cтавим по всем колонкам ----( oCol:nClrBack = oBrw:SetColor( {2} ...) ---- 
AEval(oBrw1:aColumns, {|oCol| oCol:nClrBack := { |a,b,o| a:=b, MyColorTsb( o:nAt ) } } )
...........
////////////////////////////////////////////////////////////
STATIC FUNCTION MyColorTsb(nAt)
LOCAL nColor

IF nAt % 2 == 0
nColor := CLR_HGRAY
ELSE
nColor := CLR_WHITE
ENDIF

RETURN nColor
Вот что получается:


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




Пост N: 1693
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.01.18 11:50. Заголовок: Andrey пишет А как м..


Andrey пишет
 цитата:
А как можно закрасить Tsbrowse в "шашечку" ?
Ну чтобы была как шахматная доска


1. переведи на русский (словами) из функции
 
IF nAt % 2 == 0
nColor := CLR_HGRAY
ELSE
nColor := CLR_WHITE
ENDIF

2. также словами напиши\расшифруй "шахматная доска"

Получишь ответ, как сделать

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




Пост N: 5679
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.01.18 14:37. Заголовок: SergKis пишет: 2. т..


SergKis пишет:

 цитата:
2. также словами напиши\расшифруй "шахматная доска"


Выбор по ячейки - четная/не четная.
Не знаю как вместо nAt указать ячейку.
Пробовал ставить oBrw1:nCell - не получается.

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




Пост N: 1154
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.01.18 16:41. Заголовок: Andrey пишет: У себ..


Andrey пишет:

 цитата:
У себя раскраску делаю так:
// ---- cтавим по всем колонкам ----( oCol:nClrBack = oBrw:SetColor( {2} ...) ----
AEval(oBrw1:aColumns, {|oCol| oCol:nClrBack := { |a,b,o| a:=b, MyColorTsb( o:nAt ) } } )


Андрей, а сможешь объяснить выделенное красным в твоем коде ?
Возможно когда сможешь ,то и шахматка получится

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




Пост N: 5680
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.01.18 17:42. Заголовок: Haz пишет: Андрей, ..


Haz пишет:

 цитата:
Андрей, а сможешь объяснить выделенное красным в твоем коде ?


Это делалось для того, чтобы компиляция проходила. Без этого ехе-ник не собирается.
Я использую ключи при компиляции: -prgflag=-w2 -es2
Сделал ранее так и забыл... Понял в какую сторону нужно глядеть. Спасибо !



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




Пост N: 1155
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.01.18 17:52. Заголовок: Andrey пишет: Это д..


Andrey пишет:

 цитата:
Это делалось для того, чтобы компиляция проходила.


Тогда тебе повезло, что бровс не реагирует на присвоение значения в ::nAt, кстати ты не так давно огорчался по этому поводу


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




Пост N: 5681
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.01.18 17:58. Заголовок: Опять непонятки... Д..


Опять непонятки... Делаю:
   AEval(oBrw1:aColumns, {|oCol| oCol:nClrBack := { |a,b| MyColorTsb(a,b) } } ) 
....
////////////////////////////////////////////////////////////
STATIC FUNCTION MyColorTsb(nA,nB)
....
nColCount := oBrw1:nColCount()

? "a,b=(",nA,nB,")", "nColCount=", nColCount

Получаю:
 
a,b=( 1 18 ) nColCount= 18
a,b=( 1 2 ) nColCount= 18
a,b=( 1 3 ) nColCount= 18
a,b=( 1 4 ) nColCount= 18
a,b=( 1 5 ) nColCount= 18
a,b=( 1 6 ) nColCount= 18
a,b=( 1 7 ) nColCount= 18
a,b=( 1 8 ) nColCount= 18
a,b=( 1 9 ) nColCount= 18
a,b=( 1 10 ) nColCount= 18
a,b=( 1 11 ) nColCount= 18
a,b=( 1 11 ) nColCount= 11
a,b=( 1 1 ) nColCount= 11
a,b=( 1 2 ) nColCount= 11
a,b=( 1 3 ) nColCount= 11
a,b=( 1 4 ) nColCount= 11
a,b=( 1 5 ) nColCount= 11
a,b=( 1 6 ) nColCount= 11
a,b=( 1 7 ) nColCount= 11
a,b=( 1 8 ) nColCount= 11
a,b=( 1 9 ) nColCount= 11
a,b=( 1 10 ) nColCount= 11

У меня таблица из 11 колонок. Откуда берётся 18 ?



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




Пост N: 1694
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.01.18 19:16. Заголовок: Andrey пишет nColCou..


Andrey пишет
 цитата:
nColCount := oBrw1:nColCount()
У меня таблица из 11 колонок. Откуда берётся 18 ?


метод простой
METHOD nColCount() INLINE Len( ::aColumns )


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




Пост N: 5682
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.01.18 19:50. Заголовок: SergKis пишет: мето..


SergKis пишет:

 цитата:
метод простой
METHOD nColCount() INLINE Len( ::aColumns )


А почему он сначала выдает 18 ?
У меня 11 колонок в таблице.

Кажется, я понял почему у меня 18 столбцов сначала выдаёт !
Я же таблицу пере создаю на основе готовой:
oBrw1:DeleteRow( .T. )       // Delete All 
oBrw1:aArray:={} // очистить массив

Первоначально таблица была из 18 столбцов.
Т.е. этот параметр нужно тоже где-то переопределять в исходниках h_tbrowse.prg
Григорий посмотри пожалуйста, где его нужно переопределить до выхода новой версии !


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




Пост N: 1695
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.01.18 22:05. Заголовок: Andrey :Reset()..


Andrey
:Reset()

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




Пост N: 5683
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.01.18 22:29. Заголовок: SergKis пишет: :Res..


SergKis пишет:

 цитата:
:Reset()


Делаю. Не срабатывает !

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




Пост N: 1156
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.01.18 23:21. Заголовок: Andrey пишет: Я же ..


Andrey пишет:

 цитата:
Я же таблицу пере создаю на основе готовой:
oBrw1:DeleteRow( .T. ) // Delete All
oBrw1:aArray:={} // очистить массив



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

в следующий раз так переопределишь таблицу по DBF и будешь удивляться кто тебе базу грохнул

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




Пост N: 1157
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.01.18 00:04. Заголовок: Чуть дополню Andre..


Чуть дополню

Andrey пишет:

 цитата:
oBrw1:DeleteRow( .T. ) // Delete All
oBrw1:aArray:={} // очистить массив



ну во первых ::DeleteRow(.T.) для бровса по массиву сам делает ::aArray := {} т.е. вторая строка бессмысленна.
во вторых ::DeleteRow(.T.) при бровсе по массиву проверяет длину этого массива и если она нулевая восстанавливает пустую строку ::aArray := { AClone( ::aDefValue ) } ( это чтоб не было ошибки времени исполнения при доступе к массиву по индексу ).

всякие ::aArray := {} как недокументированные инструменты бровса желательно использовать когда есть понимание как это работает, для остальных есть только методы класса. К слову сказать ::DelColumn() и тот не трогает ::aArray, так как считает это источником данных ( иначе при бровсе по базе надо было бы в базе удалять поле ... ).
ну и ради чего я это написал , ради следующего предложения
Перед использованием любого метода желательно влезть в исходники и посмотреть что этот метод делает , а перед использованием недокументированных возможностей в исходники лезть обязательно. Тем более, что скорее всего какая то часть кода выльется в пример для новичков. Новичкам будет крайне неприята потеря данных из-за копирования стиля из примера.

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




Пост N: 5684
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.01.18 01:16. Заголовок: Haz пишет: ну во пе..


Haz пишет:

 цитата:
ну во первых ::DeleteRow(.T.) для бровса по массиву сам делает ::aArray := {} т.е. вторая строка бессмысленна.


Не согласен с этим. Сам налетел на эти грабли. Если делаешь перечитку массива без удаления/создания нового, таблица добавляется, т.е. старые элементы остаются.
Григорий предложил oBrw1:aArray:={} // очистить массив
и добавление прекратилось.
Если не веришь, то могу пример сделать и показать как это происходит.

Haz пишет:

 цитата:
во вторых ::DeleteRow(.T.) при бровсе по массиву проверяет длину этого массива и если она нулевая восстанавливает пустую строку ::aArray := { AClone( ::aDefValue ) } ( это чтоб не было ошибки времени исполнения при доступе к массиву по индексу ).


Да это есть такое. Все пытался убрать это при перечитывании массива. В исходнике увидел и понял, что первую строчку не удалить.

А всё таки после перечитки массива, oBrw:nColCount() на первом шаге возвращает 18 колонок (из старого массива), а потом нормально показывает 11. Вот листинг:
   // ---- cтавим по всем колонкам ----( oCol:nClrBack = oBrw:SetColor( {2} ...) ---- 
AEval(oBrw1:aColumns, {|oCol| oCol:nClrBack := { |nr,nc,ob| MyColorTsb(nr,nc,ob) } } )

////////////////////////////////////////////////////////////
STATIC FUNCTION MyColorTsb( nAt, nCol, oBrw)
LOCAL nColor, nColCount := oBrw:nColCount()

? nAt, nCol,"nColCount=",nColCount

---------------------------------------
1 18 nColCount= 18
1 2 nColCount= 18
1 3 nColCount= 18
1 4 nColCount= 18
1 5 nColCount= 18
1 6 nColCount= 18
1 7 nColCount= 18
1 8 nColCount= 18
1 9 nColCount= 18
1 10 nColCount= 18
1 11 nColCount= 18
1 11 nColCount= 11
1 1 nColCount= 11
1 2 nColCount= 11
1 3 nColCount= 11
1 4 nColCount= 11




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




Пост N: 1158
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.01.18 02:01. Заголовок: Andrey пишет: Если ..


Andrey пишет:

 цитата:
Если не веришь, то могу пример сделать и показать как это происходит


Я тебе верю. Но в исходнике метода написано ::aArray := {} при ::DeleteRow(.T.)
и исходникам я тоже верю. Так же верю что в случае с DBF ::DeleteRow() вызывает dbDelete() со всеми вытекающими.
По этому, для переопределения бровса этот метод слишком рискован, надо понимать что он делает.
Сам подход в снаряду не верен. Как ранее писал Сергей, самое простое это релизннуть бровс и создать новый. Но раз легкие пути не для нас, то начинать надо с изучения что делает с бровсом :: SetArray (), как устанавливаются при этом внутренние переменные, как назначаются ::nLen, ::aColumns, ::aDefValues. В случае с DBF ::cAlias, ::bLogicPos и ещё куча всего. Только после этого все корректно переопределять. Рубить сразу ::aArray := {}, а остальное само рассосётся это костыли, которые всегда ломаются в самый нужный момент. Это и есть причина твоих 18.
По параметрам в MyColorTsb() вижу что ты изучил таки тему и понял что их в nClrBack должно быть три и разобраться какие.
Значит не зря. Шахматку мог бы и не постить, понимая что за параметры ждёт блок, задача уже решена.
Если хочешь сделать действительно стоящий пример, то избавься от костылей.
К сожалению с телефона я тебе помочь не могу. После праздников выйду на работу, гляну на компе. Но уверен ты и сам справишся

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




Пост N: 5685
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.01.18 02:13. Заголовок: Haz пишет: По парам..


Haz пишет:

 цитата:
По параметрам в MyColorTsb() вижу что ты изучил таки тему и понял что их в nClrBack должно быть три и разобраться какие.
Значит не зря. Шахматку мог бы и не постить


Параметры понял, не понял почему nColCount := oBrw:nColCount() , а дальше пошла у меня фигня от этого...
Шахматку, сознаюсь не одолел - Сергей помог. Я там такой алгоритм фиговый писал, а обошлось всего 2 доп.IF

Haz пишет:

 цитата:
самое простое это релизннуть бровс и создать новый.


Да это я понял. Но пример насчёт этого всё равно сделаю, уже придумал какой.


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




Пост N: 1159
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 08.01.18 15:16. Заголовок: Andrey пишет: е пон..


Andrey пишет:

 цитата:
е понял почему nColCount := oBrw:nColCount() , а дальше пошла у меня фигня


Затрахался на смарте пример набирать. Не проверял разумеется. Взял за основу тест Григория.
В примере тупо подмена массива в бровсе. При простом переприсвоении ::aArray был бы вылет по типам данных. Здесь надеюсь все работает.
 

#include "minigui.ch"
#include "tsbrowse.ch"

Procedure Main ()

Public oBrw1
Public aDatos_origen

DEFINE WINDOW Form1 ;
AT 0,0 ;
WIDTH 640 ;
HEIGHT 480 ;
TITLE "TsBrowse Array Test" ;
MAIN ;
FONT 'Tahoma' SIZE 9;
ON INIT Sample1()
END WINDOW

ACTIVATE WINDOW Form1

RETURN

*--------------------------------------------------------------

Function Sample1()

Local bColor := { || If( Val(oBrw1:aArray[oBrw1:nAt,4]) < 200, CLR_RED, CLR_WHITE ) }
Local aNew := {}
Local lNew := .T.

aDatos_origen := {}

AADD( aDatos_origen, {"Ena ", "Art01", "Mod01", "200"} )
AADD( aDatos_origen, {"Dyo ", "Art02", "Mod01", "200"} )
AADD( aDatos_origen, {"Tria ", "Art03", "Mod01", "200"} )
AADD( aDatos_origen, {"Tessera ", "Art04", "Mod01", "200"} )
AADD( aDatos_origen, {"Pente ", "Art05", "Mod01", "200"} )
AADD( aDatos_origen, {"Exi ", "Art06", "Mod01", "200"} )
AADD( aDatos_origen, {"Epta ", "Art07", "Mod01", "200"} )
AADD( aDatos_origen, {"Okto ", "Art08", "Mod01", "200"} )
AADD( aDatos_origen, {"Ennea ", "Art09", "Mod01", "100"} )
AADD( aDatos_origen, {"Deka ", "Art10", "Mod02", "200"} )
AADD( aDatos_origen, {"Enteka ", "Art11", "Mod02", "200"} )
AADD( aDatos_origen, {"Dodeka ", "Art12", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekatria ", "Art13", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekatessera ", "Art14", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekapente ", "Art15", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekaexi ", "Art16", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekaepta ", "Art17", "Mod02", "200"} )
AADD( aDatos_origen, {"Dekaokto ", "Art18", "Mod02", "200"} )


AADD( aNew, {"A1", "B1", .T., "D1", 1 , date() } )
AADD( aNew, {"A2", "B2", .F., "D2", 2 , date() } )
AADD( aNew, {"A3", "B3", .F., "D3", 3 , date() } )
AADD( aNew, {"A4", "B4", .T., "D4", 4 , date() } )
AADD( aNew, {"A5", "B5", .F., "D5", 5 , date() } )
AADD( aNew, {"A6", "B6", .T., "D6", 6 , date() } )
AADD( aNew, {"A7", "B7", .F., "D7", 7 , date() } )
AADD( aNew, {"A8", "B8", .T., "D8", 8 , date() } )

DEFINE TBROWSE oBrw1 ;
AT 60,10 ;
OF Form1 ;
WIDTH 530 ;
HEIGHT 340 ;
FONT "Verdana" ;
SIZE 9 ;
GRID

oBrw1:SetArray( aDatos_origen )

ADD COLUMN TO TBROWSE oBrw1 ;
DATA ARRAY ELEMENT 1;
TITLE "Rubro" SIZE 120

ADD COLUMN TO TBROWSE oBrw1 ;
DATA ARRAY ELEMENT 2;
TITLE "Articulo" SIZE 80

ADD COLUMN TO TBROWSE oBrw1 ;
DATA ARRAY ELEMENT 3;
TITLE "Marca" SIZE 80

ADD COLUMN TO TBROWSE oBrw1 ;
DATA ARRAY ELEMENT 4;
TITLE "M" SIZE 30 ;
COLORS CLR_BLACK, bColor

oBrw1:lNoVScroll := .t.

End TBROWSE

oBrw1:Refresh(.T.)

@ 10,455 BUTTON Button_1 OF Form1;
CAPTION "Change";
ACTION { || Change( IF( lNew, aNew, aDatos_origen ), lNew := !lNew ) };
WIDTH 80;
HEIGHT 28 ;
FONT "Arial" SIZE 9


RETURN Nil


Function Change( aArray )
local aHead := {}
local aSize := {}

AEVAL( oBrw1:aColumns, {|oCol, x| AADD( aSize, oBrw1:aColSizes[x] ), AADD( aHead, oCol:cHeading ) } )



oBrw1:aColumns := {}
oBrw1:aArray := {}
if Len(aHead) < Len(aArray[1])
while Len(aHead) < Len(aArray[1]);aadd( aHead, "");end
else
while Len(aHead) > Len(aArray[1]); hb_ADel( aHead, len(aHead), .T.);end
end

oBrw1:SetArray( aArray, .T., aHead, aSize )
oBrw1:Reset()

Return Nil



Такой же фокус можно делать с подменой рабочей области используя ::SetDbf()

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




Пост N: 5686
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.01.18 22:22. Заголовок: Haz СПАСИБО ! :sm36..


Haz СПАСИБО !
Я глянул пример, пытался подключить свою ситуацию, не получилось.
Не так ты делаешь, в смысле ты правильно делаешь, а мой подход к снаряду отличается от твоего.
Буду свой пример делать, только не просто так, а жизненный, по работе. Доделаю только ещё другой и займусь.


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




Пост N: 5693
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.01.18 16:00. Заголовок: В SetArrayTo() делаю..


В SetArrayTo() делаю экспорт в Excel через &oBrw:Excel2(...)
Символьные поля в Экселе появляются нормально, а цифирь нет. Как так ?
Или что-то с форматом цифр не то ?

Блин... Опять те же Нашёл свой комментарий в MiniGUI\SAMPLES\Advanced\Tsb_config2
       //IF aPole[nI,6] <> "N"  // не использовать шаблон для числовых полей, т.к. 
// при печати в Excel поле будет пустое !!!
// oBrw:aColumns[nJ]:cPicture := aPole[nI,4] // шаблон колонки
//ENDIF

И как тогда делать ?


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




Пост N: 1160
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.01.18 13:10. Заголовок: Andrey пишет: И как..


Andrey пишет:

 цитата:
И как тогда делать


Не пользоваться :Excel2()
Метод хоть и интересный по скорости, но на деле на короткой выгрузке теряет все преимущества.
Как альтернатива можно использовать как минимум 5 способoв
1. Это просто OLE. Из минусов только скорость выгрузки.
Остальные способы соизмеримы по скорости с :Excel2()
2. Тот же OLE с использованием вариантного массива
3. Выгружать через ADO
4. Писать сразу в xml формат ( Excel его прекрасно понимает)
5. Испльзовать специальную библиотеку ( есть здесь на форуме ссылка)



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




Пост N: 5694
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.01.18 13:33. Заголовок: Спасибо Haz ! :sm36..


Спасибо Haz !

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




Пост N: 5695
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.01.18 13:42. Заголовок: Пока обошёлся так (е..


Пока обошёлся так (если кому интересно):
При построении массива для SetArrayTo()
 
FOR nI := 1 To oBrw:nColCount()
....
IF ValType(Eval(oBrw:aColumns[ nI ]:bData)) == "N"
oBrw:aColumns[ nI ]:cDataType := 'N' // не использовать шаблон для числовых полей,
oBrw:aColumns[ nI ]:cPicture := '' // т.к. при экспорте в Excel поле будет пустое !!!
ELSE
oBrw:aColumns[ nI ]:cPicture := aPict[ nI ]
ENDIF
....

Работает отлично !

Блин, а нельзя из Fivewin тиснуть экспорт в Эксель и прикрутить к МиниГуи ?

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




Пост N: 1706
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.01.18 13:50. Заголовок: Haz пишет Не пользов..


Haz пишет
 цитата:
Не пользоваться :Excel2()


Если метод есть, надо что бы работал или убирать.
Предложение, что бы работал Excel2 такие (в моей версии работает)
 
METHOD Excel2( cFile, lActivate, hProgress, cTitle, lSave, bPrintRow ) CLASS TSBrowse
...
nOldCol := ::nCell
Local nCntCols := ::nColCount(), oCol, ;
aFntLine := array(nCntCols), ;
aFntHead := array(nCntCols), ;
aFntFoot := array(nCntCols)

Default nInstance := 0
...
CursorWait()

For i := 1 To nCntCols
oCol := ::aColumns[ i ]
aFntLine[ i ] := oCol:hFont
aFntHead[ i ] := oCol:hFontHead
aFntFoot[ i ] := oCol:hFontFoot
If HB_ISBLOCK(oCol:hFont)
oCol:hFont := hFont
EndIf
If HB_ISBLOCK(oCol:hFontHead)
oCol:hFontHead := hFont
EndIf
If HB_ISBLOCK(oCol:hFontFoot)
oCol:hFontFoot := hFont
EndIf
Next

::lNoPaint := .F.
...

hFont := ::aColumns[ nCol ]:hFontHead

If hFont != Nil
aFontTmp := GetFontParam( hFont )
IF AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ;
e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ;
e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } ) == 0

AAdd( aFont, aFontTmp )
endif

EndIf

hFont := ::aColumns[ nCol ]:hFontFoot

If hFont != Nil
aFontTmp := GetFontParam(hFont)
IF AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ;
e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ;
e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } ) == 0

AAdd( aFont, aFontTmp )
endif

EndIf

Next

If Len( aFont ) > 4
ASize( aFont, 4 )
EndIf
...
For nRow := 1 To ( ::nLen )
...
For nCol := 1 To Len( ::aColumns )

uData := If( ValType( ::aColumns[ nCol ]:cHeading ) == "B", ;
Eval( ::aColumns[ nCol ]:cHeading, nCol, Self ), ;
::aColumns[ nCol ]:cHeading )

If ValType( uData ) != "C"
Loop
EndIf
...
Next

If ::lDrawFooters

For nCol := 1 To Len( ::aColumns )

uData := If( ValType( ::aColumns[ nCol ]:cFooting ) == "B", ;
Eval( ::aColumns[ nCol ]:cFooting, nCol, Self ), ;
::aColumns[ nCol ]:cFooting )

If ValType( uData ) != "C"
uData := " "
EndIf

uData := Trim( StrTran( uData, CRLF, Chr( 10 ) ) )
nAlign := Min( LoWord( ::aColumns[ nCol ]:nFAlign ), 2 )
nAlign := If( Chr( 10 ) $ uData, 4, nAlign )
hFont := ::aColumns[ nCol ]:hFontFoot
aFontTmp := GetFontParam( hFont )
nFont := AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ;
e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ;
e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } )

FWrite( nHandle, BiffRec( 4, uData, nLine - 1, nCol - 1, .T., nAlign + 1,, ;
Max( 0, nFont - 1 ) ) )

If hProgress != Nil

If nCount % nEvery == 0
SendMessage(hProgress, PBM_SETPOS, nCount, 0)
EndIf

nCount ++

EndIf

Next

++nLine

EndIf

FWrite( nHandle, BiffRec( 10 ) )
FClose( nHandle )

For i := 1 To nCntCols
oCol := ::aColumns[ i ]
oCol:hFont := aFntLine [ i ]
oCol:hFontHead := aFntHead [ i ]
oCol:hFontFoot := aFntFoot [ i ]
Next

If hProgress != Nil
SendMessage(hProgress, PBM_SETPOS, nTotal, 0)
EndIf
...


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




Пост N: 1161
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.01.18 13:59. Заголовок: SergKis пишет: мето..


SergKis пишет:

 цитата:
метод есть, надо что бы работал


Сергей, метод работает. Я о том что просто не пользуюсь им.
т. к бровс у меня всегда по базе, то выгружаю из базы а не из бровс объекта.
Для прямой выгрузки идеально подходит ADO, и быстро и с названием колонок русскими словами.
Для отчёта в Excel Оля с вариантным массивам и быстро и красоту навести можно.

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




Пост N: 5696
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.01.18 14:17. Заголовок: Haz пишет: Для отчё..


Haz пишет:

 цитата:
Для отчёта в Excel Оля с вариантным массивам и быстро и красоту навести можно.



Что то я сомневаюсь что быстро написать можно...
Быстро не у всех получается.

Может класс такой в исходники добавить можно ?
Это было бы хорошее подспорье для всех.
Как правило отчёты бывают небольшие через SetArrayTo(), Оля с ними быстро справиться.

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




Пост N: 5697
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.01.18 14:19. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предложение, что бы работал Excel2 такие (в моей версии работает)


Я за добавление этого в исходники !
Григорий, посмотри это пожалуйста.

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