On-line: MIKHAIL, гостей 1. Всего: 2 [подробнее..]
АвторСообщение





Пост N: 512
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 13.02.17 23:07. Заголовок: Хочется странного - DBEDIT()


Добрый день.

Неожиданно, понял, что меня раздражает в "стандартном" DBEDIT(), который с минимальными добавками (в основном, под мышь) использую из стандартного Harbour 3.4.

Пример: есть НЕБОЛЬШОЙ справочник, наподобие такого:

 
┌─ Выберите способ доставки ─────┐
│008 Газель 1.5т 8 куб.м │
│003 Зил-Бычок 3.0т 17 куб.м │
│002 Зил-Бычок 3.0т 25 куб.м │
│001 МАЗ-Зубренок 5.0т 35 куб.м │
│004 MAN тент 5.0т 36 куб.м │
│005 Foton 5.0т 26 куб.м │
│006 Truck 7.0т 36 куб.м │
│007 Доставка ТК (опл.за кг) │
└────────────────────────────────┘


Юзер выбирает некоторый элемент из него, программа в STATIC запоминает - чтобы юзеру было удобно. Например, он выбрал Foton.
Через некоторое время юзер вновь открывает этот справочник, по STATIC переменной подставляется "прежнее" значение, оно становится "текущим" в этом справочнике, а DBEDIT() выглядит примерно таким образом:

 
┌─ Выберите способ доставки ─────┐
│005 Foton 5.0т 26 куб.м │
│006 Truck 7.0т 36 куб.м │
│007 Доставка ТК (опл.за кг) │
│ │
│ │
│ │
│ │
│ │
└────────────────────────────────┘


Ну некузяво-же...

Хотелось-бы видеть таблицу без пустого пространства снизу, но при этом текущая запись д.б. той, которую юзер использовал в предыдущий раз.
Как с этим можно побороться?

Загнать справочник строками в ACHOICE, который не имеет таких проблем - тоже способ, но какой-то уж очень "европейский".

Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 24 , стр: 1 2 All [только новые]


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




Пост N: 6288
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 13.02.17 23:43. Заголовок: а если после установ..


а если после установки на нужную запись сделать примерно следующее...
 
FUNCTION FreshRecno( b ,als)
LOCAL nrec
hb_default(@als,alias())
nrec := (als)->(Recno())
b:rowPos:= 1 - Eval( b:skipBlock, 1 - b:RowPos )
(als)->(dbgoto(nrec))
b:RefreshAll()
b:forceStable()
RETURN NIL



Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 513
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 14.02.17 00:01. Заголовок: Сорри, не очень поня..


Сорри, не очень понял, куда поставить FreshRecno()

Обычно у меня бывает так:
 
USE ... NEW
SET FILT TO ...
IF nLastRec > 0 // static
GO nLastRecno
ELSE
GO TOP
ENDIF
DBEDIT(...)
IF LASTKEY() # K_ESC
nLastRec := RECNO() // сохраняем в static
ENDIF
CLOSE ...


Или вместо GO nLastRecno идет SEEK на какой-нить xLastId, но суть от этого не меняется - DBEDIT может стартовать как с начала таблицы, так и с какой-то записи, возможно в ее конце.

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




Пост N: 1363
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.02.17 00:24. Заголовок: Использовать xUserFu..


Использовать xUserFunc, в ней при выборе запоминаем выбранную запись и oBrowse:rowPos, и по Диме,
делаем skip назад до oBrowse:rowPos == 1 и запоминаем recno этой записи, на нее будем делать потом goto и
hb_pushkey(VK_F21), на эту клавишу в xUserFunc делаем перемещение на запомненный rowPos-1,
Eval(oBrowse:skipBlock, rowPos-1), возврат из xUserFunc - refresh

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6289
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.02.17 14:48. Заголовок: Sergy Я подумал был..


Sergy
Я подумал было что ты давно уже пересел на свой бровс
http://clipper.borda.ru/?1-4-0-00001164-000-0-0-1480187096
а ты все еще Dbedit мучаешь

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 514
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 14.02.17 21:41. Заголовок: Dima пишет: Я поду..


Dima пишет:

 цитата:
Я подумал было что ты давно уже пересел на свой бровс
http://clipper.borda.ru/?1-4-0-00001164-000-0-0-1480187096
а ты все еще Dbedit мучаешь


Добавил в текст DBEDIT() 7 строк и доп.параметр :
 
//
// поддержка цвета
//
IF HB_ISARRAY( aColorBlocks ) // задан массив ?
IF nPos <= LEN(aColorBlocks) // в пределах ?
oColumn:colorBlock := aColorBlocks[nPos]
ENDIF
//
ELSEIF HB_ISBLOCK( aColorBlocks ) // задан один блок ?
oColumn:colorBlock := aColorBlocks // присваиваем всем столбцам
ENDIF

Все заработало.
Пока не очень понимаю, зачем менять полностью DBEDIT().
Да, бесит пустое место в данном случае. Перфекционизм? Но твой пример в 10 строк - попробую и думаю,что получится добавить.

Или я просмотрел в oBrowse что-то кардинально изменяющее представление о работе с открытой таблицей (связкой таблиц) ?


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 515
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 14.02.17 21:49. Заголовок: SergKis пишет: Испо..


SergKis пишет:

 цитата:
Использовать xUserFunc, в ней при выборе запоминаем выбранную запись и oBrowse:rowPos, и по Диме,
делаем skip назад до oBrowse:rowPos == 1 и запоминаем recno этой записи, на нее будем делать потом goto и
hb_pushkey(VK_F21), на эту клавишу в xUserFunc делаем перемещение на запомненный rowPos-1,
Eval(oBrowse:skipBlock, rowPos-1), возврат из xUserFunc - refresh


Вариант с xUserFunc "не очень" . У меня вызвов DBEDIT() больше сотни, у каждого свой xUserFunc(), соотв. дописывать десятки функций, думаю, неразумно.
Хотелось-бы допилить единственный DBEDIT(). Ну или освоить получше TBrowse.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6290
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.02.17 22:45. Заголовок: Sergy пишет: Ну или..


Sergy пишет:

 цитата:
Ну или освоить получше TBrowse.


Именно !

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




Пост N: 1364
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.02.17 10:19. Заголовок: Sergy пишет Хотелось..


Sergy пишет
 цитата:
Хотелось-бы допилить единственный DBEDIT()


DbEdit собрана на TBrowse, так что пробнуть можно так:
 
FUNCTION dbEdit( nTop, nLeft, nBottom, nRight, ;
...
nOldCUrsor := SetCursor( SC_NONE )

FreshRecno(oBrowse) // предложение от Димы

/* --------------------------- */
/* Go into the processing loop */
/* --------------------------- */

lAppend := .F.
lFlag := .T.
lDoIdleCall := .T.
lContinue := .T.

DO WHILE lContinue
...

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


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 516
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 17.02.17 22:48. Заголовок: Dima пишет: FUNCTI..


Dima пишет:

 цитата:
FUNCTION FreshRecno( b ,als)
LOCAL nrec
hb_default(@als,alias())
nrec := (als)->(Recno())
b:rowPos:= 1 - Eval( b:skipBlock, 1 - b:RowPos )
(als)->(dbgoto(nrec))
b:RefreshAll()
b:forceStable()
RETURN NIL



Потихоньку разбираюсь с Tbrowse. Не очень понятна логика предложенного решения, а именно:

b:rowPos:= 1 - Eval( b:skipBlock, 1 - b:RowPos )

Насколько понимаю, :RowPos показывает текущую позицию курсора Tbrowse.
При старте оно равно 1, что приводит к тому, что если от текущей записи до EOF() строк меньше, чем до конца BOX, выделенного для TBrowse, появится пустое место.

Приведенный код должен запустить метод skipBlock столько раз, насколько b:RowPos меньше единицы. Т.е. НОЛЬ.



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




Пост N: 1369
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.02.17 19:36. Заголовок: Sergy Попилил DBEDI..


Sergy
Попилил DBEDIT, получился вариант:
 
твой код с добавкой
USE ... NEW
SET FILT TO ...

PRIV dbEditGoto

IF nLastRec > 0 // static
GO nLastRecno
dbEditGoto := nLastRecno
ELSE
GO TOP
ENDIF
DBEDIT(...)
IF LASTKEY() # K_ESC
nLastRec := RECNO() // сохраняем в static
ENDIF
CLOSE ...

модификация DBEDIT
...
oBrowse := TBrowseDb( nTop, nLeft, nBottom, nRight )
oBrowse := __objAddMethod( oBrowse, "RowLast", @getRowLast() ) // добавляем метод

oBrowse:headSep := iif( ISCHARACTER( xHeadingSeparators ), xHeadingSeparators, Chr( 205 ) + Chr( 209 ) + Chr( 205 ) )
oBrowse:colSep := iif( ISCHARACTER( xColumnSeparators ), xColumnSeparators, " " + Chr( 179 ) + " " )
oBrowse:footSep := iif( ISCHARACTER( xFootingSeparators ), xFootingSeparators, "" )
oBrowse:skipBlock := {| nRecs | Skipped( nRecs, lAppend ) }
oBrowse:autoLite := .F. /* Set to .F. just like in CA-Cl*pper. [vszakats] */
...

STATIC FUNCTION getRowLast( oBrw ) // метод для считывания protected переменной nLastRow
Return oBrw:nLastRow

модифицируем функцию CallUser
STATIC FUNCTION CallUser( oBrowse, xUserFunc, nKey, lAppend, lFlag )
...
nPrevRecNo := RecNo()

* NOTE: CA-Cl*pper won't check the type of the return value here,
* and will crash if it's a non-NIL, non-numeric type. We're
* replicating this behavior.

CallTest( oBrowse, nMode, nKey, xUserFunc )

nAction := iif( ISBLOCK( xUserFunc ), ;
...

STATIC FUNCTION CallTest( oBrw, nMode, nKey, xUserFunc )
Local nRowPos := oBrw:rowPos
Local nRowCnt := oBrw:rowCount()
Local nLastRow := oBrw:RowLast(oBrowse)
Local nSkip
// Local nColPos := oBrowse:colPos
// Local nColCnt := oBrowse:colCount()

If nLastRow < nRowCnt .and. nMode == 0 .and. nKey == 0
If __mvExist("dbEditGoTo") .and. hb_IsNumeric(__mvGet("dbEditGoTo"))
nGoto := __mvGet("dbEditGoTo")
nSkip := nLastRow - nRowCnt
EVal(oBrw:skipBlock, nSkip)
oBrw:rowPos := 1 + nSkip * (-1)
oBrw:RefreshAll()
oBrw:forceStable()
__mvPut("dbEditGoTo", Nil)
EndIf
EndIf

RETURN Nil

переменную dbEditGoto можно перенести в DBEDIT и значение для нее передавать параметром

Сделаешь почище вариант, выложи

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




Пост N: 1370
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.02.17 19:57. Заголовок: PS строку подправить..


PS
строку подправить надо
Local nLastRow := oBrw:RowLast(oBrowse)
на
Local nLastRow := oBrw:RowLast(oBrw)

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


Пост N: 1425
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 20.02.17 15:12. Заголовок: SergKis пишет: PS ..


SergKis пишет:

 цитата:
PS
строку подправить надо
Local nLastRow := oBrw:RowLast(oBrowse)
на
Local nLastRow := oBrw:RowLast(oBrw)



Тогда может лучше так

STATIC FUNCTION getRowLast()
local self := QSelf()
Return ::nLastRow

и, соответственно,

nLastRow := oBrw:RowLast()




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




Пост N: 1371
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.02.17 17:00. Заголовок: Петр :sm36: ..


Петр


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6301
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.02.17 15:04. Заголовок: SergKis пишет: nGo..


SergKis пишет:

 цитата:
nGoto := __mvGet("dbEditGoTo")


Для чего переменная nGoto если она не используется в дальнейшем ?

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




Пост N: 1373
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.02.17 15:37. Заголовок: Dima пишет Для чего ..


Dima пишет
 цитата:
Для чего переменная nGoto если она не используется в дальнейшем ?


Для проверки
 
If nGoto == RecNo()
nSkip := nLastRow - nRowCnt
EVal(oBrw:skipBlock, nSkip)
oBrw:rowPos := 1 + nSkip * (-1)
oBrw:RefreshAll()
oBrw:forceStable()
EndIf

Я хотел, но забыл добавить. Еще надо учесть, что бы CallTest выполнилась только один раз.
В DBEDIT код для стабилизации 1-го входа, по идее, должен быть по умолчанию, с учетом
строк в просмотре меньше размера oBrw (учесть при скип назад и вычислении rowPos новой).
Но мне это вроде совсем не надо, vwt не использую, потому не стал делать в примере.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6302
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.02.17 15:48. Заголовок: SergKis Понял. SergK..


SergKis Понял.
SergKis пишет:

 цитата:
Но мне это вроде совсем не надо, vwt не использую


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

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




Пост N: 1374
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.02.17 18:21. Заголовок: Dima пишет Кто его з..


Dima пишет
 цитата:
Кто его знает , вдруг понадобится.


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6304
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.02.17 18:49. Заголовок: SergKis пишет: Возм..


SergKis пишет:

 цитата:
Возможно этот год посуетимся еще и ... песец, завязывать надо.


С чем завязать решил , кодить в смысле ?

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




Пост N: 1375
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.02.17 19:16. Заголовок: Dima с работой, а к..


Dima
с работой, а кодить в пустоту ...
но это уже др. тема.

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




Пост N: 1378
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.02.17 12:11. Заголовок: Dima пишет Кто его з..


Dima пишет
 цитата:
Кто его знает , вдруг понадобится.


У меня такой вышел вариант
 
FUNCTION DBEDIT( nTop, nLeft, nBottom, nRight, ;
...
oBrowse := TBrowseDb( nTop, nLeft, nBottom, nRight )
oBrowse := __objAddData( oBrowse, "lFirstStable" )
oBrowse := __objAddMethod( oBrowse, "RowLast", @getRowLast() )
oBrowse:lFirstStable := .T.

oBrowse:headSep := iif( ISCHARACTER( xHeadingSeparators ), xHeadingSeparators, Chr( 205 ) + Chr( 209 ) + Chr( 205 ) )
...

STATIC FUNCTION getRowLast()
RETURN QSelf():nLastRow

STATIC FUNCTION CallUser( oBrowse, xUserFunc, nKey, lAppend, lFlag )

LOCAL nPrevRecNo

LOCAL nAction
LOCAL nMode := iif( nKey != 0, DE_EXCEPT, ;
iif( !lAppend .AND. IsDbEmpty(), DE_EMPTY, ;
iif( oBrowse:hitBottom, DE_HITBOTTOM, ;
iif( oBrowse:hitTop, DE_HITTOP, DE_IDLE ) ) ) )
LOCAL nRowPos


oBrowse:forceStable()

If oBrowse:lFirstStable
If oBrowse:rowLast() < oBrowse:rowCount()
For nRowPos := 1 To ( oBrowse:rowCount() - oBrowse:rowLast() )
nPrevRecNo := RecNo()
EVal(oBrowse:skipBlock, -1)
If nPrevRecNo == RecNo()
EXIT
EndIf
Next
oBrowse:rowPos := nRowPos
oBrowse:RefreshAll()
oBrowse:forceStable()
EndIf
oBrowse:lFirstStable := .F.
EndIf

nPrevRecNo := RecNo()
...


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 517
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 23.02.17 10:26. Заголовок: SergKis пишет: У ме..


SergKis пишет:

 цитата:
У меня такой вышел вариант


Попробовал.
Все супер. DBEDIT() работает так, как и должен.

Интересное решение с внедрением "своих" функций в тело чужого класса.

Не знал о нем, спасибо.



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 135
Зарегистрирован: 24.04.13
ссылка на сообщение  Отправлено: 21.09.17 13:19. Заголовок: Можно ли с DBEDIT сд..


Можно ли с DBEDIT сделать что-то подобное чтобы "заморозить" пару первых столбцов ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6594
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.09.17 13:23. Заголовок: Можно если переделат..


Можно если переделать сырец , как морозить колонки смотри в примерах

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3598
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.09.17 13:56. Заголовок: dbEdit реализован че..


dbEdit реализован через класс TBrowse, но в работает в кондовом стиле 30-летней давности Summer'87 (2017-1987=30(!) лет).

Если совсем не заморачиваться, то надо скопировать модуль dbedit.prg себе в сырцы, добавить еще один параметр к функции dbedit, добавить фрагмент:

if nFreeze # nil
oBrowse:freeze := nFreeze
endif

прилинковать исправленный модуль, и радоваться.

Лучше конечно сделать свою реализацию для использования класса TBrowse, который тоже старичок, ему аж 25 лет.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 24 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 169
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет