Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] DEFINE TBROWSE oBrw2 ; AT 60,450 ; ALIAS cAlias ; OF Form1 ; WIDTH 330 ; HEIGHT 340 ; FONT "Verdana" ; SIZE 9 ; ON DBLCLICK CopyRec(); ON GOTFOCUS fModelo_Hab(2) ; AUTOFILTER ; CELLED EDIT; VALUE nRec; GRID [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Vlad04: не может это отследить и остаться на той записи, которую редактировали ? Должен, наверно. В консольном Клиппере , а затем в Харборе Бровз с этой задачей справлялся отлично. В той редакции, которой я пользовался и пользуюсь было так: XNEWKEY := IF( EMPTY(INDEXKEY()), NIL, &(INDEXKEY()) ) IF .NOT. (XNEWKEY == XOLDKEY) Ob:REFRESHALL() while ( !oB:stabilize() ) ; end DO WHILE &(INDEXKEY()) > XNEWKEY .AND. .NOT. Ob:HITTOP() ob:UP() while ( !oB:stabilize() ) ; end ENDDO ENDIF

Haz: Vlad04 пишет: И можно в общем случае как-то избавиться от указания номера колонки ? можно не использовать внешнее редактирование и все будет норм. Или использовать и самому заботиться о прорисовке теми методами которые есть в TS ( а их там полно ) или написать свои

Vlad04: можно не использовать внешнее редактирование и все будет норм Это в каком примере ?


Haz: В частности в этом примере о котором спич редактирование внешнее. Отсюда и все потуги вернуться на нужную запись после него. Или о чем вопрос?

Haz: Andrey пишет: Присоединяюсь обеими руками !!! Зачем для простой таблицы приходиться указывать обработку при смене значений индекса ? Сам Tsbоrwse не может это отследить и остаться на той записи, которую редактировали ? Руки можно опустить и выдохнуть Проверил на тестовом примере , при in-line редактировании значения поля которое входит в индексное выражение , не только Recno() остается той записи которую редактировали, но и сортировка в бровсе выполняется правильно и курсор встает куда надо , вне зависимости увеличили индексный ключ или уменьшили.

Andrey: Haz пишет: Проверил на тестовом примере Давай тест. Будем смотреть его. Может я что-то неправильно делаю... У меня в бровсе частенько курсор переходит непонятно куда. Я делаю редактирование полей в карточке, в бровсе не делаю.

Haz: Andrey пишет: Давай тест. Будем смотреть его А чего там смотреть - тест пустой как барабан [pre2] #include "minigui.ch" #include "tsbrowse.ch" MEMVAR oBrw_1 FUNCTION Main() LOCAL cDbf := GetStartupFolder() + '\Test.dbf' LOCAL i := 0 LOCAL aStr := {} REQUEST DBFCDX , DBFFPT SET CENTURY ON SET DELETED ON RDDSETDEFAULT('DBFCDX') IF ! File( cDbf ) AAdd( aStr, { 'FX', 'N', 10, 2 } ) DbCreate( cDbf, aStr ) cAlias := cFileNoExt(cDbf) USE (cDbf) SHARED ALIAS (cAlias) NEW if ! File( "test.cdx") INDEX ON FIELD->FX TAG FX endif FOR i := 1 TO 100 Test->(dbAppend()) TEST->FX := i END ELSE cAlias := cFileNoExt(cDbf) USE (cDbf) SHARED ALIAS (cAlias) NEW END Test->(OrdSetfocus(1)) DEFINE WINDOW Form_0 ; At 0, 0 ; WIDTH 600 ; HEIGHT 400 ; TITLE 'TsBrowse sample: Order' ; MAIN ; NOMAXIMIZE ; NOSIZE ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW CreateBrowse( "oBrw_1", 'Form_0', 30, 2, Form_0.Width-10, Form_0.Height-60, 'TEST' ) oBrw_1:aColumns[1]:cHeading := "Number" oBrw_1:SetColSize(1, 500) oBrw_1:aColumns[1]:nAlign := DT_LEFT oBrw_1:aColumns[1]:lEdit := TRUE oBrw_1:aColumns[1]:nEditMove := DT_DONT_MOVE Form_0.Center Form_0.Activate RETURN Nil FUNCTION CreateBrowse( cBrw, cParent, nRow, nCol, nWidth, nHeight, cAlias ) LOCAL i PUBLIC &cBrw DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS cAlias ; OF &cParent ; WIDTH nWidth ; HEIGHT nHeight ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 8 :SetAppendMode( .F. ) :SetDeleteMode( .F. ) :lNoHScroll := .T. :lCellBrw := .T. :nSelWidth := 16 END TBROWSE LoadFields( cBrw, cParent ) &cBrw:nHeightCell += 6 &cBrw:nHeightHead += 14 &cBrw:nWheelLines := 1 &cBrw:lNoChangeOrd := TRUE &cBrw:SetColor( { 16 }, { RGB( 43, 149, 168 )}) // SyperHeader backcolor &cBrw:SetColor( { 3 }, { RGB( 255, 255, 255 )}) // Header font color &cBrw:SetColor( { 4 }, { { || { RGB( 43, 149, 168 ), RGB( 0, 54, 94 )}}}) // Header backcolor &cBrw:SetColor( { 17 }, { RGB( 255, 255, 255 )}) // Font color in SyperHeader &cBrw:SetColor( { 6 }, { { || { RGB( 255, 255, 74 ), RGB( 240, 240, 0 )}}}) // Cursor backcolor &cBrw:SetColor( { 12 }, { { || { RGB( 128, 128, 128 ), RGB( 250, 250, 250 )}}}) // Inactive cursor backcolor &cBrw:SetColor( { 2 }, { { || RGB( 230, 240, 255 )}}) // Grid backcolor &cBrw:SetColor( { 1 }, { { || RGB( 0, 0, 0 )}}) // Text color in grid &cBrw:SetColor( { 5 }, { { || RGB( 0, 0, 255 )}}) // Text color of cursor in grid &cBrw:SetColor( { 11 }, { { || RGB( 0, 0, 0 )}}) // Text color of inactive cursor in grid &cBrw:nClrLine := COLOR_GRID &cBrw:ResetVScroll() RETURN Nil [/pre2]

Haz: Andrey пишет: Я делаю редактирование полей в карточке, в бровсе не делаю. я и так и так делаю, правда есть одно но - работаю с ADS через SQL и управляющий индекс всегда нулевой. Но для скорости выполнения запросов индексы есть практически по всем полям

Vlad04: В реалии во многих случаях сложно обойтись без внешнего редактирования.

Haz: Vlad04 пишет: В реалии во многих случаях сложно обойтись без внешнего редактирования. ну так если УВЕРЕНЫ В ТОМ ЧТО RecNo() НЕ ПОМЕНЯЛОСЬ во многих случаях достаточно ::UpStable() ::Refresh( T )

Vlad04: Успокаивает, то, что в что в стандартных задачах, все работает как надо (почти) . Значит, будет работать и вне стандартных. Алгоритм, примерно, ясен: 1) - Перед редактированием определяем, колонку, которую редактируем, индексный ключ и запоминаем их в переменных 2)- После редактирования определяем новый ключ и после его сравнения с исходным организуем движение курсора по бровсу.

Haz: Не надо никуда двигаться по бровсе и не надо ничего запоминать. При нормальной организации внешнего редактирования ячейки текущая запись не меняется и Алгоритм, примерно, ясен: Вызов_внешнего_редактирования() oBrw:UpStable() oBrw:Refresh( .T. ) все [pre2] #include "minigui.ch" #include "tsbrowse.ch" MEMVAR oBrw_1 FUNCTION Main() LOCAL cDbf := GetStartupFolder() + '\Test.dbf' LOCAL i := 0 LOCAL aStr := {} REQUEST DBFCDX , DBFFPT SET CENTURY ON SET DELETED ON RDDSETDEFAULT('DBFCDX') IF ! File( cDbf ) AAdd( aStr, { 'FX', 'N', 10, 2 } ) DbCreate( cDbf, aStr ) cAlias := cFileNoExt(cDbf) USE (cDbf) SHARED ALIAS (cAlias) NEW if ! File( "test.cdx") INDEX ON FIELD->FX TAG FX endif FOR i := 1 TO 100 Test->(dbAppend()) TEST->FX := i END ELSE cAlias := cFileNoExt(cDbf) USE (cDbf) SHARED ALIAS (cAlias) NEW END Test->(OrdSetfocus(1)) DEFINE WINDOW Form_0 ; At 0, 0 ; WIDTH 600 ; HEIGHT 400 ; TITLE 'TsBrowse sample: Order' ; MAIN ; NOMAXIMIZE ; NOSIZE ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW CreateBrowse( "oBrw_1", 'Form_0', 30, 2, Form_0.Width-10, Form_0.Height-60, 'TEST' ) oBrw_1:aColumns[1]:cHeading := "Number" oBrw_1:SetColSize(1, 500) oBrw_1:aColumns[1]:nAlign := DT_LEFT oBrw_1:aColumns[1]:lEdit := TRUE oBrw_1:aColumns[1]:nEditMove := DT_DONT_MOVE oBrw_1:aColumns[1]:bPrevEdit := { || ExtEdit(), .F. } Form_0.Center Form_0.ACTIVATE RETURN Nil FUNCTION CreateBrowse( cBrw, cParent, nRow, nCol, nWidth, nHeight, cAlias ) LOCAL i PUBLIC &cBrw DEFINE TBROWSE &cBrw ; AT nRow, nCol ; ALIAS cAlias ; OF &cParent ; WIDTH nWidth ; HEIGHT nHeight ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 8 :SetAppendMode( .F. ) :SetDeleteMode( .F. ) :lNoHScroll := .T. :lCellBrw := .T. :nSelWidth := 16 END TBROWSE LoadFields( cBrw, cParent ) &cBrw:nHeightCell += 6 &cBrw:nHeightHead += 14 &cBrw:nWheelLines := 1 &cBrw:lNoChangeOrd := TRUE &cBrw:ResetVScroll() RETURN Nil Func ExtEdit() DEFINE WINDOW Form_E ; AT 0,0; WIDTH 150 ; HEIGHT 100 ; TITLE "" ; MODAL ; NOSIZE END WINDOW DEFINE GETBOX NUM PARENT Form_e ROW 10 COL 5 WIDTH 130 HEIGHT 22 VALUE TEST->FX PICTURE "99999.99" FONTNAME 'Arial' FONTSIZE 12 TOOLTIP '' END GETBOX DEFINE BUTTONEX Button_Cancel ROW Form_E.Height - 60 COL 2 PARENT Form_E WIDTH 68 HEIGHT 24 ACTION { || Form_E.Release } CAPTION "Отмена" END BUTTONEX DEFINE BUTTONEX Button_Ok ROW Form_E.Height - 60 COL 73 PARENT Form_E WIDTH 68 HEIGHT 24 ACTION { || IF( test->(dbRlock()), TEST->FX := GetProperty( "Form_E", "Num", "Value" ), NIL ), Test->(dbUnlock()) , Form_E.Release } CAPTION "Выбрать" END BUTTONEX Form_e.Center Form_e.Activate oBrw_1:Upstable() oBrw_1:Refresh(.T.) oBrw_1:ResetVScroll() Return NIL [/pre2]

SergKis: Игорь с какой целью в примерах есть[pre2] DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 600 ; HEIGHT 40 ; CHILD ; NOSYSMENU ; NOCAPTION END WINDOW [/pre2] что ты этим хотел сказать ?

Haz: SergKis пишет: что ты этим хотел сказать ? Делал просто на базе другого примера и не весь мусор вычистил Полезной нагрузки Form_1 не несет. Весь пример делался ради трех строк [pre2] oBrw_1:Upstable() oBrw_1:Refresh(.T.) oBrw_1:ResetVScroll() [/pre2] PS. вычистил мусор из примеров, спасибо за наводку. т.к. сам примеры свои же и не смотрю

SergKis: Haz пишет:не весь мусор вычистил Ясненько, а то подумал, что ты хотел еще, что то показать, но забыл

Vlad04: Haz oBrw_1:Upstable() oBrw_1:Refresh(.T.) oBrw_1:ResetVScroll() По сути нужно из подчиненной формы обновить объект на главной. У меня уже программа разрослась, куча файлов, форм( каждые по принадлежности). Вызов из формы Form_2 после сохранения изменений &(cForm). oBrw_1:Upstable() невозможен ? Или как-то можно это сделать ?

Haz: Vlad04 пишет: &(cForm). oBrw_1:Upstable() невозможен ? Или как-то можно это сделать ? oBrw_1 - это переменная, тип которой - "О". Нужно просто обеспечить ее видимость в Form_2 и достаточно просто oBrw_1:Upstable(), возможно перед этим потребуется oBrw_1:Setfocus() У себя я все бровсы объявляю как PUBLIC и все равно из какой формы вызов. В примере же это есть

Vlad04: В MiniGui объекты и формы можно объявить как 1)- Form_1.Brw_1 2)- &(cForm).Brw_1 3) - Form.&(oBrw) Наверно, еще есть варианты. Я выбрал второй вариант. У меня несколько десятков подобных справочников. Я меняю параметры (имя формы , размеры, алиасы) и все работает. Но Бровсы у всех имеют одно имя, но разных хозяев. И без привязки к имени формы к нему не обратишься. Вот такая неувязка

Haz: Vlad04 пишет: Вот такая неувязка DEFINE TBROWSE oLbx AT 10,15 ; oLbx это переменная, явно или неявно указанная . Если неявно то она local в этом модуле и никто не запрещает давать в разных модулях одни и те же имена. По этой причине и "все работает" Посмотри примеры в минигуи , в большинстве своем это именно Local переменные, в главном примере это Public. Vlad04 пишет: И без привязки к имени формы к нему не обратишься. Вот такая неувязка Тоже мне неувязка - передавай по ссылке в функцию в которой рисуется окно для внешнего редактирования. Или подбирайся по алгоритму 1) получи хендл окна Form_1 как h := GetFormHandle("Form_1") 2) просканируй массив _HMG_aControlParentHandles в каких позициях найдено будет h 3) просканируй массив _HMG_aControlNames в позициях найденных выше. где значение будет равно имени твоего бровса и запомни позицию ( пусть х ) 4) в массиве _HMG_aControlIds[ x ] и лежит твой бровс, _HMG_aControlIds[ x ]:Upstable() _HMG_aControlIds[ x ]:Refresh( .T. ) итд ЗЫ Но проще все же сразу давать нормальные имена переменным и обеспечивать нужную видимость

Haz: Haz пишет: Или подбирайся по алгоритму Примерно так [pre2] ... GetBrw( "Form_1", "oBrw" ):Upstable() ... Func GetBrw( cFormName, cBrwName ) local h := GetFormHandle(cFormName) local k := 0 for k := 1 to Len(_HMG_aControlNames) if _HMG_aControlParentHandles[ k ] == h .AND. _HMG_aControlNames[ k ] == cBrwName Exit end end RETURN _HMG_aControlIds[k] [/pre2]



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