Форум » 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: Строю ТСБ, удаляю(скрываю) колонки, делаю заморозку столбцов: [pre2] :nFreeze := :nColumn("TEVENT") // заморозить таблицу до этого столбца :lLockFreeze := .T. // избегать прорисовки курсора на замороженных столбцах [/pre2] Курсор на таблице, но нет активного ввода, нужно стрелкой вправо или Enter нажать, тогда появляется активный ввод. И ещё при движении налево, т.е. где замороженные столбцы - курсор уходит на эти столбцы, т.е. пропадает. Почему, установил же :lLockFreeze := .T. ?

Haz: Andrey пишет: И ещё при движении налево, т.е. где замороженные столбцы - курсор уходит на эти столбцы, т.е. пропадает. Почему, установил же :lLockFreeze := .T. ? проверил на последней сборке все работает , ищи у себя ошибку Andrey пишет: Курсор на таблице, но нет активного ввода, ху из активный ввод ?

Andrey: Haz пишет: ху из активный ввод ? Вот это, активный курсор для ввода: При построении ТСБ надо ENTER нажать, только тогда появляется активный ввод.


SergKis: Andrey Что бы не было разных непоняток, можно делать так (на базе примера Tsb_MoreFields\demo.prg)[pre2] #include "hmg.ch" #include "TSBrowse.ch" REQUEST DBFCDX function Main() field FIRST,LAST,STREET,CITY,STATE,ZIP,HIREDATE,MARRIED,AGE,SALARY field FIRST2,LAST2,STREET2,CITY2,STATE2,ZIP2,HIREDATE2,MARRIED2,AGE2,SALARY2 field FIRST3,LAST3,STREET3,CITY3,STATE3,ZIP3,HIREDATE3,MARRIED3,AGE3,SALARY3 field FIRST4,LAST4,STREET4,CITY4,STATE4,ZIP4,HIREDATE4,MARRIED4,AGE4,SALARY4 field FIRST5,LAST5,STREET5,CITY5,STATE5,ZIP5,HIREDATE5,MARRIED5,AGE5,SALARY5 field FIRST6,LAST6,STREET6,CITY6,STATE6,ZIP6,HIREDATE6,MARRIED6,AGE6,SALARY6 field FIRST7,LAST7,STREET7,CITY7,STATE7,ZIP7,HIREDATE7,MARRIED7,AGE7,SALARY7 field FIRST8,LAST8,STREET8,CITY8,STATE8,ZIP8,HIREDATE8,MARRIED8,AGE8,SALARY8 local obrw, aStruct, cCust, cmiln, n, nLen, a, i, c cCust := "customer.dbf" cmiln := "custmiln.dbf" SET OOP ON if File( cmiln ) USE ( cmiln ) NEW ALIAS "CUST" VIA "DBFCDX" else aStruct := hmg_DBfSTRUCT( cCust ) ASize( aStruct, Len( aStruct ) - 1 ) nLen := Len( aStruct ) for i := 2 to 8 c := Str( i, 1, 0 ) for n := 2 to nLen a := AClone( aStruct[ n ] ) a[ 1 ] += c AAdd( aStruct, a ) next next DBCREATE( cmiln, aStruct, "DBFCDX", .t., "CUST" ) for n := 1 to 20 //2000 APPEND FROM customer.dbf ; FIELDS FIRST,LAST,STREET,CITY,STATE,ZIP,HIREDATE,MARRIED,AGE,SALARY next GO TOP REPLACE ALL FIRST2 WITH FIRST, LAST2 WITH LAST, CITY2 WITH CITY, STATE2 WITH STATE, ; ZIP2 WITH ZIP, HIREDATE2 WITH HIREDATE, MARRIED2 WITH MARRIED, ; AGE2 WITH AGE, SALARY2 WITH SALARY REPLACE ALL FIRST3 WITH FIRST, LAST3 WITH LAST, CITY3 WITH CITY, STATE3 WITH STATE, ; ZIP3 WITH ZIP, HIREDATE3 WITH HIREDATE, MARRIED3 WITH MARRIED, ; AGE3 WITH AGE, SALARY3 WITH SALARY REPLACE ALL FIRST4 WITH FIRST, LAST4 WITH LAST, CITY4 WITH CITY, STATE4 WITH STATE, ; ZIP4 WITH ZIP, HIREDATE4 WITH HIREDATE, MARRIED4 WITH MARRIED, ; AGE4 WITH AGE, SALARY4 WITH SALARY REPLACE ALL FIRST5 WITH FIRST, LAST5 WITH LAST, CITY5 WITH CITY, STATE5 WITH STATE, ; ZIP5 WITH ZIP, HIREDATE5 WITH HIREDATE, MARRIED5 WITH MARRIED, ; AGE5 WITH AGE, SALARY5 WITH SALARY REPLACE ALL FIRST6 WITH FIRST, LAST6 WITH LAST, CITY6 WITH CITY, STATE6 WITH STATE, ; ZIP6 WITH ZIP, HIREDATE6 WITH HIREDATE, MARRIED6 WITH MARRIED, ; AGE6 WITH AGE, SALARY6 WITH SALARY REPLACE ALL FIRST7 WITH FIRST, LAST7 WITH LAST, CITY7 WITH CITY, STATE7 WITH STATE, ; ZIP7 WITH ZIP, HIREDATE7 WITH HIREDATE, MARRIED7 WITH MARRIED, ; AGE7 WITH AGE, SALARY7 WITH SALARY REPLACE ALL FIRST8 WITH FIRST, LAST8 WITH LAST, CITY8 WITH CITY, STATE8 WITH STATE, ; ZIP8 WITH ZIP, HIREDATE8 WITH HIREDATE, MARRIED8 WITH MARRIED, ; AGE8 WITH AGE, SALARY8 WITH SALARY GO TOP endif SET DELETE ON DEFINE WINDOW win_1 AT 0, 0 WIDTH 1004 HEIGHT 541 ; MAIN TITLE hb_ntos( LastRec() ) + " Records: 81 Fields: Record Lenght: 1061" NOMAXIMIZE NOSIZE DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 8,36 IMAGESIZE 24,24 FLAT BORDER BUTTON TOP_1 ; PICTURE "res\go_first.bmp" ; TOOLTIP "Top" ; ACTION ( oBrw:GoTop(), oBrw:SetFocus() ) BUTTON PREV_1 ; PICTURE "res\go_prev.bmp" ; TOOLTIP "Up" ; ACTION ( oBrw:GoUp(), oBrw:SetFocus() ) BUTTON DOWN_1 ; PICTURE "res\go_next.bmp" ; TOOLTIP "Down" ; ACTION ( oBrw:GoDown(), oBrw:SetFocus() ) BUTTON BOTTOM_1 ; PICTURE "res\go_last.bmp" ; TOOLTIP "Bottom" ; ACTION ( oBrw:GoBottom(), oBrw:SetFocus() ) SEPARATOR BUTTON NEW_1 ; PICTURE "res\frm_new.bmp" ; TOOLTIP "Add" ; ACTION ( ( oBrw:cAlias )->( dbAppend() ), oBrw:GoToRec( ( oBrw:cAlias )->( RecNo() ), .T. ), oBrw:SetFocus() ) BUTTON EDIT_1 ; PICTURE "res\frm_edit.bmp" ; TOOLTIP "Edit" ; ACTION ( oBrw:PostMsg( WM_KEYDOWN, VK_F10, 0 ), oBrw:SetFocus() ) BUTTON DELETE_1 ; PICTURE "res\frm_delete.bmp" ; TOOLTIP "Delete" ; ACTION ( iif( MsgYesNo( "Delete Record ?", , .T. ), oBrw:DeleteRow(), NIL ), oBrw:SetFocus() ) SEPARATOR BUTTON PRINT_1 ; PICTURE "res\frm_print.bmp" ; TOOLTIP "Report" ; ACTION PrintData( oBrw ) SEPARATOR BUTTON EXIT_1 ; PICTURE "res\frm_exit.bmp" ; TOOLTIP "Exit" ; ACTION Win_1.Release END TOOLBAR DEFINE TBROWSE obrw AT 56, 20 ; CELLED SELECTOR "res\pointer.bmp" ; COLORS CLR_BLACK, CLR_WHITE, CLR_BLACK, { RGB( 231, 242, 255 ), GetSysColor( COLOR_GRADIENTINACTIVECAPTION ) } ; ALIAS "CUST" ; WIDTH win_1.Width - 40 - GetBorderWidth() / 2 HEIGHT 420 ; FONT "Arial" ; SIZE 9 ; ON INIT {|ob| TsbCreate( ob, .T. ) } :Cargo := oKeyData() END TBROWSE ON END {|ob| TsbCreate( ob, .F. ) } obrw:Cargo:aColumns := AClone( obrw:aColumns ) ON KEY CONTROL+1 ACTION _wPost(1, , "1") ON KEY CONTROL+2 ACTION _wPost(1, , "2") ON KEY CONTROL+3 ACTION _wPost(1, , "3") ON KEY CONTROL+4 ACTION _wPost(1, , "4") ON KEY CONTROL+5 ACTION _wPost(1, , "5") ON KEY CONTROL+6 ACTION _wPost(1, , "6") ON KEY CONTROL+7 ACTION _wPost(1, , "7") ON KEY CONTROL+8 ACTION _wPost(1, , "8") ON KEY CONTROL+0 ACTION _wPost(1, , "0") (This.Object):Event( 1, {|ow,ky,cn| Local ob := This.obrw.Object Local ac := ob:Cargo:aColumns, ni, oc Local aCols := {} ky := val(cn) FOR ni := 1 TO Len(ac) oc := ac[ ni ] If ni == 1 AAdd(aCols, ac[ ni ]) ElseIf ky == 0 AAdd(aCols, ac[ ni ]) ElseIf ky == 1 If val( right(oc:cName, 1) ) == 0 AAdd(aCols, ac[ ni ]) EndIf ElseIf right(oc:cName, 1) == cn AAdd(aCols, ac[ ni ]) EndIf NEXT ob:aColumns := aCols ob:nRowPos := 1 ob:nCell := 2 ob:Reset() Return Nil } ) END WINDOW CENTER WINDOW win_1 ACTIVATE WINDOW win_1 return nil *---------------------------------------- STATIC PROCEDURE TsbCreate( obrw, lInit ) *---------------------------------------- local aStruct, cCust, n, nLen, a, i, c local aFields IF lInit cCust := "customer" aStruct := hmg_DBfSTRUCT( cCust ) ASize( aStruct, Len( aStruct ) - 1 ) nLen := Len( aStruct ) for i := 2 to 8 c := Str( i, 1, 0 ) for n := 2 to nLen a := AClone( aStruct[ n ] ) a[ 1 ] += c AAdd( aStruct, a ) next next // initial columns aFields := {} for n := 1 to Len( aStruct ) a := aStruct[ n ][ 1 ] AAdd( aFields, a ) next LoadFields( "oBrw", "win_1", .T., aFields ) with object oBrw :nHeightCell += 5 :nHeightHead := oBrw:nHeightCell :SetColor( { 5 }, { CLR_WHITE } ) :SetColor( { 6 }, { RGB( 0, 0, 128 ) } ) :aColumns[ 1 ]:cPicture := "99,999,999" :aColumns[ 1 ]:lEdit := .F. :SetAppendMode( .F. ) :SetDeleteMode( .T., .F. ) :lNoResetPos := .T. :lNoMoveCols := .T. :lNoKeyChar := .T. :lNoChangeOrd := .T. :nFireKey := VK_F10 // default Edit key end object ELSE obrw:SetNoHoles() obrw:SetFocus() ENDIF RETURN *--------------------------------- STATIC PROCEDURE PrintData( oBrw ) *--------------------------------- LOCAL aStruct, cCust, n, nLen, a LOCAL PrevRec LOCAL aHdr := {} LOCAL aLen := {} LOCAL aHdr1 LOCAL aTot LOCAL aFmt cCust := "customer" aStruct := hmg_DBfSTRUCT( cCust ) ASize( aStruct, Len( aStruct ) - 1 ) nLen := Len( aStruct ) for n := 2 to nLen a := AClone( aStruct[ n ] ) AAdd( aHdr, a[1] ) AAdd( aLen, a[3] ) next aHdr1 := Array( Len( aHdr ) ) aTot := Array( Len( aHdr ) ) aFmt := Array( Len( aHdr ) ) AFill( aHdr1, '' ) AFill( aTot, .F. ) AFill( aFmt, '' ) PrevRec := ( oBrw:cAlias )->( RecNo() ) ( oBrw:cAlias )->( dbGoTop() ) DO REPORT ; TITLE Upper( cCust ) + ' Database List' ; HEADERS aHdr1, aHdr ; FIELDS aHdr ; WIDTHS aLen ; TOTALS aTot ; NFORMATS aFmt ; WORKAREA &( oBrw:cAlias ) ; LMARGIN 3 ; TMARGIN 3 ; PAPERSIZE DMPAPER_A4 ; PREVIEW ( oBrw:cAlias )->( dbGoto( PrevRec ) ) RETURN [/pre2] Всегда будут только нужные столбцы в колонках тсб. Клавиши Ctrl+1,...,Ctrl+8,Ctrl+0 меняют список колонок в просмотре от имени колонки oCol:cName

SergKis: Andrey пишет При построении ТСБ надо ENTER нажать, только тогда появляется активный ввод. А добавить oBrw:SetFocus() // можно добавить oBrw:GoPos(1, oBrw:nFreeze+1) oBrw:DrawSelect()

Andrey: SergKis пишет: А добавить oBrw:SetFocus() // можно добавить oBrw:GoPos(1, oBrw:nFreeze+1) oBrw:DrawSelect() Это не спасает, попробовал. Попробовал убрать скрытие столбцов в таблице, активный курсор появляется и передвижение на замороженные столбцы прекращается. Что-то с удалением/скрытием столбцов - ломается алгоритм движения курсора... Я с этим уже раз 5 сталкиваюсь, думал что-то я сам нахимичил, а это не я... Удаляю столбцы вот так: [pre2] oBrw:HideColumns( {1,2,3,4,5,12,18..} ,.t.) // скрыть колонки[/pre2]

SergKis: Andrey пишет Я с этим уже раз 5 сталкиваюсь, думал что-то я сам нахимичил, а это не я... Удаляю столбцы вот так: oBrw:HideColumns( (1,2,3,4,5,12,18..) ,.t.) // скрыть колонки Думаю, что это ТВОЯ химия, т.к. колонок :lVisible := .F. не должно быть до :nFreeze, т.е. скрываемые колонки должны находится ПОСЛЕ :nFreeze, т.к. до :nFreeze методы :nAtCol() и :nAtActual считают все колонки безусловно видимыми

Andrey: SergKis пишет: Думаю, что это ТВОЯ химия, т.к. колонок :lVisible := .F. не должно быть до :nFreeze Есть метод скрытия колонок, я скрыл колонки которые мне нужны. Показываю ТСБ, без заморозки колонок - нет активного курсора. [pre2] ............. myDelColumnTsb( oBrw, aTsbColumn ) // убрать колонки из таблицы //:nFreeze := :nColumn("TEVENT") // заморозить таблицу до этого столбца //:lLockFreeze := .T. // избегать прорисовки курсора на замороженных столбцах :GoPos(1, :nColumn("TEVENT") ) - без этого не пашет //:DrawSelect() ............ END TBROWSE ON END {|ob| ob:SetNoHoles(), ob:oPhant:nClrHeadBack := ob:Cargo:nClr4, ; ob:oPhant:nClrFootBack := ob:Cargo:nClr10,; ob:Refresh() }[/pre2] Т.е. убрал колонки - нужно позаботиться самому, чтобы показать активный курсор ... Блин, а я считал что ТСБ сам поставит на первую видимую колонку. Получается нет проверки, когда двигаем курсор - колонка заморожена или нет. Можно это как то проверить, чтобы курсор не улетал. Не особо это и критично, но так чтобы знать как это можно делать.

Andrey: Всем привет ! Есть построенный ТСБ, в нём суперхидер из одной колонки. Как узнать - сколько букв поместится в суперхидере ? Размеры получил, а кол-во букв не могу высчитать. [pre2] nWTsb := oBrw:GetAllColsWidth() // ширина всех колонок видимых hFont := oBrw:aSuperHead[ 1, 7 ] // 4-special header font If hFont != Nil aFont := GetFontParam(hFont) cFontName := aFont[1] nFontSize := aFont[2] lFontBold := aFont[3] ENDIF[/pre2] ? "hFont=", hFont, HB_ValToExp(aFont)

SergKis: Andrey Смотри свой же пример ButtonEx_DynamicMenu

Andrey: SergKis пишет: Смотри свой же пример ButtonEx_DynamicMenu Там другое. Возвращает максимальный размер фонта от кол-ва символов в строке. Мне нужно наоборот, от ширины шрифта и WIDTH объекта - получить максимальное кол-во символов которые влезут в WIDTH объекта.

SergKis: Andrey пишет Там другое. Возвращает максимальный размер фонта от кол-ва символов в строке. Мне нужно наоборот, от ширины шрифта и WIDTH объекта - получить максимальное кол-во символов которые влезут в WIDTH объекта. И что там другого ? Перебираются размеры фонта для строки, а наоборот (перебрать буквы для одного фонта) ты принять не можешь, религия не позволяет или арифметика другая

Andrey: SergKis пишет: религия не позволяет или арифметика другая Да вчера делал, не получилось. Сегодня по другому сделал, вроде работает... Вот так сделал - // Функция вернет максимальное количество букв "Н" или другое // для заданной строки: ширина-объекта и ширина-фонта FUNCTION GetMaxChar4FontWidth( cText, nWidth, cFontName, nFontSize, lBold ) LOCAL hFont, nWText, nMaxChar DEFAULT cText := "H", lBold := .F. lBold := !Empty(lBold) hFont := InitFont( cFontName, nFontSize, lBold ) nWText := GetTextWidth ( 0, cText, hFont ) DeleteObject( hFont ) nMaxChar := INT(nWidth/nWText) RETURN nMaxChar

SergKis: Andrey пишет // Функция вернет максимальное количество букв "Н" Почему именно "H". Используют в практике 3-и буквы, если от букв прыгать, а не от конкретного текста. "A" - min длина "B" - средняя длина "W" - max длина Если у тебя регистрирован фонт SET FONT Normal ..., то ты можешь получать длину от буквы "B" автоматом nWidth := GetFontWidth("Normal", 50 /* длина в символах */) Такой алгоритм применен в Tsb_DemoMdi примере для "M" полей и длинных "C" полей. Колонка шириной oCol:ToWidth(50 /*символов*/) и EditBox встраивает текст с переносами в эти 50 символов. Если в выводе преобладают маленькие буквы, то можно еще уменьшить nWidth *= 0.8 (или даже 0.7) или увеличить вывод кол-ва символов в полученный nWidth ~ 15-20%? т.е. 50+10(15) символов.

Andrey: SergKis пишет: Почему именно "H" Да не подумал сразу. Текст состоит у меня сейчас как правило только из нескольких заглавных букв. Поставил "х" и сразу стал текст в размер суперхидера попадать. Фонты уже зарегистрированны, спасибо за подсказку.

Dr. Oldwarez: Здравствуйте! Давно вам не писал - тут у меня личные проблемы были. И теперь вот вопрос: как открыть CSV-файл с заголовками в TsBrowse. Заголовки полей CSV можно брать в качестве заголовков TsBrowse. Есть поля текстовые, дата, время и одно длинное MEMO. Это экспортный файл из Google Calendar. Заранее благодарен

SergKis: Dr. Oldwarez пишет Есть поля текстовые, дата, время и одно длинное MEMO Пару записей показать бы. Можно dbf создавать а append from ... DELIMITED ..., но предложу через массив[pre2] aBuf := hb_ATokens( hb_memoread(cFie), CRLF) aDim := {} aHdr := {} FOR nI := 1 TO Len(aBuf) IF nI == 1 // header // как заданы заголовки в "..." или без них ? FOR EACH t IN hb_AToekns(aBuf[ nI ]) ; AAdd(aHdr, t) // без NEXT ELSE AAdd(aDim, &( "{"+aBuf[ nI ]+"}" )) ENDIF NEXT Далее подать aHdr и aDim в tsb, как в примерах Tsb_array_2, например [/pre2]

Dr. Oldwarez: SergKis пишет: Пару записей показать бы. Пожалуйста! [pre]Subject,Start Date,Start Time,End Date,End Time,Location,Description OLDWAREZ :Покупка компьютера,04/01/2021,10:00 AM,02/01/2021,12:30 PM,Вещевой рынок,Всего за 1500 руб. [/pre] Это стандартный экспорт календаря Гугл. Subject Start Date Start Time End Date End Time Location Description Это заголовки

SergKis: Dr. Oldwarez Не совсем стандартный csv по мне, но 1.принимаем в массив строковый все 2. опр. типы колонок 3. переводим данные строковые колонок по типам или показываем в тсб строковый вариант [pre2] aBuf := hb_ATokens( hb_memoread(cFie), CRLF) aDim := {} aTyp := {} aLen := {} aHdr := {} FOR nI := 1 TO Len(aBuf) IF nI == 1 // header FOR EACH t IN hb_AToekns(aBuf[ nI ], ",") ; AAdd(aHdr, t) NEXT ELSE aTmp := {} FOR EACH t IN hb_AToekns(aBuf[ nI ], ",") cTyp := "C" nLen := 0 IF "/" $ t cTyp := "D" t := CtoD(t) nLen := 8 ELSEIF ":" $ t .and. " AM" $ t cMilTime := ft_Civ2Mil( t ) // " 5:40 am" 0540 t := left(cMilTime, 2)+":"+right(cMilTime, 2)+":00" nLen := len(t) ELSEIF ":" $ t .and. " PM" $ t cMilTime := ft_Civ2Mil( t ) // " 5:40 pm" 1740 t := left(cMilTime, 2)+":"+right(cMilTime, 2)+":00" nLen := len(t) ELSE nLen := len(t) ENDIF AAdd(aTmp, t) AAdd(aTyp, cTip) AAdd(aLen, nLen) NEXT ENDIF NEXT [/pre2] можно подавать в тсб массивы или создавть dbf и в тсб (подключать hbnf.lib ) на выбор

SergKis: PS пропустил[pre2] AAdd(aLen, nLen) NEXT AAdd(aDim, aTmp) ENDIF [/pre2] и везде hb_ATokens(...) конечно



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