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

SergKis: Andrey пишет: расползание подвала таблицы Это эффект фантомной строки (обсуждали в теме о ней), т.е. если строк сделать больше, высоту tsb меньше и увеличивать постепенно, проявляется фант. строка, когда строк становится меньше - остается прорисованный ранее подал, т.е. нет метода очистить часть экрана, после факт. строк :nRowCount() и подвалом. Как лечить ? Не менять высоту tsb, если реальная высота (расчет см. в SetNoHole(oBrw) ) всех строк и заголовков\подвалов меньше\равно new высоте после Resize окна и в расчете new высоты использовать :nRowCount() * :nHeightCell + высоты заголовков\подвалов (что бы те было фантомной строки).

Haz: SergKis пишет: Это эффект фантомной строки Сергей, тут другая проблема. Глядя на скрины до фантома еще далеко т.к. строк в таблице мало. Тут лекарство к другому месту прикладывать надо. Andrey пишет: Как исправить ? Во первых внимательно посмотреть на код и задать себе вопрос по каждой строке зачем это написано. 1) [pre2] // По методу Move() запускается ReSize() - описание параметров см. ???, [/pre2] По этому методу никакой Resize() не запускается, в исходниках метод 4 строки , где там Resize()?, кокое описание параметров [pre2] METHOD Move( nTop, nLeft, nWidth, nHeight, lRepaint ) CLASS TControl MoveWindow( ::hWnd, nTop, nLeft, nWidth, nHeight, lRepaint ) ::CoorsUpdate() return nil [/pre2] 2) это зачем ? есть же простой и понятный метод Refresh(.T.) [pre2] //oBrw:Display() oBrw:Paint() // Иначе не перерисовываются вертикальные разделители [/pre2] 3) в примере ColorConfig еще какой то вызов CorrectFirstLast() ? Какого художника ... он вообще нужен ? Это была не совсем удачная попытка избавиться от залипания последней строки, как показала практика - не помогает. В теме про дырку , все расписали как надо с этим бороться и Сергей и Дима там все доступно рассказали Резюме Убрать неправильные комменты вместо паинта и дисплая поставить рефреш( Т) и чуть не забыл ... повыкидывать везде этот корректфёстласт

SergKis: Haz Я использовал [pre2] FUNCTION ResizeBrowse() LOCAL cForm := oBrw:cParentWnd LOCAL hWnd := GetFormHandle(cForm) LOCAL nHStBar := GetWindowHeight(GetControlHandle('STATUSBAR', cForm)) // height StatusBar Local actpos:={0,0,0,0} Local i, w, h GetClientRect(hWnd, actpos) w := actpos[3]-actpos[1] h := actpos[4]-actpos[2] - nHStBar - oBrw:nTop IF w !=0 .and. h != 0 SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.) _SetControlHeight( oBrw:cControlName, oBrw:cParentWnd, h) _SetControlWidth ( oBrw:cControlName, oBrw:cParentWnd, w) oBrw:Paint() SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.) // oBrw:Display() Endif Return Nil [/pre2] все видно в работе exe, как, я описал


Haz: SergKis пишет: oBrw:Paint() SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.) // oBrw:Display() Сергей, в примере у Андрея Tsb_config это код видимо с тебя списан , как и написал Андрей - в этом же примере приводит к залипанию футингов. При замене на банальный рефреш - залип исчезает

SergKis: Haz пишет:банальный рефреш - залип исчезает работает я пробнул display() - не то (а с фантомной решалось через это), а Paint() перерисовал, но криво, на рефреш и не подумал - оказывается зря

Andrey: Haz пишет: Сергей, в примере у Андрея Tsb_config это код видимо с тебя списан Мне этот код Григорий помогал писать. Если окно MAIN - работает без проблем. Я сделал окно WINDOWTYPE STANDARD - появился этот эффект. CorrectionFirstLast() убрал совсем, я Григорию предлагал новую версию этого примера для библиотеки, он не захотел. Из-за этого в старом примере и делал этот эффект, чтобы всем другим было понятней, от чего я исходил. Haz пишет: При замене на банальный рефреш - залип исчезает Да действительно исчез. Спасибо БОЛЬШОЕ !

Haz: Andrey пишет: Из-за этого в старом примере и делал этот эффект, чтобы всем другим было понятней, от чего я исходил. Андрей , Вот это главное. Не важно кто кому помогал, но если пример для обучения тех кто вообще впервые минигуи видит , то там не стоит оставлять комментарии которые могут запутать. Пример у тебя получился объемный и сложный, всего не углядишь и косяки могут вылезти внезапно. По мне , так вместо одного глобального примера - лучше 10 маленьких узко тематических И для понимания проще и поиграться проще при изучении. Вот ресайз тока что накидал , ничего лишнего и все понятно [pre2] #include "minigui.ch" #include "tsbrowse.ch" FUNC Main() Local aArray := { ; {'AAAAAAAAAAAAAAAA', 1, Date() }, ; {'BBBBBBBBBBBBBBBB', 2, Date() }, ; {'CCCCCCCCCCCCCCCC', 3, Date() }, ; {'DDDDDDDDDDDDDDDD', 4, Date() }, ; {'EEEEEEEEEEEEEEEE', 5, Date() }, ; {'FFFFFFFFFFFFFFFF', 6, Date() }, ; {'GGGGGGGGGGGGGGGG', 7, Date() } ; } DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 300 ; TITLE "TsBrowse ReSize Test" ; MAIN ; FONT 'Tahoma' SIZE 9; ON SIZE { || ResizeBrw( oBrw )} ; ON MINIMIZE { || ResizeBrw( oBrw )} ; ON MAXIMIZE { || ResizeBrw( oBrw )} DEFINE TBROWSE oBrw ; AT 5,5 ; OF Form_1 ; WIDTH GetProperty("Form_1", 'Width') - 25 ; HEIGHT GetProperty("Form_1", 'Height') - 50 ; FONT "Tahoma" ; SIZE 9 ; GRID ; EDIT oBrw:SetArray( aArray, .T. ) oBrw:nAdjColumn := 1 oBrw:aColumns[1]:cFooting := "STRING" oBrw:aColumns[2]:cFooting := "NUM" oBrw:aColumns[3]:cFooting := "DATE" oBrw:aColumns[1]:nFAlign := DT_LEFT oBrw:aColumns[2]:nFAlign := DT_LEFT oBrw:aColumns[3]:nFAlign := DT_CENTER oBrw:lFooting := .T. oBrw:lDrawFooters := .T. oBrw:nHeightFoot := 20 oBrw:DrawFooters() END TBROWSE END WINDOW ACTIVATE WINDOW Form_1 RETURN NIL FUNC ReSizeBrw( oBrw ) local nTop := GetProperty("Form_1", 'Row') + 5, ; nLeft := GetProperty("Form_1", 'Col') + 5, ; nWidth := GetProperty("Form_1", 'Width') - 25, ; nHeight := GetProperty("Form_1", 'Height') - 50 oBrw:Move( nTop,nLeft, nWidth, nHeight, .T. ) Return oBrw:Refresh(.T.) [/pre2]

Andrey: Haz пишет: По мне , так вместо одного глобального примера - лучше 10 маленьких узко тематических И для понимания проще и поиграться проще при изучении. Вот ресайз тока что накидал , ничего лишнего и все понятно Пример классный ! То что нужно для изучения новичку ! Когда делал свой пример, много не понимал. Что сделал - то сделал, нужно править. Выкладывал на форуме пробную версию - писал: комментарии и исправления приветствуются ! Haz пишет: nTop := GetProperty("Form_1", 'Row') + 5, ; nLeft := GetProperty("Form_1", 'Col') + 5, Только вместо этого лучше oBrw:nLeft ,oBrw:nTop ( новичку понятней буде как можно делать)

Andrey: SergKis пишет: IF w !=0 .and. h != 0 SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .F.) _SetControlHeight( oBrw:cControlName, oBrw:cParentWnd, h) _SetControlWidth ( oBrw:cControlName, oBrw:cParentWnd, w) oBrw:Paint() SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Enabled", .T.) // oBrw:Display() Endif Уточни пожалуйста для чего это нужно ?

Haz: Andrey пишет: Уточни пожалуйста для чего это нужно ? так тут все и так все понятно oBrw:cParentWnd вернет имя формы в которой бровс определен oBrw:cControlName вернет имя самого бровса А дальше если ширина и высота после ресайса больше нуля, то бровсу говорят Enabled := F, затем меняют его размеры, прорисовывают и Enabled := T Видимо так тоже сработает, мне больше через :Move() нравится PS: Andrey пишет: Только вместо этого лучше oBrw:nLeft ,oBrw:nTop ( новичку понятней буде как можно делать) В примере nTop , nLeft и пр. это координаты формы Form_1 , а не самого бровса. Тогда уж не oBrw:nTop , а Form_1.Row. Мне больше через GetProperty нравится , т.к. универсально ( не требуется DECLARE WINDOW указывать если окно не объявлено выше по тексту ), но это дело привычки

Andrey: Привет всем ! Как работать с TBROWSE при перепоказе записей ? Описание проблемки: Установлен условный индекс по полю метка, меняем это значение, кол-во записей в TBROWSE изменилось. Указатель записи нужно поставить на следующую запись. cAlias := (oBrw:cAlias) .... CASE nKey == VK_SPACE cField := "MARK" IF FIELDNUM(cField) > 0 // есть ли такое поле в БД nRecno := (oBrw:cAlias)->(OrdKeyNo()) xVal := mFieldGet(cField, cAlias) xVal := ! xVal mFieldPut(cField, xVal, cAlias) oBrw:DrawSelect() IF LEN(aCargoFilter) > 0 // если стоит индекс-фильтр по этому полю, то обнулить бровс IF AT( cField, UPPER(aFilter[2]) ) > 0 oBrw:Reset() //oBrw:GoToRec( nRecno-1 ) // вот здесь не знаю как делать.... ENDIF ENDIF oBrw:Refresh(.F.) EndIf

Haz: Andrey пишет: Указатель записи нужно поставить на следующую запись. Посмотри как это делает TSBrowse при удалении записи , т.к. суть одинакова

Andrey: Haz пишет: Посмотри как это делает TSBrowse при удалении записи Вот это - METHOD TSBrowse:DeleteRow() ?

Haz: Andrey пишет: Вот это - METHOD TSBrowse:DeleteRow() ? Да, именно это

Andrey: Спасибо ! И ещё один вопрос созрел. Делаю: Add Super Header To oBrw1 From Column 1 To Column 8 ; Color CLR_BLACK, { CLR_RED , CLR_YELLOW } ; Title "Мой СУПЕРХИДЕР таблицы" 3DLook Можно ли на него создать обработку своей функции ? Как это сделать ? И как поменять центровку строк в этом суперхидере ?

Haz: Andrey пишет: Можно ли на него создать обработку своей функции какую обработку ? если клик по хидеру - то вроде есть такая Andrey пишет: И как поменять центровку строк в этом суперхидере опять таки какую центровку - горизонтальная есть

Andrey: Haz пишет: если клик по хидеру - то вроде есть такая Да, клик по хидеру. Я не нашел как повесить, допустим MsgDebug("Мой СУПЕРХИДЕР таблицы") ? Haz пишет: опять таки какую центровку - горизонтальная есть А мне нужно влево центровать, а не по центру.

Haz: Andrey пишет: А мне нужно влево центровать, а не по центру. влево вправо по центру - это все ГОРИЗОНТАЛЬНОЕ выравнивание По сути вопроса -гляну в исходниках позже

SergKis: Andrey пишет:А мне нужно влево центровать, а не по центру. [pre2] #command ADD [ SUPER ] HEADER TO <oBrw> ; FROM [ COLUMN ] <nFrom> ; TO [ COLUMN ] <nTo> ; [ <head:TITLE, HEADER> <cHead> ] ; [ HEIGHT <nHeight> ] ; [ <color:COLOR, COLORS> <aColors,...> ] ; [ <l3dLook: 3DLOOK, LOOK3D> ] ; [ FONT <uFont> ] ; [ <lGrid:NOGRID, NOLINES> ] ; [ BITMAP <uBmp> ] ; [ <lAdj:ADJUST> ] ; [ <lTra:TRANSPARENT> ] ; [ <horz:HORZ, HORZ ALIGN> <nHAlign> ] ; [ <vert:VERT, VERT ALIGN> <nVAlign> ] ; => ; <oBrw>:AddSuperHead( <nFrom>, <nTo>, <cHead>, [ <nHeight> ], ; [ \{<aColors>\} ], <.l3dLook.>, <uFont>, ; <uBmp>, <.lAdj.>, <.lTra.>, <.lGrid.>, ; <nHAlign>, <nVAlign> ) * ============================================================================ * METHOD TSBrowse:AddSuperHead() Version 9.0 Nov/30/2009 * ============================================================================ Method AddSuperHead( nFromCol, nToCol, uHead, nHeight, aColors, l3dLook, uFont, uBitMap, lAdjust, lTransp, ; lNoLines, nHAlign, nVAlign ) CLASS TSBrowse Local cHeading, nAt, nLheight, nOcurs, cRest, nLineStyle, nClrText, nClrBack, nClrLine, ; hFont := If( ::hFont != Nil, ::hFont, 0 ) Default lAdjust := .F., ; l3DLook := ::aColumns[ nFromCol ]:l3DLookHead, ; nHAlign := DT_CENTER, ; nVAlign := DT_CENTER, ; lTransp := .T., ; uHead := "" ... [/pre2]

Andrey: Делаю: Add Super Header To oBrw1 From Column 1 To Column 8 ; Color CLR_BLACK, { CLR_RED , CLR_YELLOW } ; Title "Мой СУПЕРХИДЕР таблицы" 3DLook HORZ DT_LEFT Ура, заработало ! И как еще повесить при нажатии на этот "Super Header", допустим MsgDebug("Мой СУПЕРХИДЕР таблицы") ?



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