Форум » 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

Andrey: SergKis пишет: oBrw:Enabled( lEnable ) - с закраской тсб А как свою закраску установить ? Хочется черный фон и серые буквы. Можно сделать как то так - oBrw:Enabled( .F. , {BLACK,SILVER} ) ?

SergKis: Andrey Посмотри исходник :Enabled(), думаю, увидишь Можешь найти тему "Новая версия ...", посвященную :Enabled()

Andrey: Хотелось бы простого написания, как то так - oBrw:Enabled( .F. , {BLACK,SILVER} ) А так придётся писать отдельную внешнюю функцию. Не совсем удобно... И в METHOD Enabled() нет сохранения [pre2]oBrw:nClrLine := ??? // цвет линий между ячейками таблицы[/pre2]


SergKis: Andrey Ты, точно, посмотрел исходник и пост в теме ? Григорий делал переменные объекта, для уст. цветов закраски.

Andrey: SergKis пишет: Ты, точно, посмотрел исходник и пост в теме ? Да вроде да ! По теме нашёл gfilatov2002 пишет: Для этого я добавил в класс DATA nClr_Gray AS NUMERIC INIT CLR_GRAY DATA nClr_HGray AS NUMERIC INIT CLR_HGRAY А как это использовать - не понимаю. У себя сделал тест: [pre2] oBrw:Enabled( .F. ) // блокировка таблицы с закраской nClrLine := TsbColorRepl(oBrw, BLACK, SILVER) MsgDebug(...) oBrw:nClrLine := nClrLine // восстановить цвет линий между ячейками таблицы oBrw:Enabled( .T. ) // разблокировка таблицы с закраской .... /////////////////////////////////////////////////////////////////// // заменить текущий цвет TBROWSE FUNCTION TsbColorRepl(oBrw, aBackColor, aFontColor) LOCAL nJ, nBackColor, nFontColor, nSaveColor nFontColor := ToRGB( aFontColor ) nBackColor := ToRGB( aBackColor ) // ------ изменить цвета Tsbrowse ------------ FOR nJ := 1 to LEN(oBrw:aColumns) // меняем цвет по всем колонкам oBrw:SetColor( { 1}, { { || nFontColor } } ) // 1 , текста в ячейках таблицы oBrw:SetColor( { 2}, { { || nBackColor } } ) // 2 , фона в ячейках таблицы oBrw:Setcolor( { 3}, { nFontColor } ) // 3 , текста шапки таблицы oBrw:SetColor( { 4}, { { || nBackColor } } ) // 4 , фона шапка таблицы oBrw:SetColor( { 9}, { nFontColor } ) // 9 , текста подвала таблицы oBrw:SetColor( {10}, { { || nBackColor } } ) // 10, фона подвала таблицы //oBrw:SetColor( {15}, { { || CLR_WHITE } } ) // 15, линий между ячейками таблицы NEXT nSaveColor := oBrw:nClrLine // сохранить цвет линий между ячейками таблицы oBrw:nClrLine := nFontColor // новый цвет линий между ячейками таблицы // цвет фона под таблицей oBrw:hBrush := CreateSolidBrush( aBackColor[1], aBackColor[2], aBackColor[3] ) RETURN nSaveColor[/pre2] Так заработала, только вверху шапки и внизу подвала за границей таблицы НЕ КРАСЯТСЯ ячейки.

SergKis: Andrey пишет А как это использовать - не понимаю. Внимательно, медленно просмотри метод :Enabled() Найди переменные, сравни со своим текстом ...

Andrey: Всем привет ! Всех поздравляю с праздниками ! Вопрос возник. Делаю у себя в проге на главной таблице: [pre2] oBrw:Enabled( .F. ) // блокировка таблицы с закраской[/pre2] Таблица становиться серой и на первом же поле вывода прога сваливается: Error BASE/1003 Переменная не существует: MARK // это первое поле в таблице Called from (b)LISTFIELDTABLE(847) in module: Tbrw_table.prg Called from TSBROWSE:BDATAEVAL(1584) in module: h_tbrowse.prg Called from TSBROWSE:DRAWSELECT(3797) in module: h_tbrowse.prg Called from TSBROWSE:PAINT(9779) in module: h_tbrowse.prg Called from TCONTROL:HANDLEEVENT(878) in module: TControl.prg Called from TSBROWSE:HANDLEEVENT(8328) in module: h_tbrowse.prg Called from EVENTS(95) in module: h_events.prg Called from DOEVENTS(0) Called from CREATEBROWSEPRINTF5(441) in module: form_f5print.prg Called from FORM_F5PRINT(221) in module: form_f5print.prg Called from FORMPRINTF5(105) in module: form_f5print.prg Called from (b)BUTTON_UPMENUTABLE(2152) in module: Tbrw_table.prg Вот код:[pre2] Дата_2 = '{|| (Alias())->MARK }' // это текстовый ини-файл For nI := 1 To Len(aTable) cHeadName := aTable[nI,1 ] // 1 Шапка_ cDateBlock := aTable[nI,2 ] // 2 Дата_ ...... // ------ преобразовать на знаки ------ cHeadName := STRTRAN(cHeadName,";", CRLF ) cDateBlock := STRTRAN(cDateBlock,'CRLF', '"' + CRLF + '"' ) xVal := Eval( &( cDateBlock ) ) aAligh := &(cAlighColum) // выравнивание: cells, header, footer ADD COLUMN TO TBROWSE oBrw // добавить новую колонку в TBROWSE oBrw:aColumns[nI]:cHeading := cHeadName // заголовок колонки oBrw:aColumns[nI]:bData := &( cDateBlock ) // поля в колонке 847 строка oBrw:aColumns[nI]:nAlign := aAligh[1] // выравнивание: cells[/pre2] Что я не так делаю ?

SergKis: Andrey пишет Что я не так делаю ? Для таких действий в объект колонки внесена переменная\свойство cAlias, т.е. oCol:bData := MacroBlock('MARK') oCol:cAlias := 'MY1' если алиас совпадает с алиасом тсб, то oCol:cAlias := oBrw:cAlias или обычный вариант oCol:bData := FieldWBlock('MARK', Select(Alias()))

SergKis: PS Расшифровка cDataBlock := '{|| MARK }' bVal := &( cDataBlock ) xVal := Eval( bVal ) ? cDataBlock, xVal, bVal oCol:bData := bVal If ! '->' $ cDataBlock oCol:cAlias := oBrw:cAlias EndIf

Andrey: SergKis - СПАСИБО !

Haz: Вопрос поднял Сергей, я немного перефразирую и спрошу тут С какой целью в METHOD TSBrowse:Edit() в CheckBox игнорируется VK_RETURN ? Кроме как защита от дурака , когда пользователь тыкает бездумно по кнопкам и не смотрит что происходит у меня другого объяснения нет. Ведь до кнопки VK_SPACE нужно типа "осмысленно" дотянуться. Только мне кажется что если бездумно , то все равно куда тянуться, до 1, 0, Y, N, S, ENTER, SPACE но только ENTER в этом случае игнорируется. В итоге пользователь до изнеможения долбит ENTER , забывая про SPACE и устав кликает мышью. Может восстановим VK_RETURN в правах ? для совместимости можно с флагом типа ::lCheckBoxIgnoreReturn по умолчанию TRUE , а можно и без тогда [pre2] If nKey != VK_RETURN .OR. # ::lCheckBoxIgnoreReturn If Upper( Chr( nKey ) ) $ "YCST1" ::lChanged := uVar == .F. uVar := .T. ElseIf Upper( Chr( nKey ) ) $ "FN0" ::lChanged := uVar == .T. uVar := .F. ElseIf nKey == VK_SPACE uVar := ! uValue ::lChanged := .T. Else Return 0 EndIf ::lHasChanged := If( ::lChanged, .T., ::lHasChanged ) ::oWnd:nLastKey := VK_RETURN ::PostEdit( uVar, nCell ) ::lPostEdit := .F. Return 0 Else ::lPostEdit := .T. ::lChanged := .F. ::oWnd:nLastKey := nKey ::PostEdit( uValue, nCell ) ::lPostEdit := .F. Return 0 EndIf [/pre2]

Andrey: Haz пишет: тогда в своей программе при определении бровса достаточно указать oBrw:bEditLog := { |a,b,c| WriteEditLog( a, b, c:cAlias ) } Поставил у себя такую замечательную эту штуку в тестовый пример ! Отличное решение, юзера будут просто в восторге. Я ещё сделал поиск по номеру записи - вообще все претензии что программа сама удалила и исправила - пропадут ! Правда не по всем полям происходит запись. Нужно разбираться. Спасибо БОЛЬШОЕ Haz !

Haz: Andrey пишет: Правда не по всем полям происходит запись. Нужно разбираться. Рад что пригодилось. Запись не идет по тем полям где используется bPrevEdit с последующим отказом от редвктирования., но с изменением значения. Тут нужно самому позаботиться, т. к. метод Edit не вызывается. В целом использую подобный функционал несколько лет. Мотивирует пользователя лучше чем пинок, особенно когда все видят героя.

Haz: Haz пишет: В целом использую подобный функционал несколько лет. Добавлю, что из объекта tsBrosе который передается блоку третьим параметром, легко достать номер колонки и соответственно имя Поля, которое изменили. Никак не доходят руки до контрольного примера запятая будет посвободнее обязательно что-нибудь простое напишу

Andrey: Да мне Сергей посоветовал так сделать: [pre2] // запись в лог-файл всех изменений полей БД oBrw1:bEditLog := { |xo,xn,ob| WriteEditLog( xo, xn, ob ) } [/pre2] Вот мой код записи [pre2] ///////////////////////////////////////////////////////////////////// // запись в лог-файл всех изменений полей БД FUNCTION WriteEditLog( xOld, xNew, oBrw ) LOCAL cFileLog := ChangeFileExt( Application.ExeName, ".log" ) LOCAL nCol, cHead, cStr, CRZ := "; " nCol := oBrw:nCell - 1 // номер колонки в таблице cHead := oBrw:aColumns[ nCol ]:cHeading // имя шапки колонки IF LEN(ALLTRIM(cHead)) == 0 cHead := HB_NtoS(nCol) ENDIF cStr := DToC( Date() ) + CRZ + Time() + CRZ cStr += NetName()+"/"+hb_UserName()+"/User-"+HB_NtoS(M->nPubUser) + CRZ // Кто изменил данные cStr += oBrw:cAlias + CRZ + "ID=" + HB_NtoS( (oBrw:cAlias)->ID ) + CRZ cStr += "Запись: " + HB_NtoS( (oBrw:cAlias)->(RecNo()) ) + CRZ cStr += "Колонка: " + cHead + CRZ IF VALTYPE(xOld) == "C" cStr += "замена: [" + ALLTRIM(xOld) + "] на: [" + ALLTRIM(xNew) + "]" + CRZ ELSE cStr += "замена: [" + cValToChar(xOld) + "] на: [" + cValToChar(xNew) + "]" + CRZ ENDIF cStr += CRLF STRFILE(cStr, cFileLog, .T.) RETURN NIL[/pre2] Только мне пришлось делать nCol := oBrw:nCell - 1

Haz: Andrey пишет: Только мне пришлось делать nCol := oBrw:nCell - 1 Возможно используешь :Selector по этому нумерация едет. Попробуй выдернуть имя поля через oCol:cName Продолжу тут. Я лог веду в dbf, с указанием имени поля и тайм штампа времени изменения. Это позволяет вне завистмости в каком бровсе поменяли значение, всегда правильно показывать хронологию. Показ реализован прямо в бровсе по правой кнопке. Имя колонки в логе меня не особо интересует, т. к. показываю лог именно в ней.

SergKis: Haz пишет Имя колонки в логе меня не особо интересует, т. к. показываю лог именно в ней Посмотрел на примере, oBrw:nCell и nCol в METHOD PostEdit, разные. Добавил в вызов nCol [pre2] METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse ... xNewEditValue := ::bDataEval( ::aColumns[ nCol ], , nCol ) //Igor Nazarov If hb_isBlock( ::bEditLog ) .and. ::aColumns[ nCol ]:xOldEditValue != xNewEditValue Eval( ::bEditLog, ::aColumns[ nCol ]:xOldEditValue, xNewEditValue, Self, nCol ) EndIf Return Nil В задаче oBrw1:bEditLog := { |xo,xn,ob,nc| WriteEditLog( xo, xn, ob, nc ) } ... FUNCTION WriteEditLog( xOld, xNew, oBrw, nCell ) LOCAL cFileLog := ChangeFileExt( Application.ExeName, ".log" ) LOCAL nCol, cHead, cStr, CRZ := "; ", oCol, cAls, cName, oC WITH OBJECT oBrw DEFAULT nCell := :nCell oC := :aColumns [ nCell ] oCol := :GetColumn( nCell ) // - iif( :lSelector, 1, 0 ) ) cName := oCol:cName nCol := :nColumn( cName ) cAls := iif( Empty(oCol:cAlias), :cAlias, oCol:cAlias ) cHead := oCol:cHeading END WITH ? cAls , oBrw:lSelector, oBrw:nCell ? nCell, oC:cName, oC:cHeading ? nCol , cName , cHead ... получил в _MsgLog.txt MAIN .F. 8 7 FTEXT Text 7 FTEXT Text правилась колонка 7 FTEXT [/pre2] Думаю надо добавить в вызов номер колонки редактирования в вызов :bEditLog для начала

SergKis: Причина другого значения :nCell понятна, уже выполнены команды [pre2] If nLastKey == VK_UP .and. ::lPostEditGo ::GoUp() ElseIf nLastkey == VK_RIGHT .and. ::lPostEditGo ::GoRight() ElseIf nLastkey == VK_LEFT .and. ::lPostEditGo ::GoLeft() ElseIf nLastkey == VK_DOWN .and. ::lPostEditGo ::GoDown() ::Refresh( .F. ) ElseIf ::aColumns[ nCol ]:nEditMove >= 1 .and. ::aColumns[ nCol ]:nEditMove <= 5 // excel-like behaviour post-edit movement Eval( aMoveCell[ ::aColumns[ nCol ]:nEditMove ] ) ElseIf ::aColumns[ nCol ]:nEditMove == 0 ::DrawSelect() EndIf [/pre2] т.е. подготовлена работа со след. колонкой

SergKis: Можно сделать так [pre2] If hb_isBlock( ::bEditLog ) .and. ::aColumns[ nCol ]:xOldEditValue != xNewEditValue uTemp := ::nCell ::nCell := nCol Eval( ::bEditLog, ::aColumns[ nCol ]:xOldEditValue, xNewEditValue, Self ) ::nCell := uTemp EndIf [/pre2]

Haz: SergKis пишет: т.е. подготовлена работа со след. колонкой Может обработку bEditLog поднять перед этой подготовкой? Посмотрю с работы, с телефона не реально.



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