On-line: Haz, гостей 2. Всего: 3 [подробнее..]
АвторСообщение
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: 5866
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.07.16 09:41. Заголовок: Порча с бровсом , эт..


Порча с бровсом , это из примера SAMPLES\Advanced\Tsb_seek_2\
Едем вниз или колесом или стрелкой вниз и бац записи стали дублироваться.
Тоже самое происходит и у меня в программе на компе заказчика (у меня норм)
В примере правда происходит расчет HOLE и дальнейшие действия , у меня
в коде ни чего подобного нет.
Куда копать ?


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




Пост N: 5867
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.07.16 10:28. Заголовок: Видео заказчика http..


Видео заказчика
http://files.icq.net/get/8uYhqlxRMUWAVpabMnphKX5785d4af1ad
Его лучше скачать так как в ONLINE показывает его перевернутым.

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




Пост N: 962
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.07.16 10:28. Заголовок: Dima пишет: Куда ко..


Dima пишет:

 цитата:
Куда копать ?


Это лечится в примере добавлением всего одной строки в функцию TBrw_Show()
*----------------------------------- 
Function TBrw_Show( oBrw, nDelta )
*-----------------------------------

_EndTBrowse()

If hb_IsObject(oBrw)
TBrw_NoHoles( oBrw, nDelta )
oBrw:nHeightHead -= 1
EndIf
Идея лечения состоит в том, чтобы уйти от точного соответствия высоты строк в гриде и общей высоты TBrowse

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




Пост N: 5868
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.07.16 10:30. Заголовок: Да в примере это ест..


Да в примере это есть НО в нем тоже ломается я же выложил скрин.
Упс строки то я и не заметил ))

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




Пост N: 176
Зарегистрирован: 15.09.05
ссылка на сообщение  Отправлено: 09.08.16 23:09. Заголовок: Привет всем , я тоже пытаюсь разобратся с TSBROWS ом


Привет всем !
Я тоже пытаюсь разобратся с TSBROWS-ом

у меня возникла следучщая проблема :

имеется столбец

ADD COLUMN TO BROWSE_1;
HEADER "Код" ;
SIZE 80 ;
DATA aFld[1] ;
ALIGN DT_LEFT, nMakeLong( DT_CENTER, DT_CENTER ) ;
3DLOOK FALSE, TRUE, TRUE ;
EDITABLE //MOVE DT_MOVE_RIGHT

BROWSE_1:aColumns[ 1 ]:bHLClicked := {||artikuli->(dbseek(prihod->kod)),artikuli( .f. )}
BROWSE_1:aColumns[ 1 ]:cToolTip := "Кликнете върху хедера за да редактирате номенклатура АРТИКУЛИ."
BROWSE_1:aColumns[ 1 ]:bValid:= { | uVar | FindArt( uVar ) } ;

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

А КАК НОВЫЙ КОД ОБРАТНО В ЯЧЕЙКУ ЗАПЕХНУТЬ НИКАК НЕ СООБРАЖУ





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




Пост N: 1037
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.08.16 23:43. Заголовок: sashaBG пишет: А КА..


sashaBG пишет:

 цитата:
А КАК НОВЫЙ КОД ОБРАТНО В ЯЧЕЙКУ ЗАПЕХНУТЬ НИКАК НЕ СООБРАЖУ



не совсем понятно применение :bValid , это блок который разрешает или нет GET объекту покинуть редактирование , если Т то редактирование завершается , если F то не выпускает. То есть что бы закончить редактирование нужно по любому вернуть T
В TsBrowse есть еще блоки завязанные на редакцию, это bPostEdit , bEditEnd которые выполняются после редактирования и в них можно делать проверки.
Присвоить значение в ячейку можно прямым присвоением oBrw:aArray[oBrw:nAt][ 1 ] := Kod // для колонки 1 или выполнив блок выборки/записи Eval( oBrw:aColumns[1]:bData, Kod ), в результате чего значение Kod будет записано в ячейку . останется только перерисовать строку для отображения нового значения . Перерисовку делает или :Refresh( F ) или :DrawSelect() - этот предпочтительнее

PS соответственно прочитать значение ячейки можно как Kod := oBrw:aArray[oBrw:nAt][ 1 ] или Kod := Eval( oBrw:aColumns[1]:bData)
мне кажется это проще чем пытаться управлять буфером Get объекта через Valid





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




Пост N: 177
Зарегистрирован: 15.09.05
ссылка на сообщение  Отправлено: 10.08.16 15:12. Заголовок: Да Вы правы


Да Вы правы .
Я сделел то що хотел через bPostEdit

А вот интересно при bValid Вы говорите що не должно выпускать из контрола , на самом деле ПИКАЕТ и выходит из редактирования не меняя ячейку.



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




Пост N: 1039
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.08.16 20:21. Заголовок: sashaBG пишет: на ..


sashaBG пишет:

 цитата:
на самом деле ПИКАЕТ и выходит из редактирования не меняя ячейку.



Да, так и есть. Если я не ошибаюсь в Clipper Valid не выпускал из редактирования пока не вернет T, думал так же и в TS

Посмотрел исходники TS, в них Vald обрабатывается в методе bPostEdit т.е. после редактирования. Видимо это особенность которую автор заложил в метод :Edit()
По мне как это ошибка логики, будет время попробую предложить исправление. Сейчас ушел совершенно в другой процесс, и хобби в виде программирования пока пришлось отложить


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




Пост N: 1158
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.08.16 21:59. Заголовок: Haz пишет По мне как..


Haz пишет
 цитата:
По мне как это ошибка логики, будет время попробую предложить исправление


Возможно ошибки логики нет:
1. можно сделать postmessage на enter при valid .F., .т.е. вкл. edit
2. можно подвесить (организовать сообщение), как в примере BASIC\COM_2, используя ф-ю ShowGetValid( hWnd, cTxt, 'Information', 'I' ),
после закрытия поля edit после валид, положив в ячейку (visible .t.) узкий GetBox (контол cNam) и ... как в примере
SetProperty(ThisWindow.Name, cNam, 'Visible', .T.)
DoMethod(ThisWindow.Name, cNam, 'SetFocus')
InkeyGui(10) // otherwise it does not have time to respond
ShowGetValid( hWnd, cTxt, 'Information', 'I' )
InkeyGui(3000) // 3 sec.
SetProperty(ThisWindow.Name, cNam, 'Visible', .F.)
3. потом п. 1


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




Пост N: 1040
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.08.16 22:38. Заголовок: SergKis пишет: Возм..


SergKis пишет:

 цитата:
Возможно ошибки логики нет:
1. можно сделать


Сергей, то что ты предлагаешь и есть "выпрямление" логики
Ведь что говорил букварь по clipper -
If the VALID clause is specified and <lValid> evaluates to it logical true (.T.)  
condition the current GET will be considered valid and the get operation will continue
onto the next active GET object. If not, the cursor will remain on this GET object until
aborted or until the condition in <lValid> evaluates to true (.T.).

То есть в "классике" не завершать GET при lValid == .F. было "из коробки" и не нужно было ничего доделывать.


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




Пост N: 1159
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.08.16 23:24. Заголовок: Haz пишет То есть в ..


Haz пишет
 цитата:
То есть в "классике" не завершать GET при lValid == .F. было "из коробки" и не нужно было ничего доделывать


При клацаньи мышой где хочу "классик" уходит на 2-ой план.
Как при замороженом GET validом (.F.), переключить курсор на "нужную" ячейку , не записав введенные данные ("неправильные") в поле ?
Потому и говорю, что "возможно ..."

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




Пост N: 1041
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.08.16 23:29. Заголовок: SergKis пишет: Пото..


SergKis пишет:

 цитата:
Потому и говорю, что "возможно ..."


Мысль понял , логично но "осадочек остался"

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




Пост N: 5070
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.09.16 23:00. Заголовок: Использую стандартну..


Использую стандартную функцию загрузки настроек \MiniGUI\SOURCE\TsBrowse\h_tbrowse.prg
LoadFields( "oBrw1", cForm, .T.) // все поля редактируемые

Поля типа: "+", "=", "^", "@" - неправильно отображаются в TBROWSE, да и в добавок редактировать разрешены.

Можно там подправить в исходнике эту функцию ?


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




Пост N: 1199
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.09.16 09:46. Заголовок: Andrey пишет: Можно ..


Andrey пишет:
 цитата:
Можно там подправить в исходнике эту функцию ?


1. Отображение идет блоком кода, через стандартный FieldWBlock(cFiled, nWorkArea), Что тут менять ?
2. Ты сам ставишь все поля редактируемые .T. или нет .F.
3. Есть расчет ширины колонки, если не задано, но как правило (для красоты) ставишь под себя (свое понимание красоты)
Выход - взять метод
METHOD LoadFields( lEditable ) CLASS TSBrowse
преобразовать в функцию, подправить под свое понимание ситуации и предложть в использование, если будент хорошо,
можно поправить старый или сделать новый метод LoadField2(...) в TsBrowse

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




Пост N: 1046
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.09.16 10:10. Заголовок: Andrey пишет: подп..


Andrey пишет:

 цитата:
подправить


подправить надо не в исходнике. Задай нужным полям соответствующий шаблон вывода и запрети редактирование.
Делов то на один выэов aEval.
Если идти дорогой правки исходников, то под все RDD.
Я к примеру на ADS сижу, там расширенных типов полей куча, и что тоже все туда пихать?
И кому этот мусор в исходниках нужен будет ?

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




Пост N: 5072
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 02.09.16 12:31. Заголовок: Принял к сведению ва..


Принял к сведению ваши предложения. Спасибо !

Haz пишет:

 цитата:
Делов то на один выэов aEval.



Если нетрудно, дай пожалуйста как это сделать.

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




Пост N: 5989
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 02.09.16 12:58. Заголовок: Andrey Пройдись по ..


Andrey
Пройдись по массиву полей (или как там у тебя устроено) и в зависимости от типа поля присвой свой :cPicture ,
возможно придется поиграться и с :bdata

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




Пост N: 1047
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.09.16 10:39. Заголовок: Andrey пишет: Если ..


Andrey пишет:

 цитата:
Если нетрудно, дай пожалуйста как это сделать.


для запрета редактирования к примеру
aEval( oBrw:aColumns, {|oCol| If( oCol:cDataType == чему_надо, oCol:lEdit := .F., NIL } )

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




Пост N: 5074
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.16 15:02. Заголовок: Haz пишет: для запр..


Haz пишет:

 цитата:
для запрета редактирования к примеру



Не работает...
LoadFields( "oBrw1", cForm, .T.) // все поля редактируемые

// запрет редактирования полей типа: "+", "=", "^"
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "+", oCol:lEdit := .F., NIL) } )
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "=", oCol:lEdit := .F., NIL) } )
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "^", oCol:lEdit := .F., NIL) } )

// формат вывода полей типа: "+", "=", "@"
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "+", oCol:cPicture := REPL("9",10), NIL) } )
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "=", oCol:cPicture := REPL("x",20), NIL) } )
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "@", oCol:cPicture := REPL("x",20), NIL) } )



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




Пост N: 5992
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.16 15:17. Заголовок: Andrey пишет: oCol:..


Andrey пишет:

 цитата:
oCol:cDataType == "+"


Уверен что cDataType возвращается тот что надо ?

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




Пост N: 5076
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.16 15:41. Заголовок: Dima пишет: Уверен ..


Dima пишет:

 цитата:
Уверен что cDataType возвращается тот что надо ?


Даже не задумывался...
Блин опять исходники Tsbrowse не то возвращают...
Или не они виноваты ?

Точно, проверил не работает, вернее возвращает U oBrw1:aColumns[nJ]:cDataType -> "U"


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




Пост N: 5993
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.16 16:15. Заголовок: Из сырца ::cDataType..


Из сырца ::cDataType = ValType( Eval( ::bData ) ) , может наведет на какие мысли

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




Пост N: 5077
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.16 16:26. Заголовок: Да какие тут мысли....


Да какие тут мысли... Править надо исходник бровса и всё тут !

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




Пост N: 5994
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.16 16:43. Заголовок: Andrey пишет: Да к..


Andrey пишет:

 цитата:

Да какие тут мысли... Править надо исходник бровса и всё тут !


Ну вообще то нет
Считывать и проверять нужно не тип а ФЛАГ (тип поля).
Примерно так
? dbFieldInfo( DBS_TYPE, FieldPos( "t" ) )
? dbFieldInfo( DBS_TYPE, FieldPos( "t2" ) )

ЗЫ
По ходу Петр разжевал для тебя этот вопрос в теме , Новые типы переменных , но ты снова фСё забыл


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




Пост N: 1204
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.16 16:51. Заголовок: Dima пишет Уверен чт..


Dima пишет
 цитата:
Уверен что cDataType возвращается тот что надо ?


Вот формирование cDataType
::cDataType = ValType( Eval( ::bData ) )
Привязываться надо к именам колонок
aEval( oBrw:aColumns, {|oCol| oCol:lEdit := ! ','+oCol:cName+ ',' $ ",ID,DTM,DTM2," } )



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




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


SergKis пишет:

 цитата:
Привязываться надо к именам колонок
aEval( oBrw:aColumns, {|oCol| oCol:lEdit := ! ','+oCol:cName+ ',' $ ",ID,DTM,DTM2," } )


Не согласен. Берём чужую базу и тупо её открываем. Я откуда знаю какие имена колонок типа: "+", "=", "^", "@" ?


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




Пост N: 1205
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.16 17:13. Заголовок: Andrey пишет Не согл..


Andrey пишет
 цитата:
Не согласен.


повторяю
 цитата:
Выход - взять метод
METHOD LoadFields( lEditable ) CLASS TSBrowse
преобразовать в функцию, подправить под свое понимание ситуации и предложть в использование, если будет хорошо,
можно поправить старый или сделать новый метод LoadField2(...) в TsBrowse



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




Пост N: 1206
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.16 17:17. Заголовок: PS У себя так и сдел..


PS
У себя так и сделал, по аналогии с ::SetArrayTo(...), написал ::SetFieldTo(...)

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




Пост N: 1207
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.16 17:33. Заголовок: Andrey пишет Берём ..


Andrey пишет
 цитата:
Берём чужую базу и тупо её открываем. Я откуда знаю какие имена колонок типа: "+", "=", "^","@


Для этого надо исп. утилиту DbEdit
TsBrowse предполагает программируемую работу над таблицей. А следить за всеми новыми полями и как их обрабатывать, не уверен что надо, к примеру поле @ - TimeStamp корректировать можно, его, вроде самому заполнять надо (често подзабыл уже)

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




Пост N: 5079
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.16 18:25. Заголовок: SergKis пишет: @ - ..


SergKis пишет:

 цитата:
@ - TimeStamp корректировать можно, его, вроде самому заполнять надо (често подзабыл уже)



Да, это поле нормально редактируется. Из-за этого и не включил его в запрет редактирования.

SergKis пишет:

 цитата:
Выход - взять метод
METHOD LoadFields( lEditable ) CLASS TSBrowse
преобразовать в функцию, подправить под свое понимание ситуации и предложть в использование, если будет хорошо,
можно поправить старый или сделать новый метод LoadField2(...) в TsBrowse



Ну не согласен с этим.
Есть нормальная функция, которая сделана для Харбора !!! Это же типы уже есть в Харборе.
Чуток отредактировать и будет служить 100 лет ещё...


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




Пост N: 5995
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.09.16 19:07. Заголовок: Andrey если по всей..


Andrey
если по всей базе то вполне сработает такой код
дарю

 
#include "dbstruct.ch"
.....
Local Hfldtype:=hb_hash("=",nil,"+",nil,"^",nil)



for i := 1 To oBrw:nColCount()
if hb_hhaskey(Hfldtype,dbFieldInfo( DBS_TYPE, i ))
oBrw:aColumns[ i ]:lEdit := FALSE
endif
next



Или можно в AEVAL все сделать

PS
Не проверял :)


Andrey пишет:

 цитата:
// запрет редактирования полей типа: "+", "=", "^"
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "+", oCol:lEdit := .F., NIL) } )
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "=", oCol:lEdit := .F., NIL) } )
aEval( oBrw1:aColumns, {|oCol| If( oCol:cDataType == "^", oCol:lEdit := .F., NIL) } )


Это по ходу бредосный подход :) Все надо делать за один подход в одном AEVAL , потому как
следующий AEVAL похерит результат предыдущего

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




Пост N: 5080
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.16 20:22. Заголовок: Dima пишет: дарю ..


Dima пишет:

 цитата:
дарю


Спасибо !
Хотел без цикла обойтись, но наверное лучше с ним.

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




Пост N: 1208
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.16 20:47. Заголовок: Andrey пишет Ну не с..


Andrey пишет
 цитата:
Ну не согласен с этим.


Взял бы текст h_tbrowse.prg и просканировал на cDataType, думаю многие вопросы отпали.
В основе лежит bData отображения, как задал, так и будет работать.
Если надо тебе спец. обработки, надо писать и спец. блок, т.е. TimeStamp превращать как надо для конкретного отображения, то же и по lEdit, ну или перелопатить весь TsBrowse.

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




Пост N: 1048
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.09.16 20:51. Заголовок: Andrey пишет: TsBro..


SergKis пишет:

 цитата:
TsBrowse предполагает программируемую работу над таблицей. А следить за всеми новыми полями и как их обрабатывать,



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

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




Пост N: 1209
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.16 20:53. Заголовок: PS Метод SetFields (..


PS
Метод SetFields (совместро с заданым\нет списком указанных полей) служит для первоначального заполнения\формирования колонок (вместо исп. ADD COLUMN ...), а дальше все ручками, меняешь bData, lEdit, Size, Color, ....

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




Пост N: 5081
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.09.16 21:06. Заголовок: SergKis пишет: а да..


SergKis пишет:

 цитата:
а дальше все ручками, меняешь bData, lEdit, Size, Color, ....


Нет в мире совершенства ...
Понял ! Спасибо !

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




Пост N: 1210
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.09.16 21:52. Заголовок: Andrey пишет Нет в м..


Andrey пишет
 цитата:
Нет в мире совершенства ...


Правильнее "Лучшее - враг хорошего"

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




Пост N: 6007
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.09.16 16:38. Заголовок: Что то я снова в вид..


Что то я снова в виду того что долго не юзал Tsbrowse , торможу.
Есть бровс и в нем стоит фильтр по полю WB , строка фильтра WB==1.
На одной из записей меняю значение WB. Эта запись из фильтра должна уйти.
Что нужно корректно сказать бровсу что бы правильно его обновить ?
Было показано скажем 5 записей и после того как я сменил на одной из них значение WB ,
осталось 4 записи.
Reset() юзать не хочется.

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




Пост N: 1052
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.09.16 20:44. Заголовок: Dima пишет: reset н..


Dima пишет:

 цитата:
reset не хочется


Дима, пишу с мобилки и поэтому коротко и по пямяти ).
Глянь код в методе ::Delete (). Последовательность должна быть такой же как после dbDelete ()
в этом методе.


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




Пост N: 6008
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.09.16 21:25. Заголовок: Haz пишет: Глянь ко..


Haz пишет:

 цитата:
Глянь код в методе ::Delete ()


Ты в смысле про DeleteRow() ?
Покопаю завтра , спасибо.

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




Пост N: 1003
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.09.16 21:54. Заголовок: Dima пишет: Что нуж..


Dima пишет:

 цитата:
Что нужно корректно сказать бровсу что бы правильно его обновить ?


См. в примере ниже использование функции myUpdate() для обновления первой колонки, которая находится под фильтром

 цитата:
/*
* MINIGUI - Harbour Win32 GUI library Demo
*
*/

#include "minigui.ch"
#include "tsbrowse.ch"
#include "Dbstruct.ch"

REQUEST DBFCDX


FUNCTION Main()

LOCAL cDbf := GetStartupFolder() + '\Test.dbf'
LOCAL i, cAlias
LOCAL oBrw_1

SET CENTURY ON
SET DELETED ON

IF ! File( cDbf )
CreateTable()
ENDIF

rddSetDefault( 'DBFCDX' )
cAlias := cFileNoExt( cDbf )

USE ( cDbf ) Alias ( cAlias ) SHARED NEW

set filter to code > 90
go top
Test->( ordSetFocus( 1 ) )

DEFINE WINDOW Form_1 ;
At 0, 0 ;
WIDTH 600 ;
HEIGHT 470 ;
TITLE 'TsBrowse sample: Order' ;
MAIN ;
NOMAXIMIZE ;
NOSIZE

END WINDOW

oBrw_1 := CreateBrowse( "oBrw_1", 'Form_1', 2, 2, Form_1.Width - 10, ;
Form_1.Height - GetTitleHeight() - iif( IsThemed(), 1, 2 ) * GetBorderHeight() - 2, cAlias )

// modify the default settings
oBrw_1:aColumns[ 1 ]:cHeading := "Number"
oBrw_1:SetColSize( 1, 94 )
oBrw_1:aColumns[ 1 ]:nAlign := DT_RIGHT
// editing is available for ALL columns
FOR i := 1 TO Test->( Fcount() ) - 1
oBrw_1:aColumns[ i ]:lEdit := TRUE
NEXT
oBrw_1:aColumns[ 1 ]:nEditMove := DT_DONT_MOVE
oBrw_1:aColumns[ 5 ]:cHeading := "Birthday"
oBrw_1:SetColSize( 5, 120 )
// hide the last column
oBrw_1:HideColumns( 6, .T. )

CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1

RETURN NIL


FUNCTION CreateBrowse( cBrw, cParent, nRow, nCol, nWidth, nHeight, cAlias )

LOCAL oBrw

DEFINE TBROWSE &cBrw ;
AT nRow, nCol ;
ALIAS cAlias ;
OF &cParent ;
WIDTH nWidth ;
HEIGHT nHeight ;
COLORS { CLR_BLACK, CLR_BLUE } ;
FONT "MS Sans Serif" ;
SIZE 9

:SetAppendMode( .F. )
:SetDeleteMode( .F. )

:lNoHScroll := .T.
:lCellBrw := .T.
:nSelWidth := 16

END TBROWSE

// loading the ALL database fields
LoadFields( cBrw, cParent )

oBrw := TBrw_Obj( cBrw, cParent )

WITH OBJECT oBrw
:nHeightCell += 2
:nHeightHead += 18
:nWheelLines := 1

:lNoChangeOrd := TRUE
:hBrush := CreateSolidBrush( 230, 240, 255 )

:SetColor( { 16 }, { RGB( 43, 149, 168 ) } ) // SyperHeader backcolor
:SetColor( { 3 }, { RGB( 255, 255, 255 ) } ) // Header font color
:SetColor( { 4 }, { {|| { RGB( 43, 149, 168 ), RGB( 0, 54, 94 ) } } } ) // Header backcolor
:SetColor( { 17 }, { RGB( 255, 255, 255 ) } ) // Font color in SyperHeader
:SetColor( { 6 }, { {|| { RGB( 255, 255, 74 ), RGB( 240, 240, 0 ) } } } ) // Cursor backcolor
:SetColor( { 12 }, { {|| { RGB( 128, 128, 128 ), RGB( 250, 250, 250 ) } } } ) // Inactive cursor backcolor
:SetColor( { 2 }, { {|| RGB( 230, 240, 255 ) } } ) // Grid backcolor
:SetColor( { 1 }, { {|| RGB( 0, 0, 0 ) } } ) // Text color in grid
:SetColor( { 5 }, { {|| RGB( 0, 0, 255 ) } } ) // Text color of cursor in grid
:SetColor( { 11 }, { {|| RGB( 0, 0, 0 ) } } ) // Text color of inactive cursor in grid

:nClrLine := COLOR_GRID

:aColumns[1]:bPostEdit := { | uVal, oBr | myUpdate(uVal, oBr) }

:ResetVScroll()
END OBJECT

RETURN oBrw

Static Function myUpdate(Val, oBrw)
local lRefresh
oBrw:nLen := ( oBrw:cAlias )->( Eval( oBrw:bLogicLen ) )

( oBrw:cAlias )->( DbSkip() )
lRefresh := ( oBrw:cAlias )->( EOF() )
( oBrw:cAlias )->( DbSkip( -1 ) )
oBrw:nRowPos -= If( lRefresh .and. ;
! ( oBrw:cAlias )->( BOF() ), 1, 0 )
oBrw:Refresh( .T. )

Return nil

Static Function TBrw_Obj( cBrw, cParent )
Local oBrw, i

If ( i := GetControlIndex( cBrw, cParent ) ) > 0
oBrw := _HMG_aControlIds [ i ]
EndIf

Return oBrw


Procedure CreateTable
Local aDbf[6][4], i

aDbf[1][ DBS_NAME ] := "Code"
aDbf[1][ DBS_TYPE ] := "Numeric"
aDbf[1][ DBS_LEN ] := 10
aDbf[1][ DBS_DEC ] := 0
//
aDbf[2][ DBS_NAME ] := "First"
aDbf[2][ DBS_TYPE ] := "Character"
aDbf[2][ DBS_LEN ] := 25
aDbf[2][ DBS_DEC ] := 0
//
aDbf[3][ DBS_NAME ] := "Last"
aDbf[3][ DBS_TYPE ] := "Character"
aDbf[3][ DBS_LEN ] := 25
aDbf[3][ DBS_DEC ] := 0
//
aDbf[4][ DBS_NAME ] := "Married"
aDbf[4][ DBS_TYPE ] := "Logical"
aDbf[4][ DBS_LEN ] := 1
aDbf[4][ DBS_DEC ] := 0
//
aDbf[5][ DBS_NAME ] := "Birth"
aDbf[5][ DBS_TYPE ] := "Date"
aDbf[5][ DBS_LEN ] := 8
aDbf[5][ DBS_DEC ] := 0
//
aDbf[6][ DBS_NAME ] := "Bio"
aDbf[6][ DBS_TYPE ] := "Memo"
aDbf[6][ DBS_LEN ] := 10
aDbf[6][ DBS_DEC ] := 0

DBCREATE("Test", aDbf, "DBFCDX")

Use test Via "DBFCDX"

For i:= 1 To 100
append blank
Replace code with i
Replace First With 'First Name '+ Ltrim(Str(i))
Replace Last With 'Last Name '+ Ltrim(Str(i))
Replace Married With ( i/2 == int(i/2) )
replace birth with date()-Max(10000, Random(20000))+Random(LastRec())
Next i

Index On field->code Tag code

Use

Return



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




Пост N: 6009
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.09.16 07:56. Заголовок: Haz gfilatov2002 Сп..


Haz
gfilatov2002
Спасибо !
Работает.

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




Пост N: 1053
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.09.16 10:17. Заголовок: Dima пишет: Спасибо..


Dima пишет:

 цитата:
Спасибо !
Работает.


Не за что
вот этот кусок из метода DeleteRow и из примера Григория все делает

 
oBrw:nLen := ( oBrw:cAlias )->( Eval( oBrw:bLogicLen ) )
( oBrw:cAlias )->( DbSkip() )
lRefresh := ( oBrw:cAlias )->( EOF() )
( oBrw:cAlias )->( DbSkip( -1 ) )
oBrw:nRowPos -= If( lRefresh .and. ;
! ( oBrw:cAlias )->( BOF() ), 1, 0 )
oBrw:Refresh( .T. )


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




Пост N: 5132
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.10.16 00:29. Заголовок: Всем привет. Делал т..


Всем привет.
Делал таблицу и полдня бился с глухим зависанием программы.
Пока не стал отключал построчно создание Tsbrowse.

Вот такой код вешает программу наглухо:
Add Super Header To oBrw1 From Column 1 To Column 1 ;
Color CLR_WHITE, { nBackForm, nHeadColor1 } ;
Title "" 3DLook BITMAP LoadImage("WMenu") HORZ DT_LEFT


Я тоже не понимал почему, а потом дошло... В ресурсы забыл добавить "WMenu" ...
Там в сами исходники поставить проверку на наличие BITMAP можно ?


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




Пост N: 1012
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.10.16 11:45. Заголовок: Andrey пишет: Там в..


Andrey пишет:

 цитата:
Там в сами исходники поставить проверку на наличие BITMAP можно ?


Да, это возможно, в таком случае будет генерироваться минигуи-ошибка, как при отсутствии формы или контрола

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




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


gfilatov2002 пишет:

 цитата:
Да, это возможно, в таком случае будет генерироваться минигуи-ошибка, как при отсутствии формы или контрола


Отлично !

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




Пост N: 5137
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.10.16 20:32. Заголовок: Всем привет ! Вывож..


Всем привет !

Вывожу пустую таблицу. Потом открываю нужную базу и пытаюсь заново показать в уже построенном Tsbrowse.
Скрытый текст

Фигня получается... Первая колонка от старой таблицы остаётся.
Цвета в таблице тоже пропадают. Курсор собранный в один - тоже пропадает.

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

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




Пост N: 1234
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.10.16 03:55. Заголовок: Andrey пишет: oBrw1:..


Andrey пишет:
 цитата:
oBrw1:cAlias := cNewAlias
oBrw1:Reset()
LoadFields( "oBrw1", cForm, .F.)... Фигня получается...


Получается все правильно, как заказывал:
- LoadFields() ставит FieldWBlock(..., Select(cAlias)), привязка к области
- cNewAlias это др. область
- вывод, открывать cNewAlias в той же области или переписать на свой вариант FieldWBlock(...),
пример FieldABlock(bBlock, cAlias):
 
FUNCTION FIELDABLOCK( cFieldName, cAlias )

IF cAlias == NIL; cAlias := Alias(); ENDIF

IF ISCHARACTER( cFieldName ) .AND. ISCHARACTER( cAlias )
RETURN &( "{| x | iif( x == NIL, "+ ;
"(["+cAlias+"])->( FieldGet( FieldPos( ["+cFieldName+"] ) ) )"+ ;
"(["+cAlias+"])->( FieldPut( FieldPos( ["+cFieldName+"] ) ) ) }" )
ENDIF

RETURN NIL






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




Пост N: 1235
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.10.16 04:00. Заголовок: PS чуток пропустил &..


PS
чуток пропустил
"(["+cAlias+"])->( FieldPut( FieldPos( ["+cFieldName+"] ), x ) ) }" )

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




Пост N: 5138
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.10.16 14:05. Заголовок: SergKis пишет: Полу..


SergKis пишет:

 цитата:
Получается все правильно, как заказывал:
- LoadFields() ставит FieldWBlock(..., Select(cAlias)), привязка к области
- cNewAlias это др. область



Не совсем понял ?
Я же делаю перед этим переключение на новый алиас:
SELECT(cNewAlias)
oBrw1:cAlias := cNewAlias


Попробую со старым... потом напишу.

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




Пост N: 5139
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.10.16 14:33. Заголовок: Переделал на открыти..


Переделал на открытие старого алиаса.
Всё равно фигня получается.
1) Остаётся первая колонка из предыдущей базы, причём дублирует информацию с другой колонки.
2) Цвета определённые ранее теряются полностью.

Вот скрин:


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


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




Пост N: 1236
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.10.16 15:02. Заголовок: Andrey Переоткрывае..


Andrey
Переоткрываешь так ?
dbSelectArea(cAlias)
dbCloseArea()
dbUseArea( .F., , cFileDbf, cAlias, ...)


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




Пост N: 5140
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.10.16 15:50. Заголовок: SergKis пишет: Пере..


SergKis пишет:

 цитата:
Переоткрываешь так ?


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

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




Пост N: 6058
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.10.16 16:15. Заголовок: Andrey пишет: oBrw1..


Andrey пишет:

 цитата:
oBrw1:Reset()
LoadFields( "oBrw1", cForm, .F.) // все поля не редактируемые
oBrw1:Refresh(.T.)



А если так
LoadFields( "oBrw1", cForm, .F.) // все поля не редактируемые
oBrw1:Reset()
Рефреш не нужен

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




Пост N: 5141
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.10.16 16:44. Заголовок: Dima пишет: А если ..


Dima пишет:

 цитата:
А если так


База открывается нормально. Поля показываются тоже, НО:
Andrey пишет:

 цитата:
Всё равно фигня получается.
1) Остаётся первая колонка из предыдущей базы, причём дублирует информацию с другой колонки.
2) Цвета определённые ранее теряются полностью.
Вот скрин: (см. выше)


Нужно удалить колонку из старой базы и восстановить все цвета и состояние сборного курсора из предыдущей базы.
Если нельзя так, то скажите пожалуйста как можно.

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


Пост N: 1307
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.10.16 16:58. Заголовок: Andrey пишет: 1) Ос..


Andrey пишет:

 цитата:
1) Остаётся первая колонка из предыдущей базы, причём дублирует информацию с другой колонки.
2) Цвета определённые ранее теряются полностью.



Все по феншую. см. код метода DelColumn
А что мешает после добавления новых столбов удалить столбец №1?

Перед манипуляциями с oBrw1 cохраните цвета
aColors := oBrw1:aColors
и восстановите в нужный момент
oBrw1:aColors := aColors

Перерисуйте oBrw1

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




Пост N: 1237
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.10.16 17:06. Заголовок: Andrey пишет База от..


Andrey пишет
 цитата:
База открыта нормально, а в таблице бардак


Так oBrw:LoadFields(...) создает колонки
 
cBlock := 'FieldWBlock("' + aStru[ nE, 1 ] + '",Select("' + ::cAlias + '"))'
::AddColumn( TSColumn():New( cHeading, FieldWBlock( aStru[ nE, 1 ], Select( ::cAlias ) ),cPicture, ;
{ ::nClrText, ::nClrPane }, { nAlign, DT_CENTER }, nSize,, lEditable,,, cOrder,,,, ;
5,,,, Self, cBlock ) )

т.е. aStru от старой базы.
Структуры соответствут в базах (пустой и нормальной) ?
На простом примере показал бы.

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




Пост N: 1238
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.10.16 17:25. Заголовок: Andrey еще METHOD D..


Andrey еще
 
METHOD DelColumn( nPos ) CLASS TSBrowse

Local oCol, nMin, nMax, nI, ;
nLen := Len( ::aSuperHead )

Default nPos := 1

If Len( ::aColumns ) == 1 // cannot delete last column
Return Nil // ... or Nil if last column
EndIf

...


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


Пост N: 1308
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.10.16 18:46. Заголовок: SergKis пишет: т.е...


SergKis пишет:

 цитата:
т.е. aStru от старой базы.



С какой радости, если

SELECT(cNewAlias)  
oBrw1:cAlias := cNewAlias
...

METHOD LoadFields( lEditable ) CLASS TSBrowse
...
aStru := ( ::cAlias )->( DbStruct() )



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




Пост N: 1239
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.10.16 20:59. Заголовок: Петр :sm36: Тольк..


Петр

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


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


Пост N: 1309
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.10.16 21:08. Заголовок: SergKis пишет: Прощ..


SergKis пишет:

 цитата:
Проще удалить контрол Tsb и пересоздать новый


Совершенно с Вами согласен. Если уже создан контрол, то оформить его создание (удаление) в виде отдельной функции и использовать ее столько раз, сколько будет нужно - выглядит совершенно естественно.
Но хозяин - барин, и время и нервы его..


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




Пост N: 5142
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.10.16 01:34. Заголовок: SergKis пишет: Толь..


SergKis пишет:

 цитата:
Только во всей этой катавасии со сменой структуры и колонок (SuperHeader, Footer, цветов), большого смысла не вижу.
Сначала показалось, что речь идет о смене с пустого файла на нормальный, а тут ...
Проще удалить контрол Tsb и пересоздать новый, чем сохранять цвета, удалять колонки


Петр пишет:

 цитата:
Если уже создан контрол, то оформить его создание (удаление) в виде отдельной функции и использовать ее столько раз, сколько будет нужно - выглядит совершенно естественно.
Но хозяин - барин, и время и нервы его..


Ну теперь понятно как делать !
Спасибо за подсказку.

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




Пост N: 5150
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.10.16 10:04. Заголовок: Как можно сделать фу..


Как можно сделать функцию чтения текущего цвета, чтобы его (цвет) потом передавать для другого условия ?
Например, если поставить два условия:
 
// --- меняем цвета текста в ячейках таблицы --( oCol:nClrFore = oBrw:SetColor({1}...)---
AEval(oBrw:aColumns, {|oCol,nCol| oCol:nClrFore := { |a,b,o| ;
iif( (o:cAlias)->ERR_4 == -1 , CLR_HRED, CLR_BLACK ) } })
AEval(oBrw:aColumns, {|oCol,nCol| oCol:nClrFore := { |a,b,o| ;
iif( (o:cAlias)->ERR_4 == 1 , CLR_HBLUE, CLR_BLACK ) } })

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

Можно ли как то сделать типа так: ???
  
AEval(oBrw:aColumns, {|oCol,nCol| oCol:nClrFore := { |a,b,o| ;
iif( (o:cAlias)->ERR_4 == -1 , CLR_HRED, MyCLR() ) } })
AEval(oBrw:aColumns, {|oCol,nCol| oCol:nClrFore := { |a,b,o| ;
iif( (o:cAlias)->ERR_4 == 1 , CLR_HBLUE, MyCLR() ) } })

Ну может ещё параметр передавать в MyCLR() нужно...

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




Пост N: 5151
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.10.16 17:05. Заголовок: Блин, что то я ступи..


Блин, что то я ступил... Решение то простое. Совсем заработался...
AEval(oBrw:aColumns, {|oCol,nCol| oCol:nClrFore := { |a,b,o| MyTsbColorText( (o:cAlias)->ERR_4 ) } } )
..............
////////////////////////////////////////////////////////////
STATIC FUNCTION MyTsbColorText(nVal)
LOCAL nColor

IF nVal == -1
nColor := CLR_HRED
ELSEIF nVal == 1
nColor := CLR_HBLUE
ELSE
nColor := CLR_BLACK
ENDIF

RETURN nColor



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




Пост N: 5154
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.10.16 23:17. Заголовок: А вы знаете, что в М..


А вы знаете, что в МиниГуи 16.09 содержится 5796 файлов - размером 85,5 Мб ?
А в папке Include 90 файлов занимают 1,01 Мб ?
А папка исходников SAMPLES с *.prg весит 8,85 Мб и кол-во файлов 1003 и самые первые исходники датированы 2003 годом ?
Все эти сведения смотрите в новом примере Tsbrowse у Григория !

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




Пост N: 6066
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.10.16 13:52. Заголовок: Andrey При чем тут ..


Andrey
При чем тут твое сообщение и название темы ?
О каком примере речь ?

PS
Хорошая трава у тебя однако

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


Пост N: 1316
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.10.16 14:14. Заголовок: Dima пишет: При чем..


Dima пишет:

 цитата:
При чем тут твое сообщение и название темы ?
О каком примере речь ?



Скорее всего, Андрей написал новый пример на тему использование Tsbrowse в MiniGUI и надеется, что Григорий его опубликует в новом релизе.


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




Пост N: 1021
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.10.16 14:46. Заголовок: Петр пишет: Андрей ..


Петр пишет:

 цитата:
Андрей написал новый пример на тему использование Tsbrowse в MiniGUI


Так и есть

Петр пишет:

 цитата:
Григорий его опубликует в новом релизе


Да, я включил этот пример после небольшой чистки в 4-ю бету.

Петр
Выложил 4-ю бета-сборку на ftp по прежнему адресу

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





Пост N: 186
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 26.10.16 15:02. Заголовок: Обратил внимание h_t..


Обратил внимание h_tbrowse.prg в методе Excel2 если выводит цифровые данные по шаблону
допустим 999999.99 -> то результат будет с одним знаком после запятой и меньшим в 10 раз.
Раньше не обращал внимание - все работало.
Крутил блок со строки 4374: if "@Z " $ ::aColumns[ nCol ]:cPicture .or. LEN(cPic) > 3
пока результата не добился...


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




Пост N: 5155
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.10.16 20:12. Заголовок: Петр пишет: Скорее ..


Петр пишет:

 цитата:
Скорее всего, Андрей написал новый пример на тему использование Tsbrowse в MiniGUI


Нет, не я написал. SergKis сделал.


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




Пост N: 5157
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.11.16 12:00. Заголовок: Всем привет. Вопрос ..


Всем привет.
Вопрос возник по бровсу.

На окне имею Tsbrowse с вертикальной линией скролинга и подвалом.
Делаю - oBrw:Enabled( .F. ) // отключить показ TBROWSE
Шапка таблицы становится серой, сама таблица пропадает, а подвал и скролинг остаются.
Это должно быть так или это глюк ?
Как убрать скролинг и подвал ?


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




Пост N: 1249
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.11.16 16:05. Заголовок: Andrey сделай SetP..


Andrey
сделай
SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.)



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




Пост N: 1250
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.11.16 16:09. Заголовок: Andrey Если хочешь ..


Andrey
Если хочешь скрыть tsb, делай oBrw:Hide()

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





Пост N: 187
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 01.11.16 16:43. Заголовок: krutoff пишет: Обра..


krutoff пишет:

 цитата:
Обратил внимание h_tbrowse.prg в методе Excel2 если выводит цифровые данные по шаблону
допустим 999999.99 -> то результат будет с одним знаком после запятой и меньшим в 10 раз.
Раньше не обращал внимание - все работало.
Крутил блок со строки 4374: if "@Z " $ ::aColumns[ nCol ]:cPicture .or. LEN(cPic) > 3
пока результата не добился...


Неужели у всех цифровые поля с копейками нормально в Excel выводятся?
Или никто в XLS TSBrowse не выводит?

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




Пост N: 5158
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.11.16 17:05. Заголовок: SergKis пишет: сдел..


SergKis пишет:

 цитата:
сделай
SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.)



Не помогает ! Остаётся так же: со скролингом и подвалом таблицы. Версия 16.09 !

SergKis пишет:

 цитата:
Если хочешь скрыть tsb, делай oBrw:Hide()


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


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




Пост N: 5159
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.11.16 17:10. Заголовок: krutoff пишет: Неуж..


krutoff пишет:

 цитата:
Неужели у всех цифровые поля с копейками нормально в Excel выводятся?


У меня тоже нет второго 0. выводит только 0.0, вторую цифру после нуля обрезает.

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




Пост N: 1251
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.11.16 17:25. Заголовок: Andrey пишет Не помо..


Andrey пишет
 цитата:
Не помогает ! Остаётся так же: со скролингом и подвалом таблицы. Версия 16.09 !


версия 2.07. oBrw:Enabled(.F.) - как утебя, SetProperty(...) - все хорошо, таблица блокирована, отображение норма

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




Пост N: 5160
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.11.16 18:25. Заголовок: Опять глюк поймал.....


Опять глюк поймал...
Сделал меню (2 колонки) из Tsbrowse, назначил только блок кода на обработку:
oBrw:aColumns[1]:bPrevEdit := {|| MenuRun(), FALSE }   
oBrw:aColumns[2]:bPrevEdit := {|| MenuRun(), FALSE }
.....
STATIC FUNCTION MenuRun()
....
SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.)
oBrw:Hide() // отключить показ Tsbrowse
Menu2Start("RUN new function", oBrw:nAt )
oBrw:Show() // включить показ Tsbrowse
SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.)
oBrw:Refresh(.T.)
Form_2.oBrw.Setfocus

RETURN Nil


Функцию обработки при изменении позиции маркера не использую.
//oBrw:bChange := { |oBrw| ChangeTable(oBrw) }

В функции Menu2Start("RUN new function", oBrw:nAt ) - всё равно происходит показ таблицы oBrw ! Почему ?
Мышкой по клацаешь (или стрелками с Enter используешь) и таблица вся появляется...
Что нужно добавить чтобы таблица не появлялась в функции Menu2Start() ?


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




Пост N: 6067
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.11.16 18:42. Заголовок: Andrey пишет: В фун..


Andrey пишет:

 цитата:
В функции Menu2Start("RUN new function", oBrw:nAt )


Ты ведь покажешь что в ней живет ?
Телепаты в отпуске.

PS
Только не надо мне ее на мыло слать , сюда пиши.

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




Пост N: 5161
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.11.16 19:32. Заголовок: Dima пишет: Ты ведь..


Dima пишет:

 цитата:
Ты ведь покажешь что в ней живет ?
Телепаты в отпуске.



Да в той функции нет обращений к объектам таблицы. Только кнопочки и смена фона.
Я разобрался с этим. Оказывается всё просто, нужно
SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.)  
oBrw:Hide() // отключить показ Tsbrowse

поместить в саму функцию Menu2Start(), а
oBrw:Show()  // включить показ Tsbrowse  
SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.)
oBrw:Refresh(.T.)
Form_2.oBrw.Setfocus

поставить перед выходом из функции Menu2Start() ! И глюк пропал...
Замена мест слагаемых - меняет действие глюка.

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




Пост N: 1252
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.11.16 12:25. Заголовок: Пример на эту тему: ..


Пример на эту тему: http://my-files.ru/catj99

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




Пост N: 1253
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.11.16 14:22. Заголовок: Тот же пример, с поп..


Тот же пример, с попыткой заменить метод Enabled: http://my-files.ru/w3b3nf

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




Пост N: 6068
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.11.16 17:01. Заголовок: Ездили ездили колесо..


Ездили ездили колесом на вынь XP и бах таблица стала ломаться
Скрытый текст

Перезашли в прогу , 10 минут все хорошо , потом снова такая же ерунда.
У себя на вынь 7 такого не наблюдаю.
Что за напасть ?

PS
Задача сетевая

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




Пост N: 6069
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.11.16 17:40. Заголовок: Вот и я доездился в ..


Вот и я доездился в семерке
В начале пропали все иконки , с кнопок и бровса
Затем начал глючить скрол ........и понеслась
После закрытия окна с бровсом в главном окне пропали картинки и иконки включая главное меню.
При повторном запуске бровса ни чего изменилось , картинок и иконок нет.
После закрытия , главное окно полностью потеряло все контролы и все закрасилось серым цветом.
PS
MiniGui 16.06 + Mingw 4.9.2 не тот что был в поставке + Harbour свой от 2016-03-10

Скрытый текст


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




Пост N: 1254
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.11.16 18:45. Заголовок: Dima пишет Ездили ез..


Dima пишет
 цитата:
Ездили ездили колесом на вынь XP и бах таблица стала ломаться


стрелками вверх\вниз, такая же ерунда ?
1. Убери горизонт. скролл, пробни
2. Уменьши высоту заголовка на 1, 2 рх


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




Пост N: 6070
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.11.16 19:16. Заголовок: SergKis Так он норм..


SergKis
Так он нормально работает минут 15 и потом бац
Попробую пересобрать с тем Mingw что шел в поставке Минигуи + Harbour от него

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




Пост N: 1255
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.11.16 20:21. Заголовок: Дима, если происходи..


Дима, если происходит сбой на 1 рх, то прорисовка может сломаться, потому проверить не мешает.
от стрелок вверх\вниз через 15 мин. ломается?

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




Пост N: 6071
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.11.16 22:55. Заголовок: Dima пишет: Попробу..


Dima пишет:

 цитата:
Попробую пересобрать с тем Mingw что шел в поставке Минигуи + Harbour от него


Пытаюсь пересобрать с 16.06 на 16.10
Получаю
hbmk2: Error: Referenced, missing, but unrecognized Harbour function(s): HB_LANG_RUWIN()
В сырце стоит так
REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 , HB_LANG_RUWIN
Что то я потерялся , да еще и файл ресурсов не собирается и валит ошибку
C:/MINIGUI_MG/hmg/mingw32/bin/../lib/gcc/i686-w64-mingw32/6.2.0/../../../../i686-w64-mingw32/bin/ld.exe: .rsrc merge failure: dupl
icate leaf: type: 2 (BITMAP) name: BOX16 lang: 409

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




Пост N: 6072
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 10:13. Заголовок: И все таки какая то ..


И все таки какая то порча с Минигуи 16.10 под MINGW
Взял пример minigui\Samples\MAINDEMO\ и собрал его с помощью Build.bat , все нормально
После добавил в сырец примера строку REQUEST HB_LANG_RUWIN и снова пробнул собрать ,
не собирается.
Куда копать ?

И до кучи , UPX3.91w не жмет исполняемые файлы Minigui (16.10)+Mingw и выдает
CantPackException: superfluous data between sections



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




Пост N: 6073
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 11:03. Заголовок: SergKis пишет: стре..


SergKis пишет:

 цитата:
стрелками вверх\вниз, такая же ерунда ?
1. Убери горизонт. скролл, пробни
2. Уменьши высоту заголовка на 1, 2 рх



Да со стрелками та же ерунда , но не сразу. Минут 5 полет нормальный
Заголовок уменьшил на 2 px , не помогло
Г скролл выключил но после этого пропали 2 крайние колонки

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




Пост N: 1256
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 11:46. Заголовок: Dima пишет Да со стр..


Dima пишет
 цитата:
Да со стрелками та же ерунда , но не сразу.


Попробуй, нажимая стрелку вниз\вверх, перемежать нажатием PgDn\PgUp
У меня была похожая ситуевина (через 100 строк вставлял Pg... и помогло)

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




Пост N: 1257
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 11:55. Заголовок: PS Г скролл у меня о..


PS
Г скролл у меня отключен совсем, дело в том, что GetHScrollBarHeight() дает разные данные,
а в расчетах тсб по другому и возникает дисбаланс рх.
еще отключи noholes - без нее пробни.

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




Пост N: 6074
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 12:18. Заголовок: SergKis пишет: еще ..


SergKis пишет:

 цитата:
еще отключи noholes - без нее пробни.


выключил , снова поездил мышкой.....минут через 5 сломались хидеры в обоих бровсах , после пропали
все картинки в таблицах , цвет грида (сетки) сбросился сам на дефолтный ,
при нажатии на кнопку вызова справочника , получил серое окно ....после путем нажатия ESC добрался
до главного окна в котором главное меню уже было сломано , но если мышкой поводить там где оно должно жить ,
то оно появляется.
Барабашки что ли завелись....не знаю что делать.
Может ну его в лес MINGW и взять старый добрый BCC55 , вот только не уверен что это поможет.

PS
Ведь если "загулял" где то пиксель то глючить начало бы сразу. А так в течении 5-10 минут я успеваю "объезжать"
всю таблицу вдоль и поперек и ни каких глюков нет.
Ни чего не понимаю


PS2
В одном окне живет 2 бровса , главный и подчиненный , двигаясь по главному , меняется содержимое подчиненного бровса.
Такое впечатление что где то утечка памяти.......

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




Пост N: 1258
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 13:30. Заголовок: Dima пишет Ведь если..


Dima пишет
 цитата:
Ведь если "загулял" где то пиксель то глючить начало бы сразу.


В том и дело, что не сразу. Стрелками жмем (колесо мыши) одна прорисовка, PgDn\Up другая Мне вставка Pg..., между нажатями стрелок, помогла. Если тебе, при нажатии стрелки вниз, через 50 строк пробега, отпускать и жать PgDn и снова стрелку вниз на ~50 строк и т.д. в течении 15-20 мин. не сломает, ... было бы не плохо - бороться можно.
На твоей картинке видно как развалилась прорисовка, на заголовке линия и строки смещены, наложены.
А когда тсб сломался, то происходит полная фигня и с др. окнами (правда не всегда), причем полная.
Программа большая (много окон) без тсб (browse), работает месяцами без перезагрузки, с тсб большой нет, пока использую прогу как утилиту со многими входами (и тсб) - совмещаю с wvt. Но все время в ожидании ситуации, как у тебя выползла.
Виноват ли тут MinGw ? Поможет Bcc ? я на mvc.



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




Пост N: 1259
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 13:35. Заголовок: Dima пишет Такое впе..


Dima пишет
 цитата:
Такое впечатление что где то утечка памяти.......


Это вполне возможно с памятью, вся база минигуи это public переменные, мусоросборщик может их таскать и ...
В VO это было большой проблеммой

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




Пост N: 6075
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 13:42. Заголовок: Сергей , стрелки ни ..


Сергей , стрелки ни кто и не использует для движения , как правило это мышь.
А конкретно где и как ты предлагаешь вставить PG....?
Сейчас тупо гоняю тест в своей проге где в одном окне всего один бровс и пока глюков нет.
Такое впечатление что заглючить может тогда ,когда в одном окне 2 бровса , но пока еще
потестю и отпишу.

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




Пост N: 1260
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 13:48. Заголовок: Dima пишет В одном о..


Dima пишет
 цитата:
В одном окне живет 2 бровса


От 2-х тсб, я пока отказался (нет уверенности в нормальной\надежной работе), планирую browse+tsb или tsb+browse, в зависимости от сложных header\footer -> tsb и простых > browse.


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




Пост N: 6076
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 13:53. Заголовок: SergKis пишет: От 2..


SergKis пишет:

 цитата:
От 2-х тсб, я пока отказался


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

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




Пост N: 1261
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 13:53. Заголовок: Dima пишет стрелки ..


Dima пишет
 цитата:
стрелки ни кто и не использует для движения , как правило это мышь


Крутя колесико - посылается сообщение, в исполнение которого лежит типа нажали стрелку.
Прудлагаю ручками (имитация колесика) проделать, как описал выше, стрелка нажата, пробежали 50-100 записей, PgDn ...
Если поможет, покажу где что вставить.

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




Пост N: 1262
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 14:01. Заголовок: Dima пишет Окно , на..


Dima пишет
 цитата:
Окно , на нем еще 2 окна под размеры бровсов и уже в каждом из этих окон будет жить свой бровс.


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

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




Пост N: 6077
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 14:05. Заголовок: SergKis пишет: Окна..


SergKis пишет:

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


конечно

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


Пост N: 247
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 09.11.16 15:45. Заголовок: Dima пишет: Такое в..


Dima пишет:

 цитата:
Такое впечатление что где то утечка памяти.


Да, такое впечатление. Под FW с TsBrows ом у меня такие проблемы были. Отследи утечку, потом можно будет пободаться.
Например убрать все фонты ....

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




Пост N: 6078
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 16:13. Заголовок: ММК в Xбровсе FW та..


ММК
в Xбровсе FW такого нет ?

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


Пост N: 248
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 09.11.16 16:20. Заголовок: Dima пишет: в Xбров..


Dima пишет:

 цитата:
в Xбровсе FW такого нет ?


Нет. Xбровс это уже другой уровень, другие возможности.

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




Пост N: 6079
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 16:43. Заголовок: ММК То есть ни чего..


ММК
То есть ни чего в нем само не ломается если сам ошибок не сделал , так ?

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




Пост N: 6080
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 16:53. Заголовок: SergKis Значит сдел..


SergKis
Значит сделал я в отдельном окне.
Одно окно STANDART большое на весь экран , под главный бровс внутри этого окна сделал окно WINDOWTYPE PANEL
и в нем поселил главный бровс.
Поездил и глюки повторились (не сразу) .
Печаль......

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




Пост N: 1263
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 17:51. Заголовок: Dima А если не пане..


Dima
А если не панель (там вроде не все ок), а child на каждый тсб, а сверху standart ?

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




Пост N: 6082
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 18:00. Заголовок: SergKis Да что то я..


SergKis
Да что то я сразу не допер , так как смутил первый вылет когда я просто внутри окна определил другое окно
и когда запустил , выпала месага что внутри окна можно создать только окно типа Panel
Я пока что делаю чистый эксперимент , езжу только клавишами......о снова все сломалось при чем
в обоих бровсах сразу.
Хрен знает что делать.......а клиент уже лютует

ЗЫ
Чем больше ездим по бровсу , не важно как , мышка или клава , тем он быстрее дурнеет и дурнеет......
Может ему какую оздоравливающую процедуру делать по таймеру ?
Вопрос в том какую...
Говорю о двух бровсах в одном окне.
Когда один то такого не происходит , мне не удалось это сделать.

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




Пост N: 5162
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.11.16 18:29. Заголовок: Dima пишет: Хрен зн..


Dima пишет:

 цитата:
Хрен знает что делать.......а клиент уже лютует


Сочувствую... Аналогично бывает...
Я только один бровс в окне использую.

SergKis пишет:

 цитата:
А если не панель (там вроде не все ок), а child на каждый тсб, а сверху standart ?


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

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




Пост N: 6085
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 18:40. Заголовок: Dima пишет: Может е..


Dima пишет:

 цитата:
Может ему какую оздоравливающую процедуру делать по таймеру ?


Сунул пока что в bchange бровса doevents() , буду тестить......

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




Пост N: 1264
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 18:44. Заголовок: Dima пишет Может ему..


Dima пишет
 цитата:
Может ему какую оздоравливающую процедуру делать


Я тебе ее предлагал, стрелкой вниз держим, через ~50 строк отжимаем и жмем PgDn,
снова стрелкой вниз держим, через ~50 строк отжимаем и жмем PgDn, ... потом стрелкой вверх тоже самое,
если не рушится, то процедуру можно делать (у меня есть такое), если нет, то ... хз.

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




Пост N: 1265
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 18:50. Заголовок: Dima пишет Хрен знае..


Dima пишет
 цитата:
Хрен знает что делать.......а клиент уже лютует


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

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




Пост N: 6086
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 18:52. Заголовок: SergKis пишет: Я те..


SergKis пишет:

 цитата:
Я тебе ее предлагал, стрелкой вниз держим, через ~50 строк отжимаем и жмем PgDn


Как же я на глазок определю что отмотал 50 строк руками ? :)
Вообще процедура не понятна.........отмотали 50 строк вниз и зачем то нажали PgDn ....он еще отмотает страницу ,
как то не логично. И потом почему на твой взгляд такой подход должен решить проблему ?
Что то я не до конца усекаю

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




Пост N: 1266
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 18:54. Заголовок: Andrey пишет но сто..


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


Совсем проблемы нет менять координаты row,col child окон при перетаскивании standart окна

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




Пост N: 1267
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 19:09. Заголовок: Dima пишет И потом ..


Dima пишет
 цитата:
И потом почему на твой взгляд такой подход должен решить проблему ?
Что то я не до конца усекаю


У себя я именно так нащупал оздоравливающую процедуру и встроил ее в либу - пока работает.
Стрелка .. работает типа скрол экрана, а PgDn прорисовывает весь лист (окно) тсб, в этом разница.
~50-100 строк я нащупал пробуя, в либу поставил 100, т.е. крутим колесико или жмем стрелку ...,
через 100 строк проскакивает отжатие стрелки и PgDn или PgUp

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




Пост N: 6087
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 19:16. Заголовок: SergKis Похоже на ш..


SergKis
Похоже на шаманство и танец с бубном
Если не жалко , сложи на фтп + как ее правильно применить.
Спасибо.

PS
С 7 утра пытаюсь решить эту проблему и ни как..........

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




Пост N: 1268
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 19:40. Заголовок: Dima пишет Похоже на..


Dima пишет
 цитата:
Похоже на шаманство и танец с бубном


Так я и плясал вокруг этого не один день
Просто понять поможет или нет (время на разбирательсво не тратить)
жмешь чуть чуть стрелку вниз, отпускаешь, жмешь PgDn один раз и снова стрелку вниз чуть чуть и т.д.
Еще пробни нажатия PgDn (с отпусканием или зажатый на срок) ломают тсб ?
тексты тут положу, найду что менял.

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




Пост N: 6088
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 19:50. Заголовок: SergKis пишет: Так ..


SergKis пишет:

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


Смотри сам , не хочешь , не выкладывай , я пойму
Буду тогда сам ковыряться не один день

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


Пост N: 249
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 09.11.16 20:05. Заголовок: Dima пишет: То есть..


Dima пишет:

 цитата:
То есть ни чего в нем само не ломается если сам ошибок не сделал , так


Так нет. У меня есть пару мест , где на окне пара бровсов-жалоб не поступало. Правда не пробовал 15 минут крутить колесико :)

SergKis пишет:

 цитата:
Стрелка .. работает типа скрол экрана, а PgDn прорисовывает весь лист (окно) тсб, в этом разница.



Уже не помню, поэтому могу ошибаться :) Делал что-то типа
oBr:upstable()
oBr:Setfocus()
или
oBr:upstable()
oBr:Refresh(.T.)

Иногда помогало :)


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




Пост N: 1269
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 20:05. Заголовок: Тут изменения CLASS..


Тут изменения Скрытый текст


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




Пост N: 1270
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.16 20:10. Заголовок: ММК пишет Иногда пом..


ММК пишет
 цитата:
Иногда помогало :)


Лишним такое переотображение не будет, согласен

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




Пост N: 6090
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 22:28. Заголовок: SergKis пишет: Тут ..


SergKis пишет:

 цитата:
Тут изменения


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

Попробую основной бровс с TS переписать на обычный бровс , надеюсь там есть двойной курсор и его
раскраска.


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




Пост N: 1054
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.16 22:59. Заголовок: Дима, в подчиненом б..


Дима, в подчиненом бровсе сразу прорисовка( при смене строки) или по таймеру после прекращения навигации в главном?
Пишу с мобилы. Пока нет компа под рукой

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




Пост N: 6091
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 23:01. Заголовок: Haz пишет: Дима, в ..


Haz пишет:

 цитата:
Дима, в подчиненом бровсе сразу прорисовка или по таймеру после прекращения навигации в главном.


Так по таймеру и делал с твоей подачи Игорь.

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




Пост N: 1055
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.16 23:03. Заголовок: Попробуй задержку т..


Попробуй задержку таймера увеличить

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




Пост N: 1056
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.16 23:06. Заголовок: У меня целый день по..


У меня целый день пользователь гоняет мышь вверх вниз от безделья. С тех пор как переделал на таймер все работает

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




Пост N: 6092
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 23:08. Заголовок: Haz пишет: Попробу..


Haz пишет:

 цитата:

Попробуй задержку таймера увеличить


Хорошо , отпишу завтра.

Haz пишет:

 цитата:

У меня целый день пользователь гоняет мышь вверх вниз от безделья


У моего думаю так же , но не факт....

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




Пост N: 1057
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.16 23:16. Заголовок: Еще при прорисовке п..


Еще при прорисовке подчиненного процедуру глянь.
У тебя там скорее scope и refresh используется.
Кажется мне если этот refresh закоментить то слом прекратиться, впрочем как и отображение scope
Я использую reset для перерисовки

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




Пост N: 6093
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.11.16 23:59. Заголовок: Haz Завтра выложу к..


Haz
Завтра выложу кусок сырца , но там вроде все правильно.
У меня там RESET бровсу + серверный фильтр , Refresh нет

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



Пост N: 329
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 10.11.16 09:14. Заголовок: когда пошли первые н..


когда пошли первые непонятные подвисания и косяки с прорисовкой (пустые строки в середине таблицы) , сразу отказался от использования TSBROWSE
и ушел на стандартные BROWSE . Когда допилят - попробую снова . кроме SuperHeader и раскраски элементов ничего от них не нужно было ....


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




Пост N: 6094
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 09:46. Заголовок: Haz Вот сырцы , но ..


Haz
Вот сырцы , но там все гладко как бы. Ведь работает же первые 5-10 минут нормально.
Если не клацать ни чего в бровсе и не ездить по нему , то обе таблички могут висеть хоть
целый день и ни чего не ломается. Но стоит интенсивно поездить по ним какое то время ,
бровс начинает жить своей жизнью и может сломать жизнь другим окнам и контролам в программе.
Скрытый текст

*------------------------------------------------------
[pre2]
FUNC CheckRefresh( o )
IF ! _IsControlDefined ( o:cControlName + '_Timer', o:cParentWnd )
_DefineTimer ( o:cControlName + '_Timer' , o:cParentWnd , o:nDellay , { || OnChangeProcedure(o) } )
END
o:nNewRecord := o:nLogicPos()
RETURN NIL
*---------------------------------------------------
FUNC OnChangeProcedure( o )
if o:nOldRecord == o:nNewRecord

Myfilter(o,obrw4)

IF _IsControlDefined ( o:cControlName + '_Timer', o:cParentWnd )
Domethod( o:cParentWnd, o:cControlName + '_Timer' , 'Release')
ENDIF
endif
o:nOldRecord := o:nLogicPos()
RETURN NIL
*---------------------------------------------------------
Func MyFilter(o1,o2)

If o1:loBrw3Ready
Setproperty("SPR_REC","Message4","value","Загрузка данных.......")
Flogan('rid=='+ntoc((o1:cAlias)->rid) ,o2:cAlias) // серверный фильтр ADS
o2:Reset()
GetTotal(.t.,o2 )
Setproperty("SPR_REC","Message4","value",alltrim((o1:cAlias)->naim) )
Setproperty("SPR_REC","Message4","tooltip",alltrim((o1:calias)->prime))
Setproperty("SPR_REC","Message5","value",getuserfio() )


FreshFoots(o2)

if n_fltrecept==2
Setproperty(obrw3:cParentWnd,"Button_1","Enabled",FALSE)
endif

if kaka("recept") .or. idrec_user==(o1:calias)->n_user

obrw3:SetDeleteMode( if (n_fltrecept==2,.f.,.t.) ,.f.,{|| del_x:=(obrw3:calias)->rid,isdel(obrw3)} , {||ClearSpec(del_x) , x:=obrw3:bchange,obrw3:bchange:=nil,obrw3:Gotorec((obrw3:calias)->(recno())),obrw3:bchange:=x,eval(obrw3:bchange) } )
obrw4:SetDeleteMode( if (n_fltrecept==2,.f.,.t.) ,.f.,{|| if( (obrw4:calias)->itg==0,msgokCancel("Удалить "+alltrim(getspr(oBrw4,"naim"))+" ?","Внимание"),FALSE) },{|| Gettotal(.t.,obrw4),FreshFoots(obrw4)} )
Setproperty(obrw3:cParentWnd,"Button_2","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw3:cParentWnd,"Button_2","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw3:cParentWnd,"Button_3","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw4:cParentWnd,"Button_1x","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw4:cParentWnd,"Button_2x","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw4:cParentWnd,"Button_3x","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw4:cParentWnd,"Button_4x","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw4:cParentWnd,"Button_6x","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw4:cParentWnd,"Button_7x","Enabled",if(n_fltrecept==2,FALSE, TRUE) )
Setproperty(obrw4:cParentWnd,"Button_8x","Enabled",if(n_fltrecept==0,kaka("prnrecept"),.t. ))

else

obrw3:SetDeleteMode( .f.,.f.,{|| del_x:=(obrw3:calias)->rid,isdel(obrw3)} , {||ClearSpec(del_x) , obrw3:Gotorec((obrw3:calias)->(recno())) } )
obrw4:SetDeleteMode( .f.,.f.,{|| if( (obrw4:calias)->itg==0,msgokCancel("Удалить "+alltrim(getspr(oBrw4,"naim"))+" ?","Внимание"),FALSE) },{|| Gettotal(.t.,obrw4),FreshFoots(obrw4)} )
Setproperty(obrw3:cParentWnd,"Button_2","Enabled",FALSE )
Setproperty(obrw3:cParentWnd,"Button_3","Enabled",FALSE )
DoMethod ( "SPR_REC" , "Button_5" , 'Hide' )
Setproperty(obrw4:cParentWnd,"Button_1x","Enabled",FALSE )
Setproperty(obrw4:cParentWnd,"Button_2x","Enabled",FALSE )
Setproperty(obrw4:cParentWnd,"Button_3x","Enabled",FALSE )
Setproperty(obrw4:cParentWnd,"Button_4x","Enabled",FALSE )
Setproperty(obrw4:cParentWnd,"Button_6x","Enabled",FALSE )
Setproperty(obrw4:cParentWnd,"Button_7x","Enabled",FALSE )
Setproperty(obrw4:cParentWnd,"Button_8x","Enabled",if(n_fltrecept==0,kaka("prnrecept"),.t. ))

endif
endif

return nil
*--------------------------------------------------------
func Flogan(ceri,alik)
hb_default(@alik,alias())

if (alik)->(Rddname())=="ADSCDX"
(alik)->(AdsSetAof(ceri,2))
else
(alik)->(dbsetfilter({|| &(ceri)},ceri))
endif
return nil

*---------------------------------------------------------




`

Вот видео что выслал клиент.
Я позже у себя тоже плотно поюзал и выпал на похожие глюки (писал выше)
Скрытый текст


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




Пост N: 1271
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 11:02. Заголовок: Dima пишет Вот сырцы..


Dima пишет
 цитата:
Вот сырцы


Может не так понял, но создавать тимер в CheckRefresh и удалять в блоке кода { || OnChangeProcedure(o) } это слишком круто (через 50 млсек.)
1. По мне тимер надо вешать на окно и приостанавливать его работу на время выборок, делая тимеру Enabled := .F. и
запуская на отслеживание изменения позиции\ключа данных Enabled := .T.
2. SetDeletedMode тоже поставить один раз на obrw3,obrw4 и внутри отслеживать что там надо
3. Сам тимер в работе должен ТОЛЬКО отследить, что сменился ключ\позиция (рассогласование obrw3, obrw4) и включить прорисовку obrw4,
причем время реакции\работы тимер не менее 700 млсек. (в VO ставил 1000 млсек.).

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




Пост N: 1272
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 11:08. Заголовок: PS процедура CheckRe..


PS
процедура CheckRefresh в obrw3, должна только показывать, что сменился ключ\позиция, при перемещении, а
тимер, срабатывая (через сек.) переотображать, если ключ\позиция изменились
Это, конечно, если правильно понял идею по тексту

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




Пост N: 1058
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.16 11:29. Заголовок: SergKis удалять в ..


SergKis

 цитата:
удалять в блоке кода { || OnChangeProcedure(o) } это слишком круто (через 50 млсек.)


Согласен , была мысль поселить таймер в бровсе и управлять прорисовкой флагами . Но до реализации не дошло.
То что дал Дима , это временное решение . и как все временное живет уже почти год
Идея ты понял правильно - незачем рисовать дочерний бровс пока пользователь не оторвал палец от клавиатуры или не перестал крутить колесо.

Dima

 цитата:
Вот сырцы


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

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




Пост N: 1028
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.11.16 11:46. Заголовок: SergKis пишет: тиме..


SergKis пишет:

 цитата:
тимер надо вешать на окно и приостанавливать его работу на время выборок, делая тимеру Enabled := .F. и
запуская на отслеживание изменения позиции\ключа данных Enabled := .T.


Полностью согласен - это оптимальный путь

В противном случае каждые 50 мсек создается PUBLIC переменная для нового таймера, что и приводит к утечке памяти у Димы.
Рекомендую также увеличить время срабатывания таймера минимум в 3 раза (можно и больше )

Кстати, для периодической чистки памяти по таймеру на форуме HMG рекомендуют команду

DEFINE TIMER Tmr_1 INTERVAL 5000 ACTION (RELEASE MEMORY) // только для WinVista и выше

Dima пишет:

 цитата:
Вот сырцы , но там все гладко как бы.


Не совсем гладко, выходит...

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




Пост N: 6095
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 12:36. Заголовок: Не думал что таймер ..


Не думал что таймер может так поднасрать )))
Сделал без таймера.
В Bchange главного бровса o:Reset() прибил , так как при частом вызове это может привести к зависанию бровса.
Вместо него сделал o:Refresh(.t.) +o:Gotop()+ o:upstable()
Испытываю езду по бровсу , пока не виснет и не глючит
Но посмотрим....

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




Пост N: 1273
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 12:49. Заголовок: Dima пишет Вместо не..


Dima пишет
 цитата:
Вместо него сделал o:Refresh(.t.) + o:upstable()
Испытываю езду по бровсу , пока не виснет и не глючит


От timer не отказывайся, по левому тсб бегают\остановились, а правый через 1 сек. переотображает (если сменилось),
это лучше, чем на каждой смене левой записи переотображать правый тсб.

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




Пост N: 6096
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 12:58. Заголовок: SergKis пишет: это ..


SergKis пишет:

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


Я понимаю это , но вот езжу туда сюда уже 30 минут и все нормально , косяков нет.
Правый бровс думаю не умрет , ведь перед показом там идут некоторые расчеты , что и дает некую задержку.
Когда там жил RESET() , могло зависнуть.

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




Пост N: 1274
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 13:08. Заголовок: Dima пишет Правый бр..


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


Т.е. получается правый тсб расчитывает потом показывает (с задержкой),
а левй убежал уже куда то, т.к. на нем крутим колесо мыши, не уверен, что это правильно

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




Пост N: 1275
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 13:11. Заголовок: PS Если правильно по..


PS
Если правильно понимию от правого тсб ставится scope\filter и получается правый убежал и что то ставит,
а левый еще где то в прошлых установках

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




Пост N: 1276
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 13:13. Заголовок: надо читать левый уб..


надо читать левый убежал и что то ставить, а правый еще в прошлых установках, спутался чуть чуть, сори

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




Пост N: 6097
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 13:23. Заголовок: SergKis Убедил. Тол..


SergKis
Убедил. Только пока не совсем четко представляю как это все правильно переделать , с Минигуи работаю наскоками.

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




Пост N: 1277
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 13:48. Заголовок: Dima Схематично мож..


Dima
Схематично можно делать так Скрытый текст


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




Пост N: 1278
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 13:50. Заголовок: PS забыл, после гот..


PS
забыл, после готовности окна (тсб) к работе вкл. This.MyTimer/Enabled := .T.

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




Пост N: 6098
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 14:14. Заголовок: SergKis Сделал так ..


SergKis
Сделал так
 
FUNC DoTimer( o3,o4 )
LOCAL nNew := GetProperty(o3:cParentWnd, 'Buf' , 'Cargo')
LOCAL nOld := GetProperty(o3:cParentWnd, 'oBrw3', 'Cargo')

If o3:loBrw3Ready

If empty(nNew)
RETURN NIL
EndIf

If nNew != nOld
SetProperty(o3:cParentWnd, 'MyTimer', 'Enabled', .F.)
Myfilter(o3,o4)
// тут перепоказ правого тсб
// ставим scope\filter и ....
SetProperty(o3:cParentWnd, 'oBrw3', 'Cargo', nNew)
SetProperty(o3:cParentWnd, 'MyTimer', 'Enabled', .T.)
EndIf
endif

RETURN NIL


Когда двигаюсь по бровсу o3 (главный) , то в правом o4 ни чего не меняется , так и надо.
Но вот когда остановился , правый бровс начинает все время обновляться и моргать.
Что не так сделал ? Где то нужно остановить таймер , не пойму где..

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




Пост N: 1279
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 14:22. Заголовок: Dima пишет Где то ну..


Dima пишет
 цитата:
Где то нужно остановить таймер , не пойму где..


Timer останавливать не надо, должно срабатывать nNew == nOld и выход из DoTimer
надо проверить, что там

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




Пост N: 6099
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 14:23. Заголовок: Мой косяк , баловалс..


Мой косяк , баловался сам с таймером и забыл убрать свой.
В общем , после того как я перестал двигаться по бровсу , правый бровс не обновился почему то

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




Пост N: 6100
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 14:26. Заголовок: SergKis пишет: Time..


SergKis пишет:

 цитата:
Timer останавливать не надо, должно срабатывать nNew == nOld и выход из DoTimer


Понял , сделал так
 
FUNC DoTimer( o3,o4 )
LOCAL nNew := GetProperty(o3:cParentWnd, 'Buf' , 'Cargo')
LOCAL nOld := GetProperty(o3:cParentWnd, 'oBrw3', 'Cargo')

If o3:loBrw3Ready

If empty(nNew)
RETURN NIL
EndIf

If nNew != nOld
//SetProperty(o3:cParentWnd, 'MyTimer', 'Enabled', .F.)
Myfilter(o3,o4)
// тут перепоказ правого тсб
// ставим scope\filter и ....
SetProperty(o3:cParentWnd, 'oBrw3', 'Cargo', nNew)
// SetProperty(o3:cParentWnd, 'MyTimer', 'Enabled', .t.)
EndIf
endif

RETURN NIL



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

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




Пост N: 1280
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 14:29. Заголовок: Dima пишет Но правый..


Dima пишет
 цитата:
Но правый бровс не обновляется после как я перестал двигаться по левому


так и задумано, работай теперь с правым (по правым кнопкам)
сместишь левый - получишь новый правый и т.д.
разве не так надо было ?

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




Пост N: 6101
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 14:32. Заголовок: я кажется понял в че..


я кажется понял в чем дело
Поставил заглушку на Bchange ))
Переделал на
oBrw3:bChange := {|| SetProperty(obrw3:cParentWnd, 'Buf', 'Cargo', (obrw3:cAlias)->( RecNo() ))}

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




Пост N: 1281
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 14:37. Заголовок: PS Если не двигаемся..


PS
Если не двигаемся, но через время надо перечитать с сервера, надо стелать чсетчик сек. и обновлять nOld := 0 :
 
FUNC DoTimer( o3,o4 )
LOCAL nNew := GetProperty(o3:cParentWnd, 'Buf' , 'Cargo')
LOCAL nOld := GetProperty(o3:cParentWnd, 'oBrw3', 'Cargo')
STATIC nRefr := 0
...
nRefr += 1

If nRefr > 5
nOld := 0
EndIf
If nNew != nOld
...


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




Пост N: 6102
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 14:43. Заголовок: Вообще была идея вык..


Вообще была идея выключать Таймер в Bchange , вот только не понятно когда его включить , если этого не сделать
и двигаться зажав кнопку вниз , правый бровс все равно будет обновляться НО с интервалом уставленным в таймере

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




Пост N: 1282
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 14:49. Заголовок: Dima пишет правый бр..


Dima пишет
 цитата:
правый бровс все равно будет обновляться НО с интервалом уставленным в таймере


По мне, это приемлемо - видно что все работает (главное правый тсб автономно сам ставит что надо)
Реакция отображения правого тсб 1-2 сек. - это нормально

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




Пост N: 6103
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 14:53. Заголовок: SergKis пишет: Реак..


SergKis пишет:

 цитата:
Реакция отображения правого тсб 1-2 сек. - это нормально


Мне показалось это время не приемлемо большим и поставил 200 мс

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




Пост N: 1283
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 15:01. Заголовок: Dima пишет Мне показ..


Dima пишет
 цитата:
Мне показалось это время не приемлемо большим и поставил 200 мс


Думаю, ты очень горячися и подгоняешь клиента к убыстренной работе, ему некогда подумать, попить чаю\кофе ...


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




Пост N: 6104
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 15:13. Заголовок: Когда таймер жил пря..


Когда таймер жил прямо в бровсе , понятно что были с этим проблемы , но по крайней мере при движении по главному
бровсу , подчиненный молчал как партизан. Остановил движение и правый обновился.


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




Пост N: 1284
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.16 15:55. Заголовок: Dima пишет подчиненн..


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


Так тут тоже можно сделать такое, отображать не при nNew != nOld, а при nNew == nOld по счетчику входов,
типа 3 раза вошли по тимер и nNew == nOld отображаем, надо немного усложнить тимер, мне всегда было лениво

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




Пост N: 6106
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 16:05. Заголовок: SergKis Понял. Спас..


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

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




Пост N: 1059
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.16 23:31. Заголовок: Дима, глянул твои ис..


Дима, глянул твои исходники внимательно и почитал все что написали.
Сорь раньше не мог.
Есть пару мыслей....
Во первых таймер не убивается каждые 50 мс а лишь тогда когда юзер оторвет палец от колеса. Проблема с утечкой памяти... Возможно и есть , но у себя не наблюдаю глюков.
А главная проблема мне кажется в исходнике - процедура myfilter не успевает выполниться за 50 мс и не происходит выравнивания номера записи и логикпос., это приводит к следующему тику таймера ит
д..
Уверен если задержку сделать 200 и перенести майфильтр в конец ( перед return) то основная причина глюка уйдет.
Что касается утечки, то можно на каждую 10 прорисовку второго бровса повесить сборщик мусора.
Сори за мой французский, пишу с мобилы.
У себя оставлю пока так. Позже переделаю на флаги, таймер инициализировать буду по инит бровса, а убивать при закрытии бровсе. Тогда и утечек не будет.

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




Пост N: 6111
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.16 23:36. Заголовок: Haz пишет: Сори за ..


Haz пишет:

 цитата:
Сори за мой французский, пишу с мобилы.


Игорь все нормально , кажется проблема решена.
Пошел по пути как посоветовал Сергей.
Отдал клиенту , если что то он будет стучать в рельсу.
Я сам долго ездил после доработки по бровсу , проблем не увидел.

Haz пишет:

 цитата:
Проблема с утечкой памяти...


Может и так , но мне этот гимор надоел. Нужно было просто сделать рабочий вариант что бы ни чего не глючило.
Вроде получилось.

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




Пост N: 1293
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.16 10:22. Заголовок: Делал для Andrey при..


Делал для Andrey примеры, может кому сгодится (на одну тему, но по разному сделаны)
http://my-files.ru/1quo1w
http://my-files.ru/ct7m3d

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




Пост N: 1294
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.16 10:49. Заголовок: PS копипастил и забы..


PS
копипастил и забыл исправить в примере из Tsb_form_1.7z функция MyButton на всех кнопках надо заменить
 
ACTION ( MsgBox(This.Name+CRLF+This.BaseName.Value, cForm), ;
TBrw_Obj(cBrw, cForm):SetFocus() ) ;



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




Пост N: 1040
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 22.11.16 12:05. Заголовок: Почему не работает поиск?


Задачка для знатоков TSBrowse

Получил такой вопрос (в заголовке поста) на бразильском форуме.

Текст примера см. ниже
Скрытый текст



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




Пост N: 1304
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.11.16 15:54. Заголовок: gfilatov2002 пишет П..


gfilatov2002 пишет
 цитата:
Получил такой вопрос ... Почему не работает поиск?


 
1.
J := 0
For i = 1 To 30
File2->( DBAppend() )
File2->Codigo := StrZero( j, 4 )
File2->Descri := 'Product Name ' + StrZero( j, 4 )
j += 500 // будет переполнение StrZero( j, 4 ), т.е. ****
Next

2.
Function oAuxDSMGPosi()
cClassif := oAuxDSMG.Lb_xxx.Value
_LogFile(.T., cClassif) // ==> 00000000000
If cClassif <> Space( 11 ) // это не сработает, т.к. len(cClassif) == 11 тут

3. Так работает

Function Main()

Local NomArq1 := {}
Local NomArq2 := {}
Local NomArq3 := {}

PRIV cClassif, oBrw_Div, oBrw_Sec, oBrw_Mar, oBrw_Gru

SET SOFTSEEK ON

RDDSETDEFAULT('DBFCDX')

FErase('File1.DBF')
FErase('File1.CDX')
FErase('File2.DBF')
FErase('File2.CDX')
FErase('File3.DBF')
FErase('File3.CDX')
FErase('File4.DBF')
FErase('File4.CDX')
...
Function oAuxDSMGPosi()
Local nRec
// cClassif := oAuxDSMG.Lb_xxx.Value
// If cClassif <> Space( 11 )
File1->( DBSetOrder( 1 ) )
File1->( DBSeek( SubStr( cClassif, 1, 2 ) ) )
nRec := File1->( RecNo() )
File1->( DBSetOrder( 2 ) )
oBrw_Div:SetFocus()
oBrw_Div:Reset() // если коменировать эти строки, то
oBrw_Div:GotoRec(nRec) // раскоментировать которые ниже (вроде и так и так работает)

// oAuxDSMG.oBrw_Div.Value := nRec
// oBrw_Div:SetFocus()
// oBrw_Div:DrawSelect()
// oBrw_Div:Refresh( .T. )
// For i = 1 To 13
// oBrw_Div:RefreshARow( i )
// Next
...
// EndIf

дальше не анализировал.


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




Пост N: 1041
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 22.11.16 16:36. Заголовок: SergKis пишет: даль..


SergKis пишет:

 цитата:
дальше не анализировал


Благодарю за проведенный анализ

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



Пост N: 195
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 23.11.16 09:26. Заголовок: Функции ChangeXX сра..


Функции ChangeXX срабатывают раньше чем oAuxDSMGPosi соответственно
oAuxDSMG.Lb_xxx.Value уже обновилось значениями с текущей позиции в DBF, т.е. нулями,
затем выполняется поиск в oAuxDSMGPosi

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




Пост N: 1042
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.11.16 11:16. Заголовок: nick_mi пишет: Функ..


nick_mi пишет:

 цитата:
Функции ChangeXX срабатывают раньше чем oAuxDSMGPosi


Благодарю за Ваше пояснение
Но теперь другая (и основная) проблема - не обновляется при старте File2 TBROWSE

Полный код исправленного примера см. ниже
Скрытый текст


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




Пост N: 1306
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.11.16 12:50. Заголовок: Может не очень вруба..


Может не очень врубаюсь в сущность примера, но когда и от чего должны происходить переотображения тсб и в какой последовательности, т.е. где паровоз\лошадь ?
Вроде пример на создание\расшифровку составного кода, если да, то должна была бы быть база его откуда плясать (изменение позиции с ключом меняет все тсб).
Если это просто передвигаем любой тсб и что то должно произойти во ВСЕХ тсб, то это другое и должно происходить по таймеру (сменилось в label, сменилось в тсб).


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




Пост N: 1307
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.11.16 12:54. Заголовок: PS или onchange labe..


PS
или onchange label, в который пишем

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




Пост N: 1043
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.11.16 13:34. Заголовок: SergKis пишет: когд..


SergKis пишет:

 цитата:
когда и от чего должны происходить переотображения тсб


Судя по логике примера, чел хочет, чтобы при инициализации окна корректно обновлялись все четыре TBROWSE.
Он заметил, что если мало строк до конца списка в окошке, то TBROWSE корректно не обновляется, что и демонстрирует этот пример для случая File2. Если лучше обновлять по таймеру, то возможно ли отрехтовать данный пример для корректного отображения данных после поиска при инициализации окна

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



Пост N: 196
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 23.11.16 14:05. Заголовок: SergKis пишет: не о..


SergKis пишет:

 цитата:
не очень врубаюсь в сущность примера


SergKis пишет:

 цитата:
должна была бы быть база его откуда плясать (изменение позиции с ключом меняет все тсб)


Там, похоже, из 4-х разных таблиц набирают какие-то коды характеристик, независимые от предыдущих и
последующих характеристик

gfilatov2002 пишет:

 цитата:
Но теперь другая (и основная) проблема - не обновляется при старте File2 TBROWSE


Объяснить не могу но если добавить строку - обзначена красным, то вроде все нормально
            File2->( DBSetOrder( 1 ) )  
File2->( DBSeek( SubStr( cClassif, 3, 4 ) ) )
nRec := File2->( RecNo() )
File2->( DBSetOrder( 2 ) )
oBrw_Sec:SetFocus()
oBrw_Sec:Reset()
oBrw_Sec:GotoRec(nRec)
oBrw_Sec:Skip(0)





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




Пост N: 1308
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.11.16 14:13. Заголовок: gfilatov2002 пишет С..


gfilatov2002 пишет
 цитата:
Судя по логике примера, чел хочет, чтобы при инициализации окна корректно обновлялись все четыре TBROWSE.


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

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




Пост N: 1309
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.11.16 14:21. Заголовок: nick_mi пишет Объясн..


nick_mi пишет
 цитата:
Объяснить не могу но если добавить строку - обзначена красным, то вроде все нормально


Если это годится, то рихтовать не буду.
nick_mi

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


Пост N: 1336
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 23.11.16 14:26. Заголовок: SergKis пишет: сам..


SergKis пишет:

 цитата:
сами тсб между собой не связаны.


Вот-вот

gfilatov2002 пишет:

 цитата:
чел хочет, чтобы при инициализации окна корректно обновлялись все четыре TBROWSE.


Так вы посоветуйте челу изучить азы ООП

если он создал 4 объекта browse, то пускай их и спользует через доступные методы, а не напрямую

File2->( DBSetOrder( 1 ) )
File2->( DBSeek( SubStr( cClassif, 3, 4 ) ) )

Да это чаще всего будет работать - но при этом вы игнорируете всю внутреннюю логику работы browse.
И не позволит обнаружить ошибки в логике такой роботы - если они там есть.

Для синхронизации связанных browse есть метод SyncChild (я что-то нигде не увидел примера его использования), так будет корректнее чем через таймер (ИМХО здесь таймер - извращение).

Не ищите костыль

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




Пост N: 1044
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.11.16 14:33. Заголовок: nick_mi пишет: врод..


nick_mi пишет:

 цитата:
вроде все нормально


Благодарю за помощь
Обновляется, однако...

Петр пишет:

 цитата:
вы посоветуйте челу изучить азы ООП


Вот с этим как раз проблема - программируют на минигуи, в основном, люди старой школы

Не по теме.
На мой взгляд, это во многом объясняет использование Минигуи вместо полноценных ООП-систем типа HwGUI,
на изучение корректной работы которых требуется время


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


Пост N: 1337
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 23.11.16 14:47. Заголовок: Так обьясните ему, ..


Так обьясните ему, что ошибку он сотворил сам, не проводя процедур синхронизации состояния обьектов.
Но мой пост адресовался не только ему


 цитата:
	File1->( DBSetOrder( 1 ) )  
File1->( DBSeek( SubStr( cClassif, 1, 2 ) ) )
nRec := File1->( RecNo() )
File1->( DBSetOrder( 2 ) )

_SyncObject( oBrw_Div, nRec )

File2->( DBSetOrder( 1 ) )
File2->( DBSeek( SubStr( cClassif, 3, 4 ) ) )
nRec := File2->( RecNo() )
File2->( DBSetOrder( 2 ) )

_SyncObject( oBrw_Sec, nRec )
...

static procedure _SyncObject( o, nRec )

o:SetFocus()
o:Reset()
o:GotoRec(nRec)
o:Skip(0)
// and more

return




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




Пост N: 1310
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.11.16 14:47. Заголовок: Петр пишет так будет..


Петр пишет
 цитата:
так будет корректнее чем через таймер (ИМХО здесь таймер - извращение).


Достаточно спорное утверждение. Крутим колесико и мелькание связанных тсб обеспечено. У Димы, недавно, была задачка на эту тему.
 цитата:
Для синхронизации связанных browse есть метод SyncChild


Особых преимуществ метод не дает. Он связывает ведущий тсб с подчинеными, соответствующими блоками кода.
Это мило и симпатично, но тоже самое можно решить и др. способами. На любителя ООП (их тут мало с МиниГуи работающих)

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


Пост N: 1338
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 23.11.16 15:11. Заголовок: SergKis пишет: Дост..


SergKis пишет:

 цитата:
Достаточно спорное утверждение.


Там было ИМХО, а потом здесь. Про проблемы Димы читал, но утверждать, что решить их нельзя и др. способами не буду

Смысл моего поста - нельзя игнорировать логику поведения обьекта. А потом еще и удивляться (или, не дай бог, возмущаться).
Для любителей ООП в этом случае есть возможность наследования, для остальных - костыль или не пользоваться

SergKis пишет:

 цитата:
Особых преимуществ метод не дает. Он связывает ведущий тсб с подчинеными, соответствующими блоками кода.
Это мило и симпатично, но тоже самое можно решить и др. способами. На любителя ООП (их тут мало с МиниГуи работающих)



Нет-нет, спора не будет


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




Пост N: 5188
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.11.16 20:10. Заголовок: Вопрос возник уже да..


Вопрос возник уже давно решить не могу !
Как бороться с не показом вертикального скролинга (стрелка внизу отгрызана) ? Юзера прикалываются....

При показе таблицы делаю:
oBrwX:lNoHScroll := .T. // НЕТ показа горизонтального скролинга
oBrwX:ResetVScroll() // показ вертикального скролинга

Первый раз таблица отображается нормально.

После перепоказа по другим индексам делаю типа так:
nOrder := IIF(lCity,2,1)
SELECT(cAlias)
DBSetOrder(nOrder)
SetProperty(oBrwX:cParentWnd, oBrwX:cControlName, "Enabled", .F.)
oBrwX:lNoHScroll := .T. // НЕТ показа горизонтального скролинга
oBrwX:ResetVScroll() // показ вертикального скролинга
oBrwX:Reset()
oBrwX:Refresh(.T.)
oBrwX:Upstable()
SetProperty(oBrwX:cParentWnd, oBrwX:cControlName, "Enabled", .T.)
oBrwX:Setfocus()

Показывается вертикальный скролинг и стрелка внизу отгрызана.....
Да и в добавок потом НИКАК не убирается горизонтальный скролинг.
Что не так делаю ?


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




Пост N: 6140
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.11.16 22:31. Заголовок: Andrey пишет: Как б..


Andrey пишет:

 цитата:
Как бороться с не показом вертикального скролинга


oBrw4:bChange := {|| oBrw4:oVScroll:SetRange( 0, 0 ) }

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




Пост N: 5189
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.11.16 12:19. Заголовок: Спасибо Дима ! :sm3..


Спасибо Дима !
Чудо свершилось, чуток переделал и горизонтальный скролинг пропал, а вертикальный стал нормально показываться:
SetProperty(oBrwX:cParentWnd, oBrwX:cControlName, "Enabled", .F.) 
oBrwX:bChange := {|| oBrwX:oHScroll:SetRange( 0, 0 ) }
oBrwX:Reset()
oBrwX:Refresh(.T.)
oBrwX:Upstable()
SetProperty(oBrwX:cParentWnd, oBrwX:cControlName, "Enabled", .T.)
oBrwX:Setfocus()


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


Пост N: 617
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 28.11.16 11:51. Заголовок: TsBrows И COMBOBOX


Есть основная база, к примеру, MIBLP.dbf. Есть вторая база - INFEKZII.dbf, это источник данных
Пример, заготовка здесь - TsBrows И COMBOBOX

Хотелось , бы
1) чтобы в TsBrows в поля 'KRANK1','KRANK2','KRANK3' был подключены COMBOBOX и можно было бы производить выбор данных
из второй базы (подобное возможно, но примеры которые есть сильно перегружены лишней информацией)
2)в Combo_1, который на поле формы отображалось значение , к примеру поля 'KRANK1' базы MIBLP.dbf. Но в то же время была-бы возможность изменить
данные выбором из сомбо

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




Пост N: 1324
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.11.16 15:03. Заголовок: Vlad04 пишет Хотелос..


Vlad04 пишет
 цитата:
Хотелось , бы


Тут вариант http://my-files.ru/q9hcvw


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


Пост N: 618
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 28.11.16 19:40. Заголовок: Не просто.Если прогр..


Не просто.Если программа большая, запутаться легко. Почему-то в Browse в подстановке в поле базы данных из массива через комбобох
нет особых проблем.


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




Пост N: 1325
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.11.16 20:32. Заголовок: Vlad04 Может так про..


Vlad04 Может так проще http://my-files.ru/ltps9w

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




Пост N: 1326
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.11.16 21:27. Заголовок: Vlad04 Т.к. TBROWSE..


Vlad04
Т.к. TBROWSE_1 private, может быть public, то упростить можно еще так
 
FUNC Combo_Enter()
Local cForm := ThisWindow.Name
Local cComb := This.Name
Local oBrw := TBROWSE_1
// Local cBrw := "TBROWSE_1"
// Local oBrw := _HMG_aControlIds[ GetControlIndex(cBrw, cForm) ]
Local oCol := oBrw:GetColumn[cComb]
Local nVal, cVal

nVal := This.&(cComb).Value
cVal := This.&(cComb).Item(nVal)
Eval(oCol:bPostEdit, cVal, oBrw)
oBrw:SetFocus()

RETURN NIL

и в блоках кода вместо obr использовать TBROWSE_1
Я не исп. Public\Private потому использую параметры блоков кода

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




Пост N: 1327
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.11.16 21:59. Заголовок: Vlad04 подправил, с..


Vlad04
подправил, с учетом уст. курсора тсб на любой колонке и модификация инф. из combobox
 
FUNC TBrowse_1_Sets()
...
:GetColumn('KRANK3'):bPostEdit := bPost

:GoPos(1, 1)
:SetFocus()

END WITH
...
FUNC Combo_Enter()
Local cForm := ThisWindow.Name
Local cComb := This.Name
Local oBrw := TBROWSE_1
Local oCol := oBrw:GetColumn(cComb)
Local nVal, cVal

nVal := This.&(cComb).Value
cVal := This.&(cComb).Item(nVal)
(oBrw:cAlias)->( FieldPut(FieldPos(cComb), cVal) )
oBrw:SetFocus()

RETURN NIL


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


Пост N: 619
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 29.11.16 11:22. Заголовок: SergKis Спасибо Пок..


SergKis
Спасибо
Пока остановился на таком варианте:
По горячей клавише или Клику открывается вспомогательная форма, там редактирую и т.д.
И все таки , почему же в Browse проще?

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




Пост N: 1328
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.11.16 12:15. Заголовок: Vlad04 пишет И все т..


Vlad04 пишет
 цитата:
И все таки , почему же в Browse проще?


Обманчивая видимость простоты. Мои клиенты категорически отказались работать с InplaceEdit, т.к. оно
реализовано на модальном окне и мелькание фокуса с бровсе на ячейку - глаз\нервы не держат.
Выделение на мод. окно объекта коректировки, позволяет разделить сообщения управления бровсе и
контрола коректировки. Вот кусочек текста.Скрытый текст

В тсб все управление сообщениями таблицы и контрола edit заложено в объект блоками кода.
Думаю, немного попривыкнув\изучив, сложности не будет в понимании.


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




Пост N: 1329
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.11.16 15:12. Заголовок: Vlad04 По поводу кр..


Vlad04
По поводу краткости записи. Пример тот же Скрытый текст



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




Пост N: 5191
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.11.16 19:53. Заголовок: SergKis пишет: :Set..


SergKis пишет:

 цитата:
:SetData('KRANK1', , aKRANK1)


Что за параметр :SetData() ?


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


Пост N: 1354
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 29.11.16 22:35. Заголовок: Andrey пишет: Что з..


Andrey пишет:

 цитата:
Что за параметр :SetData() ?


SetData это метод - функция с 3-мя параметрами


 цитата:
Это мило и симпатично, но тоже самое можно решить и др. способами. На любителя ООП (их тут мало с МиниГуи работающих)



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




Пост N: 1330
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 29.11.16 23:11. Заголовок: Петр :sm36: :Get..


Петр

:GetColumn('KRANK1'):aItems := aKRANK1
:GetColumn('KRANK1'):lComboBox := .T.

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


Пост N: 620
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 30.11.16 11:24. Заголовок: SergKis По поводу к..


SergKis

 цитата:
По поводу краткости записи


Да уж, на счет краткости слов нет.
1) Почему-то периодически вылетает программа (ваша редакция) с ошибкой - Выход за границы массива.
Связь не уловил.
2) Перенес код с тестовой в настоящую программу. Комбобокс создается , но почему-то на первом слева поле, где его не должно быть

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


Пост N: 621
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 30.11.16 11:29. Заголовок: Колонки я добавляю т..


Колонки я добавляю так

 цитата:

...
ADD COLUMN TO Brw_1 DATA FieldWBlock(..
...



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




Пост N: 1050
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.11.16 12:00. Заголовок: Vlad04 пишет: Почем..


Vlad04 пишет:

 цитата:
Почему-то периодически вылетает программа (ваша редакция) с ошибкой


Проверь эту строку в примере

 цитата:
COLSIZES 50,130,130,130,130,130


TBROWSE имеет 5 колонок, а размеры установлены для шести колонок
Отсюда имеем вылет в методе :nAtColl()

P.S. Поправил эту бяку в исходнике библиотеки TsBrowse, теперь не вылетает

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


Пост N: 622
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 30.11.16 12:44. Заголовок: gfilatov2002 теперь..


gfilatov2002

 цитата:
теперь не вылетает


Да, всё нормально.
А что же определяет привязку комбобокса к колонкам ?


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




Пост N: 1335
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 30.11.16 20:52. Заголовок: Vlad04 пишет А что ж..


Vlad04 пишет
 цитата:
А что же определяет привязку комбобокса к колонкам ?


:SetData( nColumn, bData, aList )
nColumn (номер колонки) может быть задано симв. именем колонки из ADD .... NAME ...
:GetColumn(5):cName := "..."
:LoadFields(.T.\.F.) ставит :cName от имени поля

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


Пост N: 623
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 01.12.16 11:21. Заголовок: SergKis Все хорошо...


SergKis
Все хорошо. Если указываешь НОМЕР колонки - происходит правильная
привязка комбобокса .

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


Пост N: 626
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 04.12.16 17:38. Заголовок: TsBrowse и дизайнер


TsBrowse и дизайнер

Работа с компонентами оказывается отличается, если форму вы построили в дизайнере или описали в программном
коде. Это возможно связано с видимостью переменных.
Вот пример построения TsBrowse в IDE, который идет в поставке MiniGui.
Добавим на форму компоненты, связанные с TsBrowse (вполне обычная ситуация)
[url=https://cloud.mail.ru/public/4taw/Yc13QvLBM]TsBrowseTsBrowse[/url]
Компилируется без ошибок, но при запуске не работает

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


Пост N: 627
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 04.12.16 17:39. Заголовок: Ссылка..

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




Пост N: 1336
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.12.16 18:35. Заголовок: Vlad04 пишет Компили..


Vlad04 пишет
 цитата:
Компилируется без ошибок, но при запуске не работает


Проверяйте наличие контроллов в процедуре Chang_Tbr() или перенесите TSB в конец (перед END WINDOW) в fmg файле.
В каком то примере выше, я уже проделывал такую штуку и не забывайте объявлять переменную
PUBLIC\PRIVATE TBROWSE_1 для DEFINE TBROWSE, в ней созданный объект tsb

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


Пост N: 628
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 04.12.16 18:51. Заголовок: SergKis Однако ! П..


SergKis
Однако !
Про объявление переменных думал, а вот это

 цитата:
перенесите TSB в конец (перед END WINDOW) в fmg


новость.На такую тонкость в каком-то примере не обратил внимания.

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




Пост N: 1337
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.12.16 19:01. Заголовок: Vlad04 пишет новость..


Vlad04 пишет
 цитата:
новость


При создании тсб (прорисовка строк) срабатывает :bChange, в нем обращение к несуществующим еще контроллам.
Без него было бы все ок! Перед END WINDOW (после IDE) можно ставить вызов функции\процедуры для инициализации
созданных IDE контроллов и для тсб устанавливать все блоки кода, например
TBROWSE_1:bChange := {|| Change_Tsb() }


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


Пост N: 629
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 04.12.16 19:29. Заголовок: SergKis Посмотрите...


SergKis
Посмотрите.
Как комбо подключить к какому- нибудь полю бровзе?
Может где-то в коде?

Или Value в сомбо это индекс Item?

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




Пост N: 1338
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.12.16 03:55. Заголовок: Vlad04 пишет Как ком..


Vlad04 пишет
 цитата:
Как комбо подключить к какому- нибудь полю бровзе?


Был пример Tsb_combo_demo2.7z и в нем 3-и поля с 3-мя сомбо связаны Скрытый текст

 цитата:
Value в сомбо это индекс Item?

Да


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


Пост N: 631
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 05.12.16 14:28. Заголовок: Если задача только о..


Если задача только отображать данные в комбобоксе, то можно применить свойство
DISPLAYEDIT .T.
click here


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


Пост N: 632
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 05.12.16 17:20. Заголовок: click here..

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




Пост N: 6191
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.12.16 18:35. Заголовок: SergKis В общем сно..


SergKis
В общем снова полезли глюки , если интенсивно ездить по бровсу.
По началу пропали все иконки в бровсе , после того как из бровса вышел , в главном
окне потерялся IMAGE и перекалапуцало главное меню.
Таймер сделан как ты и советовал.
Беда с этим бровсом...

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


Пост N: 1369
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 13.12.16 21:58. Заголовок: Dima пишет: перекал..


Dima пишет:

 цитата:
перекалапуцало главное меню.



Это как?

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




Пост N: 6192
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.12.16 22:24. Заголовок: Петр пишет: Это как..


Петр пишет:

 цитата:
Это как?


Да все посдвигалось , фон главного окна куда то пропал , картинка в главном окне улетела в пятое измерение ,
статус бар главного окна хаотично сменил цвета......
При чем по TsBrowse я поездил минут 5 и оставил , поработал в другой проге , затем вернулся туда же ,
снова поездил хаотично то клавишами то колесом мыши , вышел покурить....снова поездил ...пошел
сделал кофе , ну и тд и после только начав ездить ......понеслись глюки.

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


Пост N: 1370
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 13.12.16 22:36. Заголовок: А с меню что? Фон г..


А с меню что?

Фон главного окна как задается? BKBRUSH?
Картинка как выводится, какой командой?

В TsBrowse живет таймер постоянно?
Он срабатывает даже если комп переходит в режим ожидания (кофе с перекуром)?

А без кофе такое случается?





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




Пост N: 6193
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.12.16 00:03. Заголовок: Петр Вопросы понял ..


Петр
Вопросы понял , обмозгую завтра и отвечу.
Спасибо !

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




Пост N: 6194
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.12.16 09:47. Заголовок: Петр пишет: Фон гла..


Петр пишет:

 цитата:
Фон главного окна как задается? BKBRUSH?


BACKCOLOR { 99,99,99 }

Петр пишет:

 цитата:
Картинка как выводится, какой командой?


DEFINE IMAGE внутри описания окна

Петр пишет:

 цитата:
В TsBrowse живет таймер постоянно?


Таймер живет в окне (WINDOWTYPE STANDARD) а уже в этом окне живут 2 TsBrowse
После закрытия окна таймер должен я так понимаю , сам самоликвидироваться

Петр пишет:

 цитата:
Он срабатывает даже если комп переходит в режим ожидания (кофе с перекуром)?


Получается что да
 
DEFINE TIMER MyTimer INTERVAL 400 ACTION DoTimer(oBrw3,obrw4)
This.MyTimer.Enabled := .t.
END WINDOW


Как только заглючил TsBrowse , начинаются глюки во всей проге.

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


Пост N: 1371
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.12.16 17:31. Заголовок: По мне, так некоррек..


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

Dima пишет:

 цитата:

Получается что да


И вот этот момент немного меня смущает.

А на утечку ресурсов приложения смотрели
GDIView

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

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




Пост N: 6195
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.12.16 17:58. Заголовок: С GDIView ранее не р..


С GDIView ранее не работал. Не понятно где смотреть утечку.
Вероятно показывать счетчики изменений.
После "падения" уже , вижу следующее.
Так в колонке BRUSH вижу 27 [+4]
Bitmap 9746 [+9568]
Шрифт 42 [+4]

В диспетчере задач после загрузки получил на задаче цифирь 3788 а когда все рухнуло 3948 (использование памяти)
При этом проц грузануло на 25 % , после чуть отпустило до 8 % , но нормально выйти не смог , снял задачу.

Петр пишет:

 цитата:
Самодостаточный пример с глюками нужен.


Согласен. Не много по текущей работе разберусь и попробую сделать.

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


Пост N: 259
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 14.12.16 18:05. Заголовок: Петр пишет: По мне,..


Петр пишет:

 цитата:
По мне, так некорректно обрабатываются сообщения, в часности WM_PAINT, а вот дальше без исходников - гадание на кофейной гуще.


Складывается впечатление, что "теряется" активное окно. Конечно таймер к этой ситуации это от лукавого :)) Ошибке уже лет десять, поэтому вот в этих исходниках она уже есть. https://cloud.mail.ru/public/8Xve/UTv9YCg65 Это первоисточник, так что может что и даст :)


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


Пост N: 1372
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.12.16 18:34. Заголовок: Dima пишет: Вероятн..


Dima пишет:

 цитата:
Вероятно показывать счетчики изменений.



Да, сравнение до и после.

Если все сделано аккуратно и правильно, то создали кисточку нарисовали что-то - удалили, тоже с картинками и т.д. - ресурсы нужно использовать экономно.

Значит если есть разница счетчиков - ресурсы освобождаются некорректно, это в MiniGUI еще встречается - теперь нужно по возможности локализировать место утечки.


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




Пост N: 6196
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.12.16 18:47. Заголовок: Петр Понял , поигра..


Петр
Понял , поиграюсь еще.

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


Пост N: 1374
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.12.16 18:48. Заголовок: ММК пишет: Ошибке ..


ММК пишет:

 цитата:
Ошибке уже лет десять, поэтому вот в этих исходниках она уже есть.


И что не нашли?

:HandleEvent() можно (нужно) трасить

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




Пост N: 6197
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.12.16 18:56. Заголовок: Долго играть не приш..


Долго играть не пришлось.
Открыл бровс. Показания BITMAP в GDIVIEW 234 [0]
Опустился стрелкой вниз на 5 строк в бровсе , получил 234 [+56]
Еще 5 строк , 472 [+274]
Похоже утечка с показом иконок и картинок в TsBrowse , но спешить с выводами не буду
и проверю на примерах из поставки Минигуи.

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




Пост N: 6198
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.12.16 14:58. Заголовок: Поигрался в свое про..


Поигрался в свое проге + GDIVIEW
В некоторых полях использую вывод BMP из ресурса.
Заявлено примерно так
 
oBrw3:GetColumn( "dels" ):uBmpCell :={|| if( (oBrw3:calias)->dels,LOADIMAGE("wcanc"),NIL) }
.........
oBrw3:GetColumn( "prm" ):uBmpCell :={|| if( !empty((oBrw3:calias)->prime),LOADIMAGE("rss_brw"),NIL) }

В этом случае в GDIVIEW в колонке BitMap цифра постоянно растет , даже если закрыть окно
с бровсом а после войти туда снова. При езде по самому бровсу эта цифра так же растет.
Пробнул в LoadImage сунуть имя не существующего ресурса , показа картинок в этом случае
нет что и понятно , но и утечки нет однако.
Поюзал в такой связке примеры из Минигуи где картинка в бровс помещается не из ресурса
а из файла на диске , в этом случае утечки так же нет.

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




Пост N: 6199
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.12.16 15:42. Заголовок: Кажись понял :sm12:..


Кажись понял
Вот так не совсем верно
oBrw3:GetColumn( "dels" ):uBmpCell :={|| if( (oBrw3:calias)->dels,LOADIMAGE("wcanc"),NIL) }

Необходимо в самом начале проги сделать примерно так
Public abmp3:={LOADIMAGE("wcanc"),LOADIMAGE("rss_brw")}

а далее
oBrw3:GetColumn( "dels" ):uBmpCell :={|| if( (oBrw3:calias)->dels,abmp3[1],NIL) }

В этом случае таких глобальных утечек не будет.
А так при езде по бровсу без этих изменений постоянно грузился новый экземпляр пикчи.

PS
Лень делать проверку , но думаю если устроить цикл от 1 до 5 тыщ (может больше) и в нем грузить одну
и туже пикчу из ресурса с помощью LOADIMAGE , то прога "ляжет".....
Примеры типа TSB_CURSOR если долго их "напрягать" тоже лягут , так как при любом сдвиге
записи в таблице постоянно грузится новый экземпляр Calendar.BMP , это хорошо видно в GDIVIEW.

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


Пост N: 260
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 15.12.16 16:24. Заголовок: Петр пишет: И что н..


Петр пишет:

 цитата:
И что не нашли?


TsBrows перестали использовать т.к. появился xBrows и вопросы отпали :)

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




Пост N: 1055
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.12.16 16:50. Заголовок: Dima пишет: Примеры..


Dima пишет:

 цитата:
Примеры типа TSB_CURSOR если долго их "напрягать" тоже лягут


Благодарю за сообщение!
Поправил этот пример для новой сборки (см.ниже)
Скрытый текст


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


Пост N: 1376
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 16.12.16 19:15. Заголовок: Dima пишет: Кажись ..


Dima пишет:

 цитата:
Кажись понял



Глюки ушли совсем?

P.S. Поздравляю с освоением нового инструмента - GDIVIEW

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




Пост N: 5253
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.12.16 19:15. Заголовок: ММК пишет: т.к. поя..


ММК пишет:

 цитата:
т.к. появился xBrows и вопросы отпали



А портировать xBrows в МиниГуи возможно ?
Ну там лицензия и т.д.

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


Пост N: 1377
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 16.12.16 19:22. Заголовок: Andrey пишет: А по..



Andrey пишет:

 цитата:
А портировать xBrows в МиниГуи возможно ?
Ну там лицензия и т.д.



Если у вас есть такая возможность, то портируйте, пожалуйста,

click here

или

click here

Там и лицензия позволяет, и многие были бы вам благодарны


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




Пост N: 6210
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.12.16 19:39. Заголовок: Петр пишет: Глюки у..


Петр пишет:

 цитата:
Глюки ушли совсем?

P.S. Поздравляю с освоением нового инструмента - GDIVIEW


Косяков больше не смог найти . Долго "ездил" , глюков нет.
Отдал заказчику , пусть обкатают.
Спасибо за наводку

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


Пост N: 1378
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 16.12.16 20:01. Заголовок: Dima пишет: Косяков..


Dima пишет:

 цитата:
Косяков больше не смог найти . Долго "ездил" , глюков нет.



Извините, конечно, за назойливость
Костыль в виде таймера убран? Или еще нужен?


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




Пост N: 6211
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.12.16 22:34. Заголовок: Петр пишет: Костыль..


Петр пишет:

 цитата:
Костыль в виде таймера убран? Или еще нужен?


Как бы костыля и не было. Изначально таймер жил в Tsbrowse а после поселился в окне где живут
дружно два бровса TS.
Вся ситуация как бы была описана выше.
На что намекаешь то ? :)
Косяков и утечек не увидел.

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




Пост N: 1061
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 16.12.16 23:06. Заголовок: Да по сути это и е..


Да по сути это и есть костыль т. к. заменяет обработку "отпускания" кнопки.
И пока этот костыль нужен. и вариантов кроме таймера не предвидится
Без этого "костыля" не понятно как организовать перерисовку подчиненных бровсоов,
а если их "сто пятьсот" - главный бровс возмет приз Гинеса по тормозам при скипе



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


Пост N: 1379
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 16.12.16 23:12. Заголовок: Dima пишет: На что ..


Dima пишет:

 цитата:
На что намекаешь то ? :)


Ни на что. Честно !

Если таймер используется только для синхронизации, то такое решение имеет право на существование.


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


Пост N: 1380
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 16.12.16 23:16. Заголовок: Haz пишет: Без этог..


Haz пишет:

 цитата:
Без этого "костыля" не понятно как организовать перерисовку подчиненных бровсоов,



Как бы задумывалось через SyncChild, а вот рациональный алгоритм для наступления этого события
продумать не мешало бы.

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




Пост N: 1062
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 17.12.16 00:10. Заголовок: Петр пишет: продума..


Петр пишет:

 цитата:
продумать не мешало бы.


Петр, да ктож против. Мы все локально и у себя, пытаемся этот алгоритм найти.
Многое предложил Сергей, кое что по мелочам я накидал, проф поправки есть и от тебя
(сорь на брудершафт пока не пили, уверен не обидел) . Это все не системно.
Может открыть тему Проблема TS - варианты - решение. Григорий один не вытянет.
К примеру подтема "как сделать отображение подчиненного бровса по ОТПУСКАНЮ
кнопки или отрыву пальца от колеса мыши?
Один из вариантов - именно таймер, но ведь есть и другие. Вот в этой теме их и собирать.
Пока по факту TS один из самых сильных инструментов в Minigui и.... один из самых непредсказуемых,
применрно половина времени на разработку ПО уходит на борьбу с его сюрпризами





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




Пост N: 1340
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.12.16 01:16. Заголовок: Петр пишет Как бы за..


Петр пишет
 цитата:
Как бы задумывалось через SyncChild, а вот рациональный алгоритм для наступления этого события
продумать не мешало бы.


SyncChild метод ставит ::bChange, т.е. портит установленный, а практически в каждом тсб он занят.
Даже этого достаточно, что бы метод не использовать.
Haz пишет
 цитата:
К примеру подтема "как сделать отображение подчиненного бровса по ОТПУСКАНЮ
кнопки или отрыву пальца от колеса мыши?


Тут больше гемороя, т.к. надо знать какому тсб и в какой ситуации, что посылать.
По мне, наличие таймера на контроле (тсб в частности), вполне приемлемое решение.
Принцип "все свое ношу с собой" в объекте, т.е. каждый тсб знает, что и при каких условиях надо делать\переотображать.

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




Пост N: 1341
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.12.16 08:56. Заголовок: PS По поводу обработ..


PS
По поводу обработчика в тсб. Можно добавить
 
DATA bEvents

METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse

Local nDelta, ix

Default ::lNoPaint := .F., ;
::lDontChange := .F.

If hb_IsBlock(::bEvents)
If ! empty( EVal(::bEvents, Self, nMsg, nWParam, nLParam) )
RETURN 1
EndIf
EndIf

...



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


Пост N: 262
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 17.12.16 10:23. Заголовок: Петр пишет: Если та..


Петр пишет:

 цитата:
Если таймер используется только для синхронизации, то такое решение имеет право на существование.



Для синхронизации есть ON CHANGE. С учетом того , что все другие бровсы работают нормально есть смысл посмотреть их и сравнить с TS.
Ситуация меняется , если изменить алгоритм перерисовки. Менется , если убирать утечки памяти , хотя возникает она и без использования иконок.
Мне кажется правильнее искать причину :) Ведь если оставлять этот бровс , то в него еще придется много чего добавлять , а с такими глюками это замок на песке.

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




Пост N: 1063
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 17.12.16 14:42. Заголовок: ММК пишет: Для синх..


ММК пишет:

 цитата:
Для синхронизации есть ON CHANGE.

к нему претензий, за исключением одной - не ловит ситуёвину ногда пользователь сел на кнопку и едет к примеру вниз не отпуская. Блок отрабатывает честно на каждом скипе, а если там перерисовка другого бровса или их несколько....
И пока вся эта гирлянда не отработает bChange не пустит на следующую запись. Причём это вполне рабочая ситуация, есть например реестр заказов, с каждым заказом связан его состав ( отдельный бровс) и графики платежей ( еще один). С каждым элементом состава заказа может быть связан технологический маршрут ( бровс по рабочим операциям на элемент заказа с контролем готовности).
Чтото подобное делал и стандартный bChange доводил пользователя до истерики, ну не удобно ему поиском.... хочет нажать на кнопочку и следить глазами если не увидел сразу то так и будет ездить туда сюда. Все подчиненные запросы ( сижу на ADS SQL) отработывают мгновенно, а перерисовка всех бровсов не дает быстро ездить да и постоянное мелькание начинает бесить.
Вот и возникает необходимость чтобы за этим bChange была слежка со стороны и игнорились слишком частые вызовы, а выполнялся только последний.
Вот так и появился таймер.



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


Пост N: 1382
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 17.12.16 15:06. Заголовок: SergKis пишет: Sync..


SergKis пишет:

 цитата:
SyncChild метод ставит ::bChange, т.е. портит установленный, а практически в каждом тсб он занят.
Даже этого достаточно, что бы метод не использовать.

"
А в каких случаях можно использовать SyncChild()?
Вот bChange с компанией используется как navigation codeblocks

DATA bLine, bSkip, bGoTop, bGoBottom, ;
bLogicLen, bChange // navigation codeblocks

bLine, bLogicLen, bChange - это navigation codeblocks - ну тоже мало понятно


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


Пост N: 1384
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 17.12.16 20:44. Заголовок: Haz пишет: Это все..


Haz пишет:

 цитата:
Это все не системно. Может открыть тему Проблема TS - варианты - решение.


Как-то я не могу правильно сформулировать свое отношение к предложению.

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

Т.е. допустим смотрю в код - да, возможно я бы не так написал, но ведь работает..
Или, допустим вопрос поднятый Димой, он вообще-то не к TS относился, за использование ресурсов GUI приложением отвечает разработчик.

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


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


Пост N: 1385
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 17.12.16 20:56. Заголовок: ММК пишет: С учетом..


ММК пишет:

 цитата:
С учетом того , что все другие бровсы работают нормально есть смысл посмотреть их и сравнить с TS.


Это не о MiniGUI, все остальные бровсы построены на LISTVIEW и обладают ограниченой функциональностью в сравнении с TS или другими словами в MiniGUI есть над чем поработать
ММК пишет:

 цитата:
Менется , если убирать утечки памяти , хотя возникает она и без использования иконок.


Утечка памяти это не абстрактное понятие, все утечки (памяти, USER - GDI object) можно как-то выявить и попытаться локализировать.
ММК пишет:

 цитата:
Ведь если оставлять этот бровс , то в него еще придется много чего добавлять


Опять же, мне кажется, что это не про MiniGUI, на текущем этапе развития TS нет чем заменить.


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


Пост N: 264
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 18.12.16 10:42. Заголовок: Петр пишет:  цитат..


Петр пишет:

 цитата:

 цитата:
С учетом того , что все другие бровсы работают нормально есть смысл посмотреть их и сравнить с TS.


Это не о MiniGUI, все остальные бровсы построены на LISTVIEW и обладают ограниченой функциональностью в сравнении с TS или другими словами в MiniGUI есть над чем поработать



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

Петр пишет:

 цитата:
Утечка памяти это не абстрактное понятие, все утечки (памяти, USER - GDI object) можно как-то выявить и попытаться локализировать.



Конечно. Здесь все понятно. Это просто моя неудачная попытка донести свое мнение :) Что проблема связана не с утечкой и не с временной задержкой.
Петр пишет:


 цитата:
Опять же, мне кажется, что это не про MiniGUI, на текущем этапе развития TS нет чем заменить.



:)

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




Пост N: 5271
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.12.16 15:24. Заголовок: Всем привет ! Как от..


Всем привет !
Как отцентровать шапку таблицы ?

Для ячеек таблицы нашёл как сделать:
         oBrw1:aColumns[5]:nAlign  := nMakeLong( DT_CENTER, DT_CENTER ) 
oBrw1:aColumns[5]:nHAlign := nMakeLong( DT_CENTER, DT_CENTER )


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




Пост N: 6222
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.12.16 15:27. Заголовок: Andrey пишет: oBrw1..


Andrey пишет:

 цитата:
oBrw1:aColumns[5]:nHAlign := nMakeLong( DT_CENTER, DT_CENTER )


сам и ответил

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




Пост N: 5272
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.12.16 16:05. Заголовок: Dima пишет: сам и о..


Dima пишет:

 цитата:
сам и ответил


Не центрует в шапке таблицы картинку ! Может по другому надо ?

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




Пост N: 6223
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.12.16 16:45. Заголовок: у меня примерно так ..


у меня примерно так и вроде ж по центру.

oBrw3:GetColumn("prm"):uBmpHead :=abmp3h[2]
oBrw3:GetColumn("prm"):cHeading :=""
oBrw3:SetColSize("prm", 25 )
oBrw3:GetColumn("prm"):nhAlign :=nMakeLong( DT_CENTER, DT_CENTER )


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




Пост N: 5275
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.12.16 15:37. Заголовок: Dima пишет: у меня ..


Dima пишет:

 цитата:
у меня примерно так и вроде ж по центру.


Попробуй 3 штуки (картинки) подряд вывести в заголовок таблицы. Как получиться ?
У меня 1-я картинка центрируется, остальные нет.

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




Пост N: 6226
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.12.16 15:59. Заголовок: Andrey пишет: У мен..


Andrey пишет:

 цитата:
У меня 1-я картинка центрируется, остальные нет


что то не так закодил
Пример для одной колонки
 
oBrw3:GetColumn( "dels" ):uBmpCell :={|| if( (oBrw3:calias)->dels,abmp3[1],NIL) }
oBrw3:GetColumn( "dels" ):lCheckBox := FALSE
oBrw3:GetColumn( "dels" ):nAlign :=nMakeLong( DT_CENTER, DT_CENTER )
oBrw3:GetColumn( "dels" ):bdata:={||""}
oBrw3:GetColumn("dels"):uBmpHead :=abmp3h[1]
oBrw3:GetColumn("dels"):cHeading :=""
oBrw3:SetColSize("dels", 25 ) // пробовал 125 - центрует норм
oBrw3:GetColumn("dels"):nhAlign :=nMakeLong( DT_CENTER, DT_CENTER )


В бровсе у меня 2 колонки у которых в Header живет BMP , все по центру.
Возможно сама BMP у тебя "широкая"

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




Пост N: 5276
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.12.16 16:36. Заголовок: Dima пишет: Возможн..


Dima пишет:

 цитата:
Возможно сама BMP у тебя "широкая"


Да нет - все одинаковые 28 пикселей.
У меня 4 колонки с картинками.
В ячейках нормально центрируются, в шапке таблицы 2 центрируются, 2 нет.



Поменял местами и ГЛЮК вылез опять - центрирование в шапке работает только на 2 колонки !



Попробуй у себя добавить (сделать дубль) ещё 2х колонок с картинками....


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




Пост N: 6227
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.12.16 16:48. Заголовок: Дай полный код 2 и 4..


Дай полный код 2 и 4 колонки

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




Пост N: 5277
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.12.16 17:59. Заголовок: Вот код, обработка п..


Вот код, обработка полей в цикле:
     FOR nI := 1 TO LEN(aPole) 

nJ++
ADD COLUMN TO TBROWSE oBrw1 // добавить новую колонку в TBROWSE
........
oBrw1:aColumns[nJ]:lEdit := .T.
........
If cTypeField == "L" // для полей Logic
oBrw1:aColumns[nJ]:cHeading := "" // заголовок колонки обнулить
oBrw1:SetColSize( nJ, 48 ) // ширина колонкм
oCol := oBrw1:aColumns[nJ]
oCol:lCheckBox := .T. // virtual checkbox
oCol:nEditMove := 0
oCol:cPicture := "" // шаблон колонки убрать
oCol:cDataType := "L" // !!!
IF cField == "MARK"
oCol:uBmpCell := {|| IF( (ALIAS())->MARK, LoadImage("tbCheckT28"), ) }
oCol:uBmpHead := {|| LoadImage( "tbCheckF28" ) } // картинка шапки таблицы
oCol:aBitMaps := { LoadImage("tbCheckT28") }
ELSEIF cField == "PRINT"
oCol:uBmpCell := {|| IF( (ALIAS())->PRINT, LoadImage( "TBPRINT32" ), ) }
oCol:uBmpHead := {|| LoadImage( "tbPrint32" ) } // картинка шапки таблицы
oCol:aBitMaps := { LoadImage("TBPRINT32") }
ELSEIF cField == "MAIL1"
oCol:uBmpCell := {|| IF( (ALIAS())->MAIL1, LoadImage( "tbMail32" ), ) }
oCol:uBmpHead := {|| LoadImage( "tbMail32" ) } // картинка шапки таблицы
oCol:aBitMaps := { LoadImage( "tbMail32" ) }
ELSEIF cField == "MAIL2"
oCol:uBmpCell := {|| IF( (ALIAS())->MAIL2, LoadImage( "tbMail32R" ), ) } // картинка в ячейке
oCol:uBmpHead := {|| LoadImage( "tbMail32R" ) } // картинка шапки таблицы
oCol:aBitMaps := { LoadImage( "tbMail32R" ) }
ENDIF
oCol:bData := {||Nil}
oCol:cData := '{||Nil}'
oCol:nAlign := nMakeLong( DT_CENTER, DT_CENTER )
oCol:nHAlign := nMakeLong( DT_CENTER, DT_CENTER )
// обработка до ввода
// обработка после ввода
Else
.........
NEXT


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




Пост N: 6228
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.12.16 18:09. Заголовок: Andrey пишет: oCol:..


Andrey пишет:

 цитата:
oCol:uBmpHead := {|| LoadImage( "tbMail32" ) } // картинка шапки таблицы
oCol:aBitMaps := { LoadImage( "tbMail32" ) }


А вот при таком подходе у тебя будет утечка памяти и уже в этой теме обсуждали.

Сделай не в цикле , что то там не стыкуется.
Ты ведь в начале писал что центруется правильно только второй Header , остальные нет.
По факту правильно отцентрованы 2 и 3 Header

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




Пост N: 5278
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.12.16 18:45. Заголовок: Dima пишет: Сделай ..


Dima пишет:

 цитата:
Сделай не в цикле , что то там не стыкуется.


Поля все в настройках, без цикла сделать не возможно....

Dima пишет:

 цитата:
По факту правильно отцентрованы 2 и 3 Header



На картинках же видно 3 и 4 Header не отцентрованы !

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




Пост N: 6229
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.12.16 22:31. Заголовок: Andrey пишет: nJ++..


Andrey пишет:

 цитата:
nJ++
ADD COLUMN TO TBROWSE oBrw1 // добавить новую колонку в TBROWSE
........
oBrw1:aColumns[nJ]:lEdit := .T.


Перенеси это код после
Andrey пишет:

 цитата:
If cTypeField == "L" // для полей Logic


+ после ELSE скопируй

Весь код не видно ........я не телепат

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




Пост N: 5279
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.16 11:53. Заголовок: Dima пишет: Весь ко..


Dima пишет:

 цитата:
Весь код не видно ........я не телепат



Код как в Tsb_config.


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




Пост N: 6232
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.12.16 13:30. Заголовок: Andrey Сколько ты т..


Andrey
Сколько ты там сутки уже справиться не можешь ? Смейся дальше...
Сделай простой пример без цикла и убедись что Header с BMP нормально центруется.

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




Пост N: 5280
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.16 16:32. Заголовок: Dima пишет: Сделай ..


Dima пишет:

 цитата:
Сделай простой пример без цикла и убедись что Header с BMP нормально центруется.


Этот пример уже сделал. Центрируется нормально.
В цикле не центрируется...
Пока бросил с этим разбираться, другая работа появилась.

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




Пост N: 6233
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.12.16 16:40. Заголовок: Andrey пишет: Этот ..


Andrey пишет:

 цитата:
Этот пример уже сделал. Центрируется нормально.
В цикле не центрируется...




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



Пост N: 135
Зарегистрирован: 12.06.06
ссылка на сообщение  Отправлено: 07.02.17 17:42. Заголовок: Добрый день! Начиная..


Добрый день!
Начиная с декабрьской версии стала появляться такая ошибка:
Error BASE/5001 MiniGUI Error: SENDMESSAGE
Called from SENDMESSAGE(0)
Called from TSBROWSE:RESIZE(9982)
Called from TCONTROL:HANDLEEVENT(923) ...
Ошибка появляется при вводе новой записи в стандартном TsBrowse.
Если забить строку 9982, то ошибка не появляется


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




Пост N: 1067
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.02.17 19:50. Заголовок: i3t4j6 пишет: стала..


i3t4j6 пишет:

 цитата:
стала появляться такая ошибка


Благодарю за сообщение!
Добавил дополнительную проверку в строке 9981

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




Пост N: 1069
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.03.17 13:18. Заголовок: Григорий можно пра..


Григорий
можно правочку небольшую в METHOD TSBrowse:Edit()

Было:

 
3749: If oCol:bPrevEdit != Nil
If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) // append mode for arrays
ElseIf nKey != VK_RETURN // GF 15-10-2015
Eval( oCol:bPrevEdit, uValue, Self )
EndIf
EndIf



Хочу:
 
3749: If oCol:bPrevEdit != Nil
If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) // append mode for arrays
ElseIf nKey != VK_RETURN // GF 15-10-2015
IF !Eval( oCol:bPrevEdit, uValue, Self )
nKey := VK_RETURN
END
EndIf
EndIf


PS Привык пользовать ::PrevEdit() и если он возвращает F не пускать в редактирование. В случае с чекбоксом этот прием не работает пока не внести изменения в код


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




Пост N: 1073
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.03.17 15:04. Заголовок: Haz пишет: пользова..


Haz пишет:

 цитата:
пользовать ::PrevEdit() и если он возвращает F не пускать в редактирование


Благодарю за Ваше предложение!

Добавил это изменение со следующим комментарием:

 цитата:
- a cell with checkbox will respect of return value of bPrevEdit block
in the method Edit().
Suggested and contributed by Igor Nazarov.



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




Пост N: 1380
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.03.17 15:35. Заголовок: gfilatov2002 пишет Д..


gfilatov2002 пишет
 цитата:
Добавил это изменение


возможно, делать надо как в методе KeyDown :
 
Local uVal
...
Line 6562
uVal := Eval( ::aColumns[ nCol ]:bPrevEdit, uVal, Self )
If ValType( uVal ) == "L" .and. ! uVal
nKey := VK_RETURN
EndIf



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




Пост N: 1381
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.03.17 15:38. Заголовок: PS uVal := Eval( ::a..


PS
uVal := Eval( ::aColumns[ nCol ]:bPrevEdit, uValue, Self )

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




Пост N: 1074
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.03.17 16:12. Заголовок: SergKis пишет: дела..


SergKis пишет:

 цитата:
делать надо как в методе KeyDown


Благодарю за внимание!

Именно так и сделал (с проверкой типа возвращаемого блоком значения):
... 
uVar := Eval( oCol:bPrevEdit, uValue, Self )
If ValType( uVar ) == "L" .and. ! uVar
nKey := VK_RETURN
EndIf


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




Пост N: 1382
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.03.17 19:59. Заголовок: gfilatov2002 такую ..


gfilatov2002
такую правку предлагаю
 
METHOD GoToRec( nRec ) CLASS TSBrowse
...
If ( ::cAlias )->( EoF() )
...
Else
( ::cAlias )->( DbGoTo( nRecNo ) )
::nLastPos := nRecNo
::nAt := ::nLogicPos()

While ::nRowPos > 1
::Skip( -1 )
::nRowPos --
EndDo
While nRecNo != ( ::cAlias )->( RecNo() )
::Skip( 1 )
::nRowPos ++
EndDo

EndIf
...


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




Пост N: 1070
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.03.17 20:52. Заголовок: SergKis пишет: так..


SergKis пишет:

 цитата:
такую правку предлагаю


Сергей, а зачем аверх вниз гонять?
PS просто из любопытства спрашиваю)))

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




Пост N: 6334
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.03.17 22:32. Заголовок: Haz пишет: Сергей, ..


Haz пишет:

 цитата:
Сергей, а зачем аверх вниз гонять?


Тоже не понял....

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




Пост N: 1383
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.03.17 00:21. Заголовок: Для правильной устан..


Для правильной установки ::nRowPos
Просмотр по тегу, ::nRowPos = 18 (::nRowCount() = 20)
Добавили запись или переходим на recno выше, к примеру ::nRowPos должен стать 3
Без добавки сейчас (у меня так) запись добавилась выше, а ::nRowPos остался 18

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




Пост N: 1071
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.03.17 08:51. Заголовок: SergKis пишет: Для ..


SergKis пишет:

 цитата:
Для правильной установки ::nRowPos


В принципе пробег туда - сюда делается оч быстро и если это снимает проблему то почему бы и нет.
У меня новая запись почти всегда не в конец добавляется т. к. используется механизм выбора из удаленных.

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




Пост N: 1384
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.03.17 09:26. Заголовок: Haz пишет т. к. испо..


Haz пишет
 цитата:
т. к. используется механизм выбора из удаленных.


У меня так же, и если тег по наименованию и ситуация как выше, то nRowPos не становился на новую запись,
а оставался где были. Два цикла можно, наверно оптимизировать

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




Пост N: 1072
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.03.17 12:16. Заголовок: SergKis пишет: nRow..


SergKis пишет:

 цитата:
nRowPos не становился на новую запись




Сергей а так ?
oBrw:nLen := Eval( oBrw::bLogicLen )
oBrw:Refresh(.T., .T.) // <------------------ на счет этого не уверен тут может моргать таблица
oBrw:GotoRecNo( nRec )

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


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




Пост N: 1385
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.03.17 20:28. Заголовок: Haz пишет Скинь само..


Haz пишет
 цитата:
Скинь самодостаточный


Наконец сделал пример. GotoRec работатет нормально в тек. версии, немного не привычно - выталкивает первую строку экрана (привычнее последнюю) за пределы при заполнении экрана строками полностью, т.е. с GotoRec - в моей версии что то не так (так что исправление это только у меня) - это хорошо.
Пример тут http://my-files.ru/vooru4


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




Пост N: 1075
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.03.17 21:34. Заголовок: SergKis пишет: сдел..


SergKis пишет:

 цитата:
сделал пример. GotoRec работает нормально в тек. версии


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

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




Пост N: 1386
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.03.17 09:48. Заголовок: gfilatov2002 надо п..


gfilatov2002
надо подправить строки (не работает конструкция oCol:cFooting := {|nKol,oBr| ... })
 
Static Function SetHeights( oBrw )
...
line 13090
cHeading := If( Valtype( oColumn:cHeading ) == "B", Eval( oColumn:cHeading ), oColumn:cHeading )
на
cHeading := If( Valtype( oColumn:cHeading ) == "B", Eval( oColumn:cHeading, nEle, oBrw ), oColumn:cHeading )

line 13137
cHeading := If( Valtype( oColumn:cFooting ) == "B", Eval( oColumn:cFooting ), oColumn:cFooting )
на
cHeading := If( Valtype( oColumn:cFooting ) == "B", Eval( oColumn:cFooting, nEle, oBrw ), oColumn:cFooting )

Григорий, может функ. SetNoHoles(...) сделать методом TsBrowse ? Скрытый текст




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




Пост N: 1073
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.03.17 12:04. Заголовок: SergKis пишет: выта..


Сергей - отличный пример
я бы сказал что он не сколько на ::GotoRec() сколько на понимание подхода к TS и его составляющим как к объектам

SergKis пишет:

 цитата:
выталкивает первую строку экрана (привычнее последнюю) за пределы при заполнении экрана строками полностью


Выталкивает вверх потому что подбирается к нужной записи снизу
If ( ::cAlias )->( EoF() ) означает что ниже нужной записи нет их необходимого количества чтоб заполнить весь бровс начиная с верхней строки
Вот тут
( ::cAlias )->( DbSkip( nLines - ::nRowPos ) )  

при этом ::nRowPos всегда 1 после ::Reset() выше
и если записей недостаточно то встает на самый конец и скипает вверх.
в принципе можно подумать как переделать чтобы всегда подбирался сверху. т.е. проверять есть ли достаточное количество записей перед и после чтобы ::RowPos остался прежним
Не знаю насколько это принципиально, но технически исполнимо
Алгоритм зависит от воросов
1) Какой ::nRowPos ставить если перед нужной ( той куда идем) записей меньше чем текущий ::nRowPos - вариантов два - ::nRowPos == 1 или логический новой номер нужной записи
2) Какой ::nRowPos ставить если после нужной ( той куда идем) записей меньше чем текущий ::nRowCount - вариантов три - ::nRowPos == 1 (с обрезанием бровса), поледний ::nRowPos == nRowCount или как сейчас текущий с выпихиванием верха

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




Пост N: 1076
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.03.17 12:30. Заголовок: SergKis пишет: надо..


SergKis пишет:

 цитата:
надо подправить строки


Сделал, конечно (поправил функцию SetHeights() и добавил новый метод SetNoHoles(), и Ваш новый пример).

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

P.S. Выход новой мартовской сборки запланирован на следующей неделе

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




Пост N: 1387
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.03.17 12:58. Заголовок: Haz пишет Не знаю на..


Haz пишет
 цитата:
Не знаю насколько это принципиально


Для пользователя это может быть важным, т.к. имея сорт. по наим.
А1
А2
...
А7
Б1
Б2
добавляя А8, А9 выталкиваться будет А1 и А2 вместо Б...
а с др. стороны при полном экране на А... верх будет выдавливаться так же

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




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


gfilatov2002 пишет
 цитата:
и Ваш новый пример


там убрать над лишнее
 
STATIC FUNC Add_Rec( oBrw )
Local cBrw, hBrw, cAls, cPic
Local nHgh, nWdt, nPos, cCol, oCol, nLen
Local nRow, nCol, oCel, cGet, cVal, nRec
Local cKods, cName, cKodP, cNamP, lRefr
Local nY , nX , nW , nH
Local nX1, nW1, nH1
Local nX2, nW2, nH2
Local cWnd := oBrw:cParentWnd
Local hWnd := GetFormHandle(cWnd)
Local hInpl := _HMG_InplaceParentHandle

_HMG_InplaceParentHandle := hWnd

PRIVATE aResult

WITH OBJECT oBrw

cBrw := :cControlName
cAls := :cAlias
hBrw := GetWindowRow(GetControlHandle(cBrw, cWnd))



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




Пост N: 1078
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.03.17 14:42. Заголовок: SergKis пишет: там ..


SergKis пишет:

 цитата:
там убрать над лишнее


Почистил также и другие неиспользуемые переменные,
и добавил в заголовке следующие строки для подавления ненужных предупреждений
 
FIELD KODS, NAME, ID

MEMVAR oBrw, aResult


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




Пост N: 1389
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.03.17 15:13. Заголовок: gfilatov2002 :sm36:..


gfilatov2002

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




Пост N: 1390
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.03.17 12:25. Заголовок: gfilatov2002 Может ..


gfilatov2002
Может в пример добавить использование функции ShowGetValid(...) (сообщение в getbox valid об ошибке) ?
Изменения такие
 
STATIC FUNC VldNewRec()
...
If lSek
Tone(500, 1)
ShowGetValid(GetControlHandle(cGkd, cWnd), "Kod dublicate", "Error", 'E') // можно 'E'\'I'\'W'
InkeyGui(4000)

_SetValue(cGkd, cWnd, GetNewKod())
_SetFocus(cGkd, cWnd)
...
и добавить
#pragma BEGINDUMP

#define _WIN32_WINNT 0x0600

#include <windows.h>

#include "hbapi.h"
#include "hbapicdp.h"

#include <commctrl.h>

typedef struct _tagEDITBALLOONTIP
{
DWORD cbStruct;
LPCWSTR pszTitle;
LPCWSTR pszText;
INT ttiIcon; // From TTI_*
} EDITBALLOONTIP, *PEDITBALLOONTIP;
#define EM_SHOWBALLOONTIP (ECM_FIRST + 3) // Show a balloon tip associated to the edit control
#define Edit_ShowBalloonTip(hwnd, peditballoontip) \
(BOOL)SNDMSG((hwnd), EM_SHOWBALLOONTIP, 0, (LPARAM)(peditballoontip))
#define EM_HIDEBALLOONTIP (ECM_FIRST + 4) // Hide any balloon tip associated with the edit control
#define Edit_HideBalloonTip(hwnd) \
(BOOL)SNDMSG((hwnd), EM_HIDEBALLOONTIP, 0, 0)

// ToolTip Icons (Set with TTM_SETTITLE)
#define TTI_NONE 0
#define TTI_INFO 1
#define TTI_WARNING 2
#define TTI_ERROR 3
#if (_WIN32_WINNT >= 0x0600)
#define TTI_INFO_LARGE 4
#define TTI_WARNING_LARGE 5
#define TTI_ERROR_LARGE 6
#endif // (_WIN32_WINNT >= 0x0600)

#define ECM_FIRST 0x1500 // Edit control messages

/*
ShowGetValid( hWnd, cText [ , cTitul ] [ , cTypeIcon ] )
*/

#if ( HB_VER_MAJOR == 3 )
#define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, ch )
#define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, ch)
#else
#define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, fCtrl, ch )
#define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, fCtrl, ch)
#endif

HB_FUNC( SHOWGETVALID )
{
int i,k;
char *tp, *s;
WCHAR Text[512];
WCHAR Title[512];

EDITBALLOONTIP bl;

PHB_CODEPAGE s_cdpHost = hb_vmCDP();

HWND hWnd = ( HWND ) hb_parnl( 1 );

if( ! IsWindow( hWnd ) ) return;


bl.cbStruct = sizeof( EDITBALLOONTIP );
bl.pszTitle = NULL;
bl.pszText = NULL;
bl.ttiIcon = TTI_NONE;

if( HB_ISCHAR( 2 ) ){

ZeroMemory( Text, sizeof(Text) );

k = hb_parclen(2);
s = (unsigned char *) hb_parc(2);
for(i=0;i<k;i++) Text = _hb_cdpGetU16( s_cdpHost, TRUE, s );
bl.pszText = Text;
}

if( HB_ISCHAR( 3 ) ){

ZeroMemory( Title, sizeof(Title) );

k = hb_parclen(3);
s = (unsigned char *) hb_parc(3);
for(i=0;i<k;i++) Title = _hb_cdpGetU16( s_cdpHost, TRUE, s );
bl.pszTitle = Title;
}


tp = ( char * ) hb_parc(4);

switch( *tp ){
case 'E' : bl.ttiIcon = TTI_ERROR_LARGE; break;
case 'e' : bl.ttiIcon = TTI_ERROR; break;

case 'I' : bl.ttiIcon = TTI_INFO_LARGE; break;
case 'i' : bl.ttiIcon = TTI_INFO; break;

case 'W' : bl.ttiIcon = TTI_WARNING_LARGE; break;
case 'w' : bl.ttiIcon = TTI_WARNING; break;

}


Edit_ShowBalloonTip( hWnd, &bl );

}

#pragma ENDDUMP


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




Пост N: 1391
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.03.17 12:29. Заголовок: PS опять пропустил ...


PS
опять пропустил [ i ]. повтор Скрытый текст


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




Пост N: 1079
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 17.03.17 13:50. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может в пример добавить использование функции ShowGetValid


Благодарю за Ваши усилия, но, думаю, что в данном случае нет необходимости в усложнении этого примера

Кстати, эта функция уже использовалась в одном из примеров, которые прислал Андрей:
- в папке Basic\COMM_2


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




Пост N: 1074
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 17.03.17 16:10. Заголовок: SergKis пишет: Goto..


SergKis пишет:

 цитата:
GotoRec работатет нормально в тек. версии, немного не привычно - выталкивает первую строку экрана (привычнее последнюю)




Сергей, посмотрел исходнички и вот чего увидел:
GotoRec ничего не знает о том что сделали с базой ( добавили запись , фильтранули или просто скипнули куда то и пр)., соответственно проблематично отследить что на рабочем поле бровса появилать новая запись и выталкивать нужно вниз от новой записи.
Можно сохранить тот же ::RowPos т.к. он известен достоверно, но корректно сохранить первую строку я не придумал как.
Пример ( база отсортирована по отображаемому полю):
в базе есть пять значений C текущее , в бровсе 4 строки ( видим с A до D )
-----
A
B
C <-
D
-----
E

Добавили значение C1 через dbAppend и оно стало текущей записью вместо С и встало после С
Если сделать у С1 ::RowPos = 3 то вытолкнем А вверх за пределы бровса и проанализировать то нечего т.к. в данном случае мы знаем только
1) номер записи текущей после добавления
2) номер записи С как ::nLastPos
но не знаем какая была первой (если анализировать сверху ) или последней (если снизу) в бровсе, чтобы понять куда и что вытолкнуть , не заем сколько записей добавили или удали.
Все что можно сделать в GoToRec так это на выбор
1) Сохранить ::nRowPos
2) Сделать его = 1
2) Сделать его = ::nRowCount()


PS я бы предпочел вариант 1 и новый метод ::AddRec() который добавляет запись и правильно ее позиционирует с учетом установок до добавления. И то при совместной работе возможны сюрпризы типа ... рассчитал нужный RowPos , а тебя опередил кто то и впихнул пачку записей


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




Пост N: 1392
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.03.17 17:35. Заголовок: gfilatov2002 пишет э..


gfilatov2002 пишет
 цитата:
эта функция уже использовалась в одном из примеров, которые прислал Андрей


По тому примеру не очень ясно основное назначение функции - работа в valid GetBox-ов. Но если усложняет, то тогда не надо.

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




Пост N: 1393
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.03.17 17:46. Заголовок: Haz пишет возможны с..


Haz пишет
 цитата:
возможны сюрпризы типа ... рассчитал нужный RowPos , а тебя опередил кто то и впихнул пачку записей


Игорь, в тек. версии миниГуи GotoRec работает приемлемо и действительно управляется через установку nRowPos до GotoRec.
Просто в моей версии тсб 7.0 в базе и доводка мной до приближения к тсб 9.0.
Получается при всей похожести кода есть разница, но это уже моя головная боль.
GotoRec у себя уже подправил и управление через nRowPos тоже работает, может, в некоторых случаях, не так как в тсб 9.0, но похоже. Спасибо за участие.


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




Пост N: 1395
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.03.17 19:24. Заголовок: Для информации. В пр..


Для информации. В представленном выше примере, после добавления записи для включения Edit на след. колонке надо сделать :
 
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("NAM")
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


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




Пост N: 1397
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.03.17 17:11. Заголовок: Сделал Tsb_addrecord..


Сделал Tsb_addrecord_3 с удалением F3. Скрытый текст


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




Пост N: 6336
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.03.17 17:56. Заголовок: SergKis пишет: nCo..


SergKis пишет:

 цитата:
nCol := oBrw:nColumn("NAM")


Вероятно нужно oBrw:nColumn("NAME")

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




Пост N: 1398
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.03.17 18:30. Заголовок: Dima пишет Вероятно ..


Dima пишет
 цитата:
Вероятно нужно oBrw:nColumn("NAME")


Да, c Григорием уже сегодня cписались http://clipper.borda.ru/?1-1-0-00000495-000-100-0-1490094063
и в пред. посте подправлено тоже

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




Пост N: 5329
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.17 12:13. Заголовок: Слушайте, а почему б..


Слушайте, а почему бы не добавить возможность в Tsb прорисовку пустой таблицы ?
Или фон таблицы сделать из картинки ?

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


Пост N: 675
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 22.03.17 14:53. Заголовок: пустой таблицы Нет ..



 цитата:
пустой таблицы


Нет данных или структура не определена ?

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




Пост N: 5330
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.17 16:30. Заголовок: Хочется несколько ва..


Хочется несколько вариантов:
1) Данные есть, структура определена, но при первом показе хочется открывать базу с пустыми графами таблицы.
2) Если нет данных по фильтру по базе - то показывается таблица без граф (разделительных линей нет) - не совсем красиво, юзер не понимает почему таблица пустая... Вот в этом случае и нужно выводить пустую таблицу или картинку-фон в таблице.

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




Пост N: 1075
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.03.17 18:04. Заголовок: Andrey пишет: Хочет..


Andrey пишет:

 цитата:
Хочется несколько вариантов:


А как объяснить пользователю почему курсор не идет ниже последней заполненной ??? там же еще много пустых

По сути вопроса сделать то очень легко
 
в METHOD Paint() после этого
If ::lAppendMode .and. ::nLen == ::nRowPos .and. ::nRowPos < nLines
::DrawLine( ++ ::nRowPos )
EndIf

Добавить это
If ::nLen < ::nRowCount()
n := ::nRowPos
m := (::cAlias)->(RecNo())
k := ::nLen
::nRowPos := ::nLen
(::cAlias)->(dbGoBottom())
(::cAlias)->(dbSkip(1))
While ::nRowPos < ::nRowCount()
::nLen++
::DrawLine( ++ ::nRowPos )
END
::nRowPos := n
(::cAlias)->(dbGoto(m))
::nLen := k
EndIf


ЗЫ и не забыть в начале метода объявить переменные local m,n,k
можно еще и флаг добавить ::lPhantomGrid := .F. чтобы код выше выполнялся только когда
obrw:lPhantomGrid := .T.


мне как сейчас больше нравится

Ну а с картинками и сам справишься - окно бровса известно, если фильтр выдал пусто то рисуй или пиши в это окно чего надо


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




Пост N: 6337
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.03.17 18:12. Заголовок: Haz пишет: мне как ..


Haz пишет:

 цитата:
мне как сейчас больше нравится


+1

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




Пост N: 1399
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.03.17 10:30. Заголовок: Haz пишет А как объя..


Haz пишет
 цитата:
А как объяснить пользователю почему курсор не идет ниже последней заполненной ??? там же еще много пустых


Полностью согласен
У себя делаю принудительно :nLen := 1 (при пустой базе\выборке) ставлю в колонках
oCol:lEmptyValToChar := .T.
и в процедурах на клавишах (кроме добавления новой записи) делаю проверку
IF (:cAlias)->( BOF() ) .and. (:cAlias)->( EOF() ); RETURN .F.
ENDIF
тогда одна пустая (Selected) линия есть всегда в тсб.
Еще можно оставаться на окне запроса к выборке, выдав сообщение "Нет дааных запроса" и
не входить в процедуру с тсб.

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




Пост N: 5332
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.03.17 12:08. Заголовок: Haz , SergKis - СПАС..


Haz , SergKis - СПАСИБО БОЛЬШОЕ !

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




Пост N: 5351
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.04.17 15:12. Заголовок: Всем привет ! Вот во..


Всем привет !
Вот возник вопрос - как закрасить виртуальный столбец другим цветом ?


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