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

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

Haz: Практически все , посмотри в исходнике класс TSBrowse. Почти все из DATA может быть определено через oBrw: ... или oBrw:aColumns[x]: ... Что конкретно - то интересует ?

Vlad04: посмотри в исходнике класс TSBrowse. Смотрел . Там столько Основные , относящиеся в целом к Бровз ALIAS OF Form1 WIDTH HEIGHT FONT SIZE ON DBLCLICK ON GOTFOCUS AUTOFILTER CELLED EDIT VALUE nRec GRID и другие, которыми сами пользуетесь. С колонками, там вроде, понятнее. В примерах они отдельно обрабатываются.

Haz: ALIAS - можно заменить через oBrw:cAlis := ... , после этого oBrw:Reset() и только при условии совпадения полей в старом и новом алиасе (иначе нужно переопределять колонки). OF FORM - не приходилось , но вроде и не меняется, задается при инициализации WIDTH, HEIGHT - меняется через oBrw:Resize( .... ) FONT, SIZE - меняется через oBrw:ChangeFont() ON DblClick - напрямую через oBrw: не задать , но можно определить через переменные MiniGui _HMG_aControlProcedures , и _HMG_aControlDblClick ON GOTFOCUS - через oBrw:bGotFocus AUTOFILTER - только через инициализацию EDIT - через oBrw:oCol :lEdit GRID - через через oBrw:lCellBrw Владимир, какая цель стоит за этой заменой ? От этого зависит что и когда менять. К примеру задача - интеррактивно менять шрифт в бровсе решается так; 1) Получить список установленных шрифтов 2) Выбрать нужный шрифт из списка, задать свойства шрифта ( размер, наклон и прочее ) 3) Определить шрифт через F1 := _DefineFont ( ...... ) 4) получить хендл через H1 := GetFontHandle( F1 ) 5) Изменить шрифт в бровсе oBrw:ChangeFont( H1, , 1 ) 6) Изменить высоту строк бровса под новую высоту шрифта через oBrw:nHeightCell 7) Перерисовсть бровс oBrw:Refresh(.T.) вот такой простой алгоритм :)


Andrey: А как поменять цвет: скролинга и левого бока Tbrowsa ?

Haz: Andrey пишет: А как поменять цвет: скролинга и левого бока Tbrowsa ? цвет скрола определен в :WinNew() как локальные переменные которым назначаются системные значения nClrText := GetSysColor( COLOR_WINDOW ),; nClrBack := GetSysColor( COLOR_SCROLLBAR ),; следовательно без изменения системных значений или изменения метода WinNew() - никак ( с левым краем (Selector) все оч просто - перед END TBROWSE определить нужный цвет oBrw:nClrHeadBack := RGB(255, 0, 0) // Пусть будет красный END TBROWSE

Andrey: Haz пишет: изменения метода WinNew() - никак ( Как тогда изменить метод WinNew() ?

Haz: Andrey пишет: Как тогда изменить метод WinNew() примерно так добавить в TSBRowse DATA nScrollBackColor и перед END TBROWSE назначать цвет oBrw:nScrollBackColor := RGB(...) и в вызов WinNew в h_tbrowse добавить переменную в нужной позиции oBrw:nScrollBackColor ЗЫ Сам не пробовал , но есть же все исходники и они на харбуре писаны, меняй не хочу ) выше про левый край дописал )

Vlad04: Haz какая цель стоит за этой заменой ? Попытка создать один TSBRows для всех справочников. С формой все получилось и с BRows то же. Но у BRows возможности скромнее. Определение BRows позволяет условие накладывать,а у TSBRows только некоторые DEFINE BROWSE Browse_1 COL 10 ROW 30 WIDTH 400 HEIGHT 390 WIDTHS mWIDTHS HEADERS mHEADERS WORKAREA EkspeD FIELDS mFIELDS VALUE nRec if nRegim <> 0 ON DBLCLICK (ThisWindow.Release ,Result:=.t.) ALLOWEDIT .f. else ALLOWEDIT .t. endif ... END BROWSE

Vlad04: И мне надо не заменять значения , а определить при инициализации

Haz: понятно,в понедельник отпишусь с работы . если сейчас и коротко , то обработку условий лучше задавать не в инициализации бровса а при исполнении. я инициализирую тбровсе из своей функции - упрощенный мой пример в samples\advanced\tsb_filter но для всех процедур по ON ... задаю одну определенную функцию пример ON CHANGE {|| TBRWChange( cBrw ) в самой TbrwChange организую CASE по имени объекта cBrw , где и проверяю все условие в понедельник нарисую пример ))))

Andrey: Haz пишет: с левым краем (Selector) все оч просто - перед END TBROWSE определить нужный цвет oBrw:nClrHeadBack := RGB(255, 0, 0) // Пусть будет красный

Haz: как вариант сунуть свою bmp с нужным фоном )

Andrey: Haz пишет: сунуть свою bmp с нужным фоном ) А как ? И куда ? Допустим, сделал я свою bmp. Разместил в ресурс проекта. А дальше как ?

Haz: а дальше просто читать мануал по этому классу и синтаксису команды DEFINE TBROWSE ========================================================== SELECTOR clause to show an automatic first column with a record selector. SELECTOR <.T.> means default black arrow selector. SELECTOR <.F.> means just add the column with no graphic selector but the cursor's back color. SELECTOR <oBmp> means to use your own (oBmp) graphic selector. oBrw:nSelWidth data can be used to asign selector column's width.

Haz: To Vlad04 Владимир, продолжим ) Я делаю примерно так , 1) Описание oBrw вынес в функцию CreateBrowse() 2) Обработку событий типа DblClick, onChange и пр - тоже вынес в отдельные функции , которые как параметр принимают имя бровс объекта FUNC CreateBrowse( cBrw, cParent, nRow, nCol, nWidth, nHeight, cAlias ) LOCAL i := 0 LOCAL n := 0 LOCAL cHeading := "" LOCAL cStr := "" PUBLIC &cBrw cAlias := IF( cAlias == NIL, cBrw, cAlias ) DEFINE TBROWSE &cBrw At nRow, nCol ALIAS cAlias ; OF &cParent ; WIDTH nWidth ; HEIGHT nHeight ; COLORS { CLR_BLACK, CLR_BLUE } ; FONT "MS Sans Serif" ; SIZE 9 ; CELL; ON DBLCLICK TbrwDblClick(cBrw); SELECTOR TRUE END TBROWSE &cBrw:LoadFields( TRUE ) &cBrw:lCellBrw := TRUE &cBrw:nSelWidth := 16 &cBrw:bChange := { || TBrwChange( cBrw )} &cBrw:bGotFocus := { || TBrwGotFocus( cBrw )} &cBrw:bLostFocus := { || TBrwLostFocus( cBrw )} &cBrw:bDelete := { || TBrwDelete( cBrw )} DoMethod(cParent,cBrw,"SetFocus") RETURN &cBrw Далее в функциях обработки событий проверяю их какого бровса вызвано событие и в зависимости от этого выполняю то или иное действие Вот пример обработчика по CHANGE - при перемещении по базе документов - ставлю фильтр по пользователям в соседнем бровсе FUNC TBrwChange( cBrw ) LOCAL cAlias := &cBrw:cAlias cBrw := UPPER( cBrw ) DO CASE CASE cBrw == "DOC" cFilter := "ID_DOC = " + NTOC((cAlias)->ID) USER->(DbSetFilter(cFilter)) USER->(DbGoTop()) TbRwReset('USER', TRUE) END IF &cBrw:nRowCount() == &cBrw:nRowPos() &cBrw:Refresh( .F. ) ENDIF IF &cBrw:nLogicPos() > 0 .and. &cBrw:nRowPos() == 1 &cBrw:Refresh( .F. ) ENDIF RETURN NIL Func TBrwReset( cBrw, lAll) lAll := IF( lAll == NIL, FALSE, lAll ) &cBrw:Reset() IF &cBrw:nLen>0 &cBrw:GoTop() END &cBrw:Refresh( lAll ) RETURN NIL

SergKis: Vlad04 чтобы несколько упростить вид предлагаю писать так: ... END TBROWSE nInd := GetControlIndex(cForm, cBrw) // index oBrw := _HMG_aControlIds [ nInd ] // object и далее по тексту вместо &cBrw:.... использовать oBrw:...

Haz: согласен, чтоб не пестрило от макроподстановок можно и еще упростить ) oBrw := &cBrw и далее по тексту ...

Vlad04: Ок Понятно, буду пробовать Спасибо

Andrey: Подскажите пожалуйста, как сделать обработку по клавишам в TBROWSE ?

gfilatov2002: Andrey пишет: как сделать обработку по клавишам в TBROWSE ? По-видимому, как то так oBrw:bKeyDown := { | nKey | If( nKey == VK_RETURN .or. nKey == VK_ESCAPE, ; MyAction(), Nil ), lOk := nKey != VK_ESCAPE }

Andrey: gfilatov2002 пишет: По-видимому, как то так Спасибо БОЛЬШОЕ ! А как еще сделать ввод (буквенный) в поле поиска (Search for:) но чтобы фокус оставался на маркере TBROWSE ?

a_sidorov: Делаете обработку ввода буковок в TBROWSE и пишете их из программы в поле вода: &cBrw:bKeyDown := { | nKey | MyKeyAction(nKey), lOk := nKey != VK_ESCAPE } STATIC FUNCTION MyKeyAction(l_Key) DO CASE CASE l_key==VK_BACK.or.l_key>31.and.l_key<242 if l_key==VK_BACK if len(Form_0.Text_1.Value)>0 Form_0.Text_1.Value:=left(Form_0.Text_1.Value,len(Form_0.Text_1.Value)-1) endif else if ( (l_key > 32 .AND. l_key < 254)) l_key := ASC(LatRus( CHR(l_key) )) Form_0.Text_1.Value := Form_0.Text_1.Value+chr(l_key) endif endif ENDCASE SetFilterToDb() oBrw_1:Refresh() oBrw_1:Upstable() Return Nil

Andrey: a_sidorov пишет: Делаете обработку ввода буковок в TBROWSE и пишете их из программы в поле вода: То что надо ! Спасибо большое !

ММК: Andrey пишет: Делаете обработку ввода буковок Тогда к этому еще что-то типа - case l_key=8//Backspace If Len(Form_0.Text_1.Value)>=1 Form_0.Text_1.Value:=Left(Form_0.Text_1.Value,Len(Form_0.Text_1.Value)-1) Endif

Haz: обработка буковок уже есть в методе ::Seek( nKey ) класса TBrowse остается только через определение своего блока bSeekChange присваивать что-то типа этого Form_0.Text_1.Value:= oBrw:cSeek все лично проверено давно и работает, но есть парочка "НО" 1) должен быть индекс по полю по которому на буковки надо реагировать 2) не помню точно, но вроде в исходнике ::cSeek всегда в верхнем регистре и лечится убиранием UPPER( ЗЫ: могу поискать пример - когдато делал нечто похожее на комбо в TBrowse но по базе ис использованием подчиненного Tbrowse. назначал и буфер Get объекта

Andrey: Haz пишет: ЗЫ: могу поискать пример - когдато делал нечто похожее на комбо в TBrowse но по базе ис использованием подчиненного Tbrowse. назначал и буфер Get объекта Пример в студию !

Haz: Andrey пишет: Пример в студию ! поищу, завтра выложу

Haz: Haz пишет: Пример в студию ! Поискал в архивах и собрал рабочий пример. Красоту не наводил. Суть примера : 1)в базе хранится ID, а в TBrowse показываем строку из справочника по этому ID 2)в поле редактирования Tbrowse создается объект TBtnGet , через который лезем в справочник (тоже TBrowse) 3)при выборе из справочника стандартный метод ::Seek(nKey) обрабатывает клавиши , а блок bSeekChange - пишет то что набираем ( если найдено) в буфер Get объекта. https://drive.google.com/file/d/0BxsLjKW148EQbzZhWkJMOHNKTkk/edit?usp=sharingk/edit?usp=sharing

Andrey: Как вернуть фокус ввода обратно в TBROWSE после своей обработки ? PUBLIC &cBrw DEFINE TBROWSE &cBrw ; AT nRow, nCol ; .... &cBrw:bLDblClick:= { | nRow, nCol, nKeyFlags | MyAction() } // Двойной клик мышки RETURN Nil //////////////////////////////////////// FUNCTION MyAction() LOCAL cText, cPole := ALLTRIM(FIELD->PNAME) IF AT("[",cPole) > 0 // значит это директория ChangeDirectory(Alltrim(cPole)) // сменить директорию DIRECTORY->(Dbsetorder(ChoiHeader()-2)) RefreshBrowse() oBrw_1:Reset() ELSE cText := "File: " + ALLTRIM(cPole) + CRLF + CRLF cText += "Line: " + STR(oBrw_1:nLastPos) + CRLF + CRLF cText += "Cell: " + STR(oBrw_1:nCell) MsgInfo(cText) ?????? вот здесь вернуть .Setfocus ENDIF Return Nil

serj: Как вернуть фокус ввода обратно в TBROWSE после своей обработки ? DoMethod( cForm, oBrw_1, 'setfocus' ) DoMethod( cForm, oBrw_1, 'refresh' )

Andrey: serj пишет: DoMethod( cForm, oBrw_1, 'setfocus' ) Это понятно. Я наверно неправильно поставил вопрос. Наверно нужно так: Как получить переменные cForm и oBrw_1 без передачи параметров в функцию MyAction() ?

SergKis: Andrey пишет:Как получить переменные Func My() oBrw := &cBrw // ты же делал PUBLIC &cBrw cForm := oBrw:cParentWnd cBrwName := oBrw:cControlName ...

Andrey: Спасибо БОЛЬШОЕ SergKis ! Что-то забывать стал уже пройденные этапы освоения МиниГуи... Видно, когда урывками осваиваешь, материал плохо усваивается...

Andrey: SergKis пишет: oBrw := &cBrw // ты же делал PUBLIC &cBrw cForm := oBrw:cParentWnd Не работает, вылетает с ошибкой: Error BASE/1003 Variable does not exist: CBRW Called from MYACTION(443) Called from (b)BUTTONFORM0(256) ////////////////////////////////////////////////////////////////////////////// FUNCTION MyAction() LOCAL cText, cPole := ALLTRIM(FIELD->PNAME) LOCAL oBrw := &cBrw // <----- 443 строка LOCAL cForm := oBrw:cParentWnd LOCAL cBrwName := oBrw:cControlName

Haz: Andrey пишет: OCAL oBrw := &cBrw это не cBrw объявлена как PUBLIC, а та переменная, имя которой в локальной cBrw было на тот момент при определении бровса было cBrw := "ИМЯ" ( где строка "ИМЯ" из твоего исходника ) тогда и объявлять надо LOCAL oBrw := &"ИМЯ"

serj: может так GetProperty (<cWindowName>[,<cControlName>] ,<cPropertyName>)--> PropertyValue GetProperty(cForm,'oBrw','width')

Haz: serj пишет: GetProperty(cForm,'oBrw','width') по любому чтобы работать с методами объекта , нужно знать этот объект, проще будет не усложнять себе жизнь и передать cBrw параметром - MyAction( cBrw ) где без труда получить сам объект &cBrw и далее дергать его проперти, его методы или выдавать фокус, прятать и.т.д. А так это похоже на операцию на гландах через (_|_)

Andrey: Haz пишет: А так это похоже на операцию на гландах через (_|_) Понял, что я совсем заработался или отупел...

Andrey: Haz пишет: цвет скрола определен в :WinNew() как локальные переменные которым назначаются системные значения nClrText := GetSysColor( COLOR_WINDOW ),; nClrBack := GetSysColor( COLOR_SCROLLBAR ),; следовательно без изменения системных значений или изменения метода WinNew() - никак ( Григорий, а можно добавить в библиотеку TsBrowse возможность изменения этих переменных ? Есть ли у вас возможность связаться с автором этой библиотеки ? Я понимаю, что можно самому добавить эти переменные и перекомпилировать библиотеку, но хотелось бы иметь эту возможность в стандартной библиотеке.

gfilatov2002: Andrey пишет: можно добавить в библиотеку TsBrowse возможность изменения этих переменных ? Это только значения по умолчанию для параметров функции WinNew() Вот полный вызов этой функции со всеми параметрами: WinNew( nMin, nMax, nPgStep, lVertical, oWnd, bUpAction,; bDownAction, bPgUp, bPgDown, bPos, nClrText, nClrBack,; lUpdate, bWhen, bValid ) Если Вы передадите при вызове этой функции свои параметры nClrText, nClrBack, то ...

Vlad04: gfilatov2002 Григорий Если вернуться к первому пункту поста.Посмотрите, может есть возможность переопределить Tbrowse так , чтобы он в программнике писался как Browse ( параметры не РАЗДЕЛЯЛЬСЬ символом ; ) DEFINE BROWSE Browse_1 COL 10 ROW 10 WIDTH 610 HEIGHT 390 .... В Tbrowse DEFINE TBROWSE Brw_1 AT 0, 0 ALIAS "Employee" ; COLORS {CLR_BLACK, CLR_NBLUE} ; WIDTH nBrwWidth ; HEIGHT nBrwHeight ;

gfilatov2002: Vlad04 пишет: может есть возможность переопределить Tbrowse так , чтобы он в программнике писался как Browse В терминах библиотеки минигуи это называется альтернативный синтаксис. При этом становится удобнее написание текста программы, но неоптимальным - генерируемый код. Если для Вас это необходимо, то Вы можете добавить требуемое описание в заголовочный файл include\i_altsyntax.ch (сейчас там этого нет ).

Andrey: Haz пишет: (иначе нужно переопределять колонки) Как можно определить свой показ колонок для TBROWSE, а то я совсем запутался... Делаю так: oBrw_1:aColumns[1]:cHeading := "Дата" + CRLF + "события" oBrw_1:SetColSize(1, 50) oBrw_1:aColumns[1]:nAlign := DT_CENTER А поле базы как здесь определить ?

Haz: Andrey пишет: А поле базы как здесь определить через oBrw_1:aColumns[1]:bData

Dima: Andrey пишет: А поле базы как здесь определить ? Как то так oBrw_1:aColumns[1]:bdata:=твой блок кода для выборки данных Если чего не знаешь смотри Tsbrowse.ch #xcommand MODIFY [ CONTROL ] [ TBROWSE ] <oBrw> COLUMN <nColumn> [ PROPERTY ] DATA TO <bData>; => <oBrw>:aColumns\[ <nColumn> \]:bData := <bData> PS Haz Опередил ;)

Haz: Dima пишет: Если чего не знаешь смотри Tsbrowse.ch согласен и еще можно посмотреть в TsColumn.prg и h_browse.prg там оч много интересного, к примеру DATA bData // Mandatory code block to return column data Dima пишет: Опередил ;) я не специально ))

Andrey: Haz пишет: Haz Опередил ;) Спасибо вам ОГРОМНОЕ ! Хорошо что есть кто отвечает на вопросы !

Andrey: Dima пишет: Как то так oBrw_1:aColumns[1]:bdata:=твой блок кода для выборки данных А если нужно выводить поле по шаблону, то как делать ? FIELD->NTIME PICTURE - "99:99"

Dima: Andrey Наверное так oBrw_1:aColumns[1]:Cpicture:="99:99" Haz пишет: согласен и еще можно посмотреть в TsColumn.prg и h_browse.prg там оч много интересного +1

Andrey: Чем больше делаешь, тем больше вопросов возникает... ( чем дальше в лес, тем больше дров ! ) Подскажите пожалуйста: 1) Почему дата не выходит полностью в первом столбце ? 2) Как убрать выделение серым цветом заголовка первого столбца ? 3) Как установить горизонтальный скролинг ? 4) Я перечислил ВЫВОД 7 полей, а выводиться больше (да еще на английском), почему ? Ну и еще до кучи, индексы показываются неправильно.... Вот сам проект http://files.mail.ru/FB59CE79DA39455098065F18BE9FB27A

Haz: Andrey пишет: Чем больше делаешь, тем больше вопросов возникает... 1 - не достаточна заявленная ширина колонок установлено 50 и в описании колонки 2 !!!! . центрировать дату лучше по DT_CENTER . :cPicture := "99.99.9999" лишнее т.к. есть SET DATE FORMAT "DD.MM.YYYY" 2. присвоить &cBrw:SetColor( { 14 } .... то же что и в &cBrw:SetColor( { 4 }, подробнее см. h_browse.prg как рисуются заголовки в METHOD DrawHeaders( lFooters ) CLASS TSBrowse 3. убить в своем коде его отключение &cBrw:lNoHScroll := .T. и &cBrw:ResetVScroll() 4. Не перечислил а переопределил , остальные загружены дефолтом &cBrw:LoadFields( .F. )

Andrey: Haz пишет: 1 - не достаточна заявленная ширина колонок установлено 50 и в описании колонки 2 !!!! . Понял, что из-за маленького размера второй колонки, не получалась первая. Буду знать теперь. 2) Сделал как порекомендовали: &cBrw:SetColor( { 14 }, { { || { Rgb( 43, 149, 168 ), Rgb( 0, 54, 94 )}}}) // Шапка выделения индекса Результат все равно не тот. Хотелосб бы ВООБЩЕ отказаться от сортировки. Если это нельзя, то тогда понятно. 3) Получилось. 4) А как тогда задать поля из базы ТОЛЬКО те которые нужны ? &cBrw:LoadFields( .T. ) - тоже не работает....

Haz: Andrey пишет: Понял, что из-за маленького размера второй колонки, не получалась первая. Буду знать теперь. Вижу что не понял в твоем исходнике в коде описания параметров ВТОРОЙ колонки есть ОПЕЧАТКА - снова устанавливаешь ширину ПЕРВОЙ oBrw_1:SetColSize(1, 50) Andrey пишет: Хотелосб бы ВООБЩЕ отказаться от сортировки нет ничего проще oBrw_1:lNoChangeOrd := .T. PS. цитата из h_tbrowse.prg "DATA lNoChangeOrd AS LOGICAL // avoids changing active order by double clicking on headers" предвижу вопрос о цвете шрифта в первой колонке - ответ :SetColor( 13 .......) и на последний вопрос LoadFilds( .T. ) - просто разрешает редактированиме Можно спрятать лишние HideColumns( nColumn , lHide ) - описание есть в справке по TSBrowse которая идет с поставкой MiniGui или в том же исходнике библиотеки Если много колонок бровс начинает немного тупить и если они не нужны в бровсе их лучше удалить через METHOD DelColumn( nPos ) или добавлять только нужные изначально AddColumn( oColumn) - в справке этих методов нет , а в исходнике есть это как " ... видишь суслика ? .... а он там есть " Андрей - найди время , посмотри исходники . Да они не маленькие , но там очень много интересного

Andrey: Haz пишет: Можно спрятать лишние HideColumns( nColumn , lHide ) - описание есть в справке по TSBrowse которая идет с поставкой MiniGui Да я это видел, но считать поля по каждой базе не совсем правильное решение. У меня есть базы имеющие 150 полей. Для показа нужно всего 15. Ладно, можно один раз перечислить. А когда новые поля в базу добавишь, нужно будет тогда ОПЯТЬ лезть в исходник и править его. ОЧЕНЬ НЕУДОБЕН этот метод. Хочется как на Клипере создавать бровс. Haz пишет: или добавлять только нужные изначально AddColumn( oColumn) - в справке этих методов нет , а в исходнике есть это как " ... видишь суслика ? .... а он там есть " Вот это уже лучше метод построения ! Буду смотреть. Haz пишет: - найди время , посмотри исходники . Да они не маленькие , но там очень много интересного Буду смотреть, но многое не очевидно для меня. И изучение идет наскоками, основную работу никто не отменяет... Haz Спасибо огромное за помощь !

Andrey: Haz пишет: нет ничего проще oBrw_1:lNoChangeOrd := .T. Не работает. Остается графический значок сортировки. 1) Как его убрать. Я конечно могу его закрасить фоном шапки таблицы и отдельной иконкой добавить в проект. Но это же не выход. Если нельзя убрать, то как тогда "передвинуть" всю эту красоту на 4 шапку таблицы: "Наименование события" ? 2) Как уменьшить высоту ячейки таблицы ? Далал уже и &cBrw:nHeightCell += 8 // высота ячейки TBROWSE Все равно размер не меняется. Измененный проект тут - http://files.mail.ru/3784AE8B8AA3438C8CC0C8597D328584

Haz: Andrey пишет: Не работает. Остается графический значок сортировки. После oBrw_1:lNoChangeOrd := .T. добавь строку oBrw_1:nColOrder := 0 . должно сработать Andrey пишет: Все равно размер не меняется. скорее всего в таблице есть мемо поле и ты его пихаешь в бровс . Удали колонку с мемо :DelColumn( 11 ) и высота строк станет управляемой Следующий вопрос скорее всего будет - как показать мемо. Отвечаю - создать на форме EditBox в режиме ReadOnly ( к примеру там где ноги ), а в oBrw_1 на событие ON CHANGE повесить функцию или блок который делает EditBox.Value := (oBrw_1:cAlias)->MEMO PS и исправь наконец у себя опечатку в коде 1 на 2 oBrw_1:aColumns[2]:cHeading := "Время" + CRLF + "события" oBrw_1:SetColSize(1, 70) oBrw_1:aColumns[2]:nAlign := DT_CENTER oBrw_1:aColumns[2]:bData := {||LOG_DBF->TIME } PSS и при попытке поиска будет вылет с ошибкой т.к. пытаешься привести в верхний регистр числовое поле UPPER(LOG_DBF->NEVENT)

Andrey: Уже получается лучше ! http://files.mail.ru/710FE7B921CC4EAEB7BF0FF766551373 Haz пишет: Следующий вопрос скорее всего будет - как показать мемо. Хотелось бы сделать показ мемо в отдельном (дополнительном) окне, через CheckBox ! Как это сделать ? Т.к. мемо может быть большим и при желании можно было бы смотреть по желанию юзера. Примерно так: И еще возник вопрос, при перемещении курсора изменение позиции "Запись 0/0" в STATUSBAR - как сделать ?

Haz: Andrey пишет: Хотелось бы сделать показ мемо в отдельном (дополнительном) окне если примерно как на картинке то добавить в бровс пустую колонку , дать ей болк выборки { || 'MEMO'}. разрешить редактирование :lEdit := .T.и через oBrw_1:aColumns[11]:bPrewEdit := {|| ...} вызывать функцию которая в окне показывает мемо, Эта функция должна вернуть FALSE ( ну или через BtnBox делать чтоб совсем как на картинке) Andrey пишет: при перемещении курсора изменение позиции на ON CHANGE бровса повесить нвзначение элемену статусбара строки вида - NTOC(Recno()) + '/' + NTOC(RecCount()) PS. кстати в твоем примере oBrw_1:aColumns[]:bData не нужен тк и так LoadFilds() назначает дефолтловый блок

Andrey: Haz пишет: PS. кстати в твоем примере oBrw_1:aColumns[]:bData не нужен тк и так LoadFilds() назначает дефолтловый блок Так он у меня за комментирован в программе ! //LoadFields( cBrw, cParent ) И я все таки хочу собирать TBROWS ТОЛЬКО из своих полей. Помоги пожалуйста в описании одной колонки, примеры смотрел, ни фига не понял. Как эту строку: ADD COLUMN TO TBROWSE &ob DATA ARRAY ELEMENT 1 ALIGN DT_CENTER, DT_CENTER SIZE 20 COLORS C_TEK, C_SYS преобразовать до привычной Клиперовской: oBrw_1:aColumns[1]:cHeading := "Дата" + CRLF + "события" oBrw_1:SetColSize(1, 70) oBrw_1:aColumns[1]:bData := {||LOG_DBF->DATE } // oBrw_1:aColumns[1]:cPicture:="99.99.9999" - не обязательно oBrw_1:aColumns[1]:nAlign := DT_CENTER Haz пишет: на ON CHANGE бровса повесить нвзначение элемену статусбара строки вида Спасибо ! Работает. ON CHANGE { || Form_0.StatusBar.Item(1) := " Запись: " + NTOC(Recno()) + '/' + NTOC(RecCount()) } Потом заменю на показ значений по индексам. Только при смещении мышкой строка Form_0.StatusBar.Item(1) - чиститься... вообще. Как мышкой нажмешь, то появляется (клавиши нормально работают) ! Что за фигня, где исправить ? Это у меня где-то в коде или это обычное поведение TBROWSA ?

Haz: Andrey пишет: смотрел, ни фига не понял. не там смотрел, посмотри как это делается в самом методе (не в функции) Loadfield - там как раз используется ::AddColumn Andrey пишет: Что за фигня, где исправить первый элемент статусбара бровс без объявления войны забирает под свои сообщения делай его пустым, а свой вывод гони во второй

Andrey: Haz пишет: первый элемент статусбара бровс без объявления войны забирает под свои сообщения Спасибо ! Заработало !

Andrey: Сделал доп окно показа мемо поля. Не активируется оно... Видать неправильный вариант с окнами делаю (до этого не работал с такими окнами)... При объявлении показа мемо-поля в другом окне: Form_1.Edit_Memo.Value := (oBrw_1:cAlias)->MEMO, компилятор не собирает, выдает ошибку: Dbf_Log.prg(360) Error E0030 Syntax error "syntax error at '.'" 1 error No code generated. hbmk2[Dbf_Log]: Error: Running Harbour compiler (embedded). 1 Что-то неправильно делаю, подскажите пожалуйста ? Проект тут - http://files.mail.ru/DF44C802FA1E4821BC2E5CE6E6ED1EFA

Haz: Andrey пишет: Что-то неправильно делаю ну что явно в глаза бросается - попытка создать окно за пределами экрана ( где-то на высоте кнопки питания монитора ) AT nDesktopWidth-100,0 PS по ошибке компилятора - он не знает что за окно ему суют, или DECLARE WINDOW Form_1 перед строкой с ошибкой напиши или SetProperty("Form_1","Edit_Memo", "Value", (oBrw_1:cAlias)->MEMO ) используй

Dima: Haz пишет: попытка создать окно за пределами экрана ( где-то в районе кнопки питания )

Andrey: Haz пишет: ну что явно в глаза бросается - попытка создать окно за пределами экрана ( где-то на высоте кнопки питания монитора ) AT nDesktopWidth-100,0 Можно поставить и 0, 0 - окно все равно не появляется !!! Haz пишет: PS по ошибке компилятора - он не знает что за окно ему суют, или DECLARE WINDOW Form_1 перед строкой с ошибкой напиши или SetProperty("Form_1","Edit_Memo", "Value", (oBrw_1:cAlias)->MEMO ) используй Поставил. Теперь вообще программа сваливается по ошибке: Error: Control: Edit_Memo Of Form_1 Not defined. Called from SETPROPERTY(3658) Called from MYCHANGEBROWSE(361) Я же писал, что что-то с окнами неправильно делаю ? В этой проге ТРИ окна: MAIN (Form_Test), MODAL (Form_0) и еще CHILD (Form_1) ! Где то здесь собака зарыта. Я не работал с 3 окнами сразу. Помогите эти окна разрулить....

Haz: Andrey пишет: Можно поставить и 0, 0 - окно все равно не появляется проверил, в твоем исходнике поставил 0, 0 - появляется Andrey пишет: Control: Edit_Memo Of Form_1 Not defined BEGIN SEQUENCE WITH { |oErr| Break( oErr ) } IF IsWindowDefined(Form_1) SetProperty("Form_1", "Edit_Memo", "Value", (oBrw_1:cAlias)->MEMO ) END END

gfilatov2002: Andrey пишет: В этой проге ТРИ окна: MAIN (Form_Test), MODAL (Form_0) и еще CHILD (Form_1) ! Где то здесь собака зарыта. Я не работал с 3 окнами сразу. Помогите эти окна разрулить.... Сделал так: - определил Form_0 как CHILD TOPMOST DEFINE WINDOW Form_0 ; At 0, 0 ; WIDTH 950 ; HEIGHT 580 ; TITLE cTitle ; ICON "MSGDBF" ; CHILD ; TOPMOST ; ... - определил Form_1 как CHILD NOSHOW DEFINE WINDOW Form_1 ; AT 0,nDesktopWidth-100 ; WIDTH 100 ; HEIGHT 140 ; TITLE 'Мемо' ; ICON "MSGDBF" ; CHILD NOSHOW и активировал его по команде ACTIVATE WINDOW Form_1 NOWAIT

Andrey: Haz пишет: BEGIN SEQUENCE WITH { |oErr| Break( oErr ) } IF IsWindowDefined(Form_1) SetProperty("Form_1", "Edit_Memo", "Value", (oBrw_1:cAlias)->MEMO ) END END Классная конструкция ! Буду теперь так использовать. Спасибо БОЛЬНОЕ ! Haz пишет: проверил, в твоем исходнике поставил 0, 0 - появляется А у меня нет ! Вот исходник, проверь пожалуйста его - http://files.mail.ru/4F239AE50FA543C194D16A0F636B53D6

Andrey: gfilatov2002 пишет: и активировал его по команде Ну как всегда, Григорий всё по полочкам разложит !!! Рука мастера, тут уж ничего по другому и не сделаешь. Спасибо БОЛЬШОЕ !!! А что за "зверь" - TOPMOST ? И как сделать чтобы Form_1 было всегда поверх других окон ?

Haz: Andrey пишет: Вот исходник, проверь пожалуйста его проверил - все появляется при установке чекбокса "примечание"в true

Andrey: Haz пишет: проверил - все появляется при установке чекбокса "примечание"в true Понял, спасибо ! После правки Григория окна заработали как надо ! Буду дальше делать ! Спасибо всем БОЛЬШОЕ !

Andrey: Рано радовался по окнам. Как закрыть окно Form_1 при завершении задачи, т.е. кнопки "Выход" формы Form_0 ? DEFINE BUTTONEX Button_Exit .......... CAPTION "Выход" ACTION {|| Form_0.Release() } При добавлении - ACTION {|| Form_0.Release(), Form_1.Release() } прога не собирается, выдает ошибку на этой строчке: Dbf_Log.prg(189) Error E0030 Syntax error "syntax error at '.'" 1 error No code generated.

Haz: Andrey пишет: Как закрыть окно Form_1 при завершении задачи {|| domethod("Form_1","Release"), domethod("Form_0", "Release") }

Andrey: Haz пишет: {|| domethod("Form_1","Release"), domethod("Form_0", "Release") } Спасибо БОЛЬШОЕ ! А почему не хочет прокатывать стандартный вариант ACTION {|| Form_0.Release(), Form_1.Release() } ? Извиняюсь за настойчивость, очень хочется понять почему. И как сделать чтобы Form_1 была всегда поверх других окон ?

Haz: Andrey пишет: почему не хочет прокатывать стандартный вариант ACTION {|| Form_0.Release(), Form_1.Release() } Если выше по тексту модуля нет объявления окна DEFINE или DECLARE WINDOW, компилятор не понимает что ему суют. по сути нужен именно DECLARE WINDOW т.к. создание окошка через DEFINE в своем описании i_window.ch имеет вызов именно DECLARE. сама команда DECLARE это набор инструкций #translate препроцессору для корректного преобразования фантазии вида Form_o.Release() в соответствующий вызов SetPropertry(...) или DoMethod(...) Andrey пишет: И как сделать чтобы Form_1 была всегда поверх других окон в описании команды DEFINE WINDOW есть TOPMOST

Andrey: Haz пишет: в описании команды DEFINE WINDOW есть TOPMOST Есть. Только для другого окна. Исправил - получилось ! Спасибо !

Haz: Andrey пишет: Есть. Только для другого окна. тут не знаю можно попробовать повесить на событие LostFocus { || Form:Setfocus() } ( но не уверен в том что прокатит ) или копать в сторону процедуры _ChangeWindowTopmostStyle( FormHandle, Value ) из h_controlmisc.prg

Andrey: Все нормально получилось. Я TOPMOST повесил куда ты сказал и все заработало !!! Спасибо БОЛЬШОЕ за помощь ! Буду дальше делать...

Andrey: Пример почти доделал. Работает. http://files.mail.ru/02028517FBDD4473B3332A9C49077BBE Осталось доделать сборку TBROWS ТОЛЬКО из своих полей. Помогите пожалуйста в описании одной колонки, примеры смотрел, ни фига не понял. Как эту строку: ADD COLUMN TO TBROWSE &ob DATA ARRAY ELEMENT 1 ALIGN DT_CENTER, DT_CENTER SIZE 20 COLORS C_TEK, C_SYS преобразовать до привычной Клиперовской: oBrw_1:aColumns[1]:cHeading := "Дата" +CRLF + "события" oBrw_1:SetColSize(1, 70) oBrw_1:aColumns[1]:bData := {||LOG_DBF->DATE } // oBrw_1:aColumns[1]:cPicture:="99.99.9999" - не обязательно oBrw_1:aColumns[1]:nAlign := DT_CENTER Haz пишет: не там смотрел, посмотри как это делается в самом методе (не в функции) Loadfield - там как раз используется ::AddColumn Нашел! ::AddColumn( TSColumn():New( cHeading, FieldWBlock( aStru[ nE, 1 ], Select( ::cAlias ) ),cPicture, ; { ::nClrText, ::nClrPane }, { nAlign, DT_CENTER }, nSize,, lEditable,,, cOrder,,,, ; //V90 5,,,, Self, cBlock ) ) Только как это сделать для себя - вообще не представляю.... У меня есть базы имеющие 150 полей. Для показа нужно всего 15. Ладно, можно один раз перечислить. А когда новые поля в базу добавишь, нужно будет тогда ОПЯТЬ лезть в исходник и править его. ОЧЕНЬ НЕУДОБЕН этот метод. Хочется как на Клипере создавать бровс. Помогите пожалуйста.

ZAlex: А если скомпилировать с ключом -p и затем посмотреть, как препроцессор это делает? Не поможет?

Haz: ZAlex пишет: А если скомпилировать с ключом -p

Andrey: ZAlex пишет: А если скомпилировать с ключом -p и затем посмотреть, как препроцессор это делает? Не поможет? Блин, забыл ! Спасибо !

Vlad04: При наличии индексов управлять выбором их можно "кликнув" мышкой по заголовку колонки Brw_1:SetIndexCols( 2,1 ) Brw_1:aColumns[ 1 ]:cOrder := "CODE" Brw_1:aColumns[ 2 ]:cOrder := "Name" А как с помощью клавиатуры то же сделать ?

Andrey: Vlad04 пишет: А как с помощью клавиатуры то же сделать ? Вот еще пример использования TBROWSE. В нем есть функция обработки всех клавиш MyKeyAction(). Вот можете туда и вставить обработку своих клавиш. http://files.mail.ru/50BF541945984119BE7B20C8CBFB588A Может еще можно это сделать с помощью команд: ON KEY F? ACTION MyFunction() Это то что я знаю пока. Может и не прав... Нужно ждать ответ от нашего ГУРУ...

Vlad04: ок В примере есть ответ на поставленный вопрос oBrw_1:aColumns[2]:bHLClicked:={||ChoiHeader(3)} //переключение индекса по шапке / switching index on the table header

Andrey: Vlad04 пишет: В примере есть ответ на поставленный вопрос Как сам пример ? Вам понравился ? Может чего не хватает ? Делал специально в качестве обучающего примера.

Vlad04: Andrey Как сам пример ? Вам понравился ? Может чего не хватает ? Пример понравился (цветовой оформление, работа с директориями), но имеет свою специфику. Вопросы по TBROWS остались. 1) Как удалить запись ( не нашел в примерах или плохо искал) 2) Такая рабочая ситуация : - Перед открытием в таблице ищу нужную запись (таблица может быть индексирована или нет. Естественно поиск по индексу или Locate) - после открытия курсор должен быть на найденной записи.

Haz: Vlad04 пишет: 1) Как удалить запись (oBrw:cAlias)->(DbDelete()) oBrw:Refresh(.T.) Vlad04 пишет: поиск по индексу или Locate Seek: oBrw:SetFocus() (oBrw:cAlias)->(oBrw:ExpSeek( cExp, FALSE )) Locate: oBrw:SetFocus() oBrw:ExpLocate( cExp ) Vlad04 пишет: курсор должен добавить что то типа oBrw:Upstable() oBrw:ResetVScroll(.T.) oBrw:Refresh(.T., .T.)

Vlad04: ок С удалением все нормально. С поиском Seek: oBrw:SetFocus() (oBrw:cAlias)->(oBrw:ExpSeek( cExp, FALSE )) А найти нужную запись до открытия TBROWS , а потом спозиционировать TBROWS никак ?

Dima: Vlad04 пишет: А найти нужную запись до открытия TBROWS , а потом спозиционировать TBROWS никак ? А что при таком подходе курсор становится не туда ? Нашел , открыл бровс..........

Haz: Vlad04 пишет: найти нужную запись до открытия TBROWS , а потом можно так попробовать (oBrw:cAlias)->(DbGoto(nRec)) oBrw:Upstable() oBrw:Refresh(.T., .T.)

Vlad04: А что при таком подходе курсор становится не туда ? Не становится куда надо !. Есть у TBROWS переменная VALUE , если ей присваивать полученное Recno() после поиска , куда-то курсор перемещается при открытии , но не нату запись, которая найдена. Если VALUE не использовать , то на первую запись.

Vlad04: Haz ОК И поиск получился

a_sidorov: B Tsbrowse есть эффект нижней строки, которая прорисовывается при создании Tsbrowse, но не участвует в скроллинге вправо-влево и вверх-вниз, то есть просто висит на экране замороженная. Это видно на примерах из дистрибутива: SAMPLES\Advanced\TsBrowse Меню TSBrowse\More To One и TSBrowse\Excel Connectivity Для фиксированного размера Tsbrowse наверно можно подобрать размеры, чтобы эффекта не было. Но если делать настраиваемые размеры, то неприятный эффект появляется во всей красе. В последнем примере (TSBrowse\Excel Connectivity) , если изменить мышкой вертикальный размер так, чтобы последняя строка была прорисована не полностью, то при движении курсора вверх она зависает и не перерисовывается. Видимо, при создании таблицы и перерисовке в этом случае считается разное количество строк. При создании таблицы строка, не умещающаяся полностью на экране, не должна была прорисовываться.

Vlad04: По примеру 1) &cBrw:bKeyDown := { | nKey | MyKeyAction(nKey,cBrw, cParent, 0), lOk := nKey != VK_ESCAPE } Независимо от раскладки клавиатуры всегда возвращает англиЦкие. Так должно быть ? По TSBrows 2) При доступности редактирования ячейки, вход в ячейку по нажатию Enter или двойной клик. А можно клавиши в данном случае переназначить ? К примеру, редактировать по F4. 3) В консоле, когда не надо было менять значения непосредственно в Бровзе я иногда выводил данные так FAM+'|'+iM+'|'+oT+'|' или так if(Sex=1;'Муж';'Жен') Т.е. делал составную запись или подстановку Что-нибудь подобное можно в TSBrows

Haz: Vlad04 пишет: 3) В консоле, когда не надо было менять значения непосредственно в Бровзе я иногда выводил данные так FAM+'|'+iM+'|'+oT+'|' все тоже самое - определяешь блок выборки bData := {|| ...} Vlad04 пишет: всегда возвращает англиЦкие. Так должно быть ? так и должно . В принципе можно добраться до языка клавиатуры и по собственной таблице соответствий - руский/англ и верхний /нижний - вернуть то что надо. Не проверял , не делал сам т.к. не нужно было , но уверен на 10000% все достаточно реализуемо Vlad04 пишет: К примеру, редактировать по F4. сейчас не готов ответить , нужно глянуть исходники скорее всего на F4 тоже можно повесить блок DblClick

Andrey: Vlad04 пишет: Независимо от раскладки клавиатуры всегда возвращает англиЦкие. Так должно быть ? Делай свою обработку в функции MyLatRus() Но может можно и по другому, я пока не знаю (разбираюсь с этим). Надо спросить других. Не уж то нет стандарта обработки клавиш для TBROWSE ? Vlad04 пишет: По TSBrows 2) При доступности редактирования ячейки, вход в ячейку по нажатию Enter или двойной клик. А можно клавиши в данном случае переназначить ? К примеру, редактировать по F4. Я выше уже писал: "В нем есть функция обработки всех клавиш MyKeyAction(). Вот можете туда и вставить обработку своих клавиш. "

Andrey: a_sidorov пишет: B Tsbrowse есть эффект нижней строки, которая прорисовывается при создании Tsbrowse, но не участвует в скроллинге вправо-влево и вверх-вниз, то есть просто висит на экране замороженная. Это видно на примерах из дистрибутива: SAMPLES\Advanced\TsBrowse Меню TSBrowse\More To One и TSBrowse\Excel Connectivity Для фиксированного размера Tsbrowse наверно можно подобрать размеры, чтобы эффекта не было. Но если делать настраиваемые размеры, то неприятный эффект появляется во всей красе. В последнем примере (TSBrowse\Excel Connectivity) , если изменить мышкой вертикальный размер так, чтобы последняя строка была прорисована не полностью, то при движении курсора вверх она зависает и не перерисовывается. Видимо, при создании таблицы и перерисовке в этом случае считается разное количество строк. При создании таблицы строка, не умещающаяся полностью на экране, не должна была прорисовываться. Да, да, есть такая фигня... Как с этим бороться ?

gfilatov2002: Andrey пишет: Как с этим бороться ? Есть вариант добавить функцию CorrectionFirstLast(oBrw) при обработке события ON CHANGE (см. пример в папке samples\Advanced\TSB_lastrow). Но при использовании этого пути возможны побочные эффекты Поэтому надо проверять это решение на Вашем конкретном приложении

a_sidorov: Спасибо! Вроде работает!!! Поставил CorrectionFirstLast("oBrw_1) в ON CHANGE и в функцию перерисовки при изменения размера: FUNCTION ResizeBrowse() oBrw_1:Move( oBrw_1:nLeft ,oBrw_1:nTop , Form_0.Width-19, Form_0.Height-93, .t.) oBrw_1:Paint() CorrectionFirstLast("oBrw_1") RETURN Nil Не очень нравится появившееся мелькание – перерисовка при изменении размера окна. Надеюсь, что со временем найдется решение с меньшим мельканием. Может еще что-то можно придумать? Если убрать Paint(), то иногда появляются глюки, обычно после достижения конца файла.

Vlad04: Andrey Я выше уже писал: "В нем есть функция обработки всех клавиш MyKeyAction(). Мне надо отловить события перемещения по Бровз : Up, Down и др. На них хочу повесить действие. А MyKeyAction их не отлавливает

Vlad04: Достиг цели- повесил действие на событие ON CHANGE для TBROWS. По видимому оно всегда генерируется .

Haz: Vlad04 пишет: Мне надо отловить события перемещения по Бровз : Up, Down и др. На них хочу повесить действие. Попробуй так, возможно подойдет , отлавливает не сами перемещения а последствия этих перемещения oBrw:bOnDraw := { || Action() }

Haz: Haz пишет: повесил действие на событие ON CHANGE onchange не ловит перемещения по строке

Andrey: Vlad04 пишет: Мне надо отловить события перемещения по Бровз : Up, Down и др. На них хочу повесить действие. А что за действие на эти клавиши хочешь отловить ?

Vlad04: Andrey А что за действие на эти клавиши хочешь отловить ? Очищать переменную с результатами поиска Обновлять на форме значения из таблица, которые не отображены в Бровзе

a_sidorov: Для получения символа из кода клавиши nKey: &cBrw:bKeyDown := { | nKey | MyKeyAction(nKey,cBrw, cParent, 0), lOk := nKey != VK_ESCAPE } Vlad04 пишет: Независимо от раскладки клавиатуры всегда возвращает англиЦкие. Так должно быть ? Смотри пример, только для получения маленьких буковок исправь символы в массивах. MiniGUI\SAMPLES\BASIC\IncrementalSearch Функция Static Function KeyToChar( nVirtKey )

Vlad04: a_sidorov Хорошая подсказка. Пример с бровз почти готов. Остались мелочи- стрелочки (порядок индексирования) на заголовках столбцов на изменения с клавиатуры - не геагирует.

Andrey: Vlad04 пишет: Остались мелочи- стрелочки (порядок индексирования) на заголовках столбцов на изменения с клавиатуры - не геагирует. Возьми с примера Tsb_dir, я здесь где то выкладывал его.

Andrey: Есть хороший пример :\MiniGUI\SAMPLES\BASIC\SavePos А как бы сделать настройку цветов для TBROWSE по такому же принципу ? Для начала - есть ли возможность вывести ВСЕ переменные цвета в TBROWSE ?

Haz: Andrey пишет: Для начала - есть ли возможность вывести ВСЕ переменные цвета в TBROWSE все цвета в данных :aColumns[] DATA nClrFore, nClrBack // cell colors DATA nClrHeadBack, nClrHeadFore // headers colors DATA nClrSpcHdBack, nClrSpcHdFore,nClrSpcHdActive // special headers colors DATA nClrFocuBack, nClrFocuFore // focused cell colors DATA nClrEditBack, nClrEditFore // editing cell colors DATA nClrFootBack, nClrFootFore // footers colors DATA nClrSeleBack, nClrSeleFore // Focused inactive colors DATA nClrOrdeBack, nClrOrdeFore // order control column colors DATA nClr3DLCell, nClr3DLHead, nClr3DLFoot, nClr3DLSpcHd // light color for 3d text DATA nClr3DSCell, nClr3DSHead, nClr3DSFoot, nClr3DSSpcHd // shadow color for 3d text а метод Setcolor() их назначает см исходник

Andrey: Haz пишет: все цвета в данных :aColumns[] А как их в цикле вывести допустим в файл или массив ?

SergKis: Andrey пишет:А как их в цикле вывести допустим в файл или массив ? hb_memowrit("All_Columns.txt", hb_valtoexp(oBrw:aColumns)) - весь массив aColumns [pre2] a := {} for i := 1 to len(oBrw:aColumns) aAdd(a, {oBrw:aColumns[ i ]:nClrFore, ; oBrw:aColumns[ i ]:nClrBack, ; oBrw:aColumns[ i ]:nClrHeadBack, ; и далее по списку, ; ) next hb_memowrit("All_Color.txt", hb_valtoexp(a)) - весь массив цветов [/pre2]

SergKis: SergKis пишет:hb_memowrit("All_Columns.txt", hb_valtoexp(oBrw:aColumns)) - весь массив aColumns это я погорячился. в aColumns - объекты для каждой колонки. в объекте колонки есть методы SaveColor() и RestColor(). Сохранить: a := {} for i := 1 to len(oBrw:aColumns) oCol := oBrw:aColumns[ i ] oCol:SaveColor() aAdd(a, oCol:aColorsBack) next hb_memowrit("Col_Color.txt", hb_valtoexp(a)) Восстановить: a := &( hb_memoread("Col_Color.txt") ) for i := 1 to len(oBrw:aColumns) oCol := oBrw:aColumns[ i ] oCol:aColorsBack := a[ i ] oCol:RestColor() next

Andrey: SergKis пишет: это я погорячился. в aColumns - объекты для каждой колонки. в объекте колонки есть методы SaveColor() и RestColor(). Спасибо БОЛЬШОЕ ! Буду пробовать....

SergKis: Andrey пишет:Буду пробовать.... смотри TsColumn.prg. обрати внимание - в методах SaveColor() и RestColor() не задействован oCol:aColorsBack[20], элемент oCol:nClrSpcHdActive - не знаю насколько он важен ...

gfilatov2002: SergKis пишет: в методах SaveColor() и RestColor() не задействован oCol:aColorsBack[20], элемент oCol:nClrSpcHdActive Благодарю за сообщение! Поправил для следующей сборки

Vlad04: Пример Почти рабочий пример(pass 654321) 3 базы открываются используя 1 программник Часть инструкций вынесены во внешний файл.В консоле я всё выносил полностью. Остались проблемы. Стрелочки на заголовках столбцов , ну и другие мелочи. Сортировка меняется по F3.

Andrey: Во многих примерах есть удобные кнопки навигации по TBROWSE. Какой лучше делать для своего ? Нужно с *.ICO и надпись !

SergKis: Andrey пишет:Какой лучше делать для своего ? А что не так в примерах (для использования) \SAMPLES\BASIC\TOOLBAR, TOOLBAR_1, ..., ToolBarEx_2 ?

Andrey: SergKis пишет: А что не так в примерах (для использования) Да все нормально. Просто много всего интересного, не знаешь на чем остановиться. Что удобней всего использовать, чтобы потом не переделывать ?

SergKis: Andrey пишет:чтобы потом не переделывать ? переделывать придется ("лучшее - враг хорошего", "век живи, век учись") - вопрос цены - сколько времени надо на переделку ? сегодня делаешь так, завтра по другому - другие знания и возможности.

Andrey: SergKis пишет: сегодня делаешь так, завтра по другому Согласен полностью. Хотелось бы посмотреть как у других сделано ? Вот такоё меню навигации можно сделать на МиниГуи ?

Andrey: SergKis пишет: А что не так в примерах (для использования) ToolBarEx_2 ? Не совсем понял ? Можно ли в этом примере подставить иконку ? И можно ли кнопку сделать разными цветами ? Что-то у меня не получается...

SergKis: Andrey пишет:Не совсем понял ? Можно ли в этом примере подставить иконку ? В данных примерах идет речь о стандартном ToolBar контроле и SplttBox ... Меняя размеры окна увидишь поведение их. То что показываешь на картинке - надо делать ручками (например на buttonEx-ах и др.контролах), но ничего не возможного нет. Как пример "ручками" варианты MsgMenu, \SAMPLES\BASIC\MsgMenu

Andrey: Кто нибудь делал меню корректировки цветов TBROWSE для юзеров ? Или подскажите идею, как это сделать. Все цвета у меня есть в массиве: [ЦВЕТА_TBROWSE] Строка_1 = { {{0,8388608},32768,32768,32768,32768,32768,32768,32768} , "nClrText" , "Цвет текста в ячейках таблицы)" } Строка_2 = { {15773696,15773696,15773696,15773696,15773696,15773696,15773696,15773696} , "nClrPane" , "Цвет фона в ячейках таблицы" } Строка_3 = { {0,16777215,16777215,16777215,16777215,16777215,16777215,16777215} , "nClrHeadFore" , "Цвет текста шапки таблицы" } Строка_4 = { {15773696,{11048235,6174208},{11048235,6174208},{11048235,6174208},{11048235,6174208},{11048235,6174208},{11048235,6174208},{11048235,6174208}} , "nClrHeadBack" , "Цвет фона шапка таблицы" } Строка_5 = { {0,16711680,16711680,16711680,16711680,16711680,16711680,16711680} , "nClrForeFocu" , "Цвет текста курсора, текст в ячейках с фокусом" } Строка_6 = { {13743257,{4915199,61680},{4915199,61680},{4915199,61680},{4915199,61680},{4915199,61680},{4915199,61680},{4915199,61680}} , "nClrFocuBack" , "Цвет фона курсора" } Строка_7 = { {0,0,0,0,0,0,0,0} , "nClrEditFore" , "Цвет текста редактируемого поля" } Строка_8 = { {16777215,16777215,16777215,16777215,16777215,16777215,16777215,16777215} , "nClrEditBack" , "Цвет фона редактируемого поля" } Строка_9 = { {0,0,0,0,0,0,0,0} , "nClrFootFore" , "Цвет текста подвала" } Строка_10 = { {15790320,15790320,15790320,15790320,15790320,15790320,15790320,15790320} , "nClrFootBack" , "Цвет фона подвала" } Строка_11 = { {12632256,0,0,0,0,0,0,0} , "nClrSeleFore" , "Цвет текста неактивного курсора (selected cell no focused)selected cell no focused" } Строка_12 = { {8421504,{8421504,16448250},{8421504,16448250},{8421504,16448250},{8421504,16448250},{8421504,16448250},{8421504,16448250},{8421504,16448250}} , "nClrSeleBack" , "Цвет фона неактивного курсора (selected cell no focused)" } Строка_13 = { {0,0,0,0,0,0,0,0} , "nClrOrdeFore" , "Цвет текста шапки выбранного индекса" } Строка_14 = { {15790320,15790320,15790320,15790320,15790320,15790320,15790320,15790320} , "nClrOrdeBack" , "Цвет фона шапки выбранного индекса" } Строка_15 = { {10526880,10526880,10526880,10526880,10526880,10526880,10526880,10526880} , "nClrLine" , "Цвет линий между ячейками таблицы" } Строка_16 = { {0,0,0,0,0,0,0,0} , "nClrSupHeadFore" , "Цвет фона в суперхидере" } Строка_17 = { {15773696,15773696,15773696,15773696,15773696,15773696,15773696,15773696} , "nClrSupHeadBack" , "Цвет символов в суперхидере" } Строка_18 = { {0,0,0,0,0,0,0,0} , "nClrSpecHeadFore" , "Цвет фона в спецхидере" } Строка_19 = { {16777215,16777215,16777215,16777215,16777215,16777215,16777215,16777215} , "nClrSpecHeadBack" , "Цвет символов в спецхидере" } Строка_20 = { {255,255,255,255,255,255,255,255} , "nClrSpecHeadActive" , "Цвет активного спецхидера" }

Haz: Andrey пишет: Или подскажите идею, как это сделать. Через :SetColor(), куда в вместо массива цвета передавать блок кода который возвращает нужный цвет ( примеры в справке по TSBrowse ) ,а как пример выбора подойдет Minigui\Sample\Basic\Colortable

Andrey: Haz пишет: а как пример выбора подойдет Minigui\Sample\Basic\Colortable А можно сделать 3 колонки с разными цветами ? Типа: 1-колонка (описание) 2-цвет по умолчанию 3-цвет пользователя Т.е. GRID позволяет делать разными цветами колонки ?

Haz: Andrey пишет: А можно сделать 3 колонки с разными цветами ? Типа: 1-колонка (описание) 2-цвет по умолчанию 3-цвет пользователя Обычным GRID из MiniGui не пользуюсь , уверен можно сделать, а вот на том же TsBrowse по массиву значений - легко. в колонке N3 TsBrowse нужно объявить вызов внешнего редактирования с использованием окна выбора цвета. Тогда при попытке ее редактирования будет выскакивать окно выбора цвета и сохранять выбранный цвет в значении колонки. PS. того-же эффекта можно добиться через блок bPrevEdit - который должен позволить выбрать цвет, записать его в ячейку и вернуть FALSE чтоб не пустить в режим редактирования колонки Пример бровса по массиву есть в Advanced\Tsb_array, цвет фона ячейки колонок 2 и 3 нужно назначить по содержимому самой ячейки. Есть еще интересный пример TSb_Colors ... вообщем будут конкретные вопросы - задавай

Andrey: Haz пишет: вообщем будут конкретные вопросы - задавай Сделал заготовку, дальше не знаю как делать. Помогите пожалуйста. Пример - Tsb_colors https://cloud.mail.ru/public/5b99b39913da/Tsb_colors2.prg

Haz: Andrey пишет: не знаю как делать. опиши структуру массива не пойму что в нем

Andrey: Haz пишет: опиши структуру массива не пойму что в нем "Color by default" - прорисовать цветом элемента aVar[5] - остальную таблицу не надо. "Color User" - пользовательский выбор цвета, записать в элемент aVar[6] и прорисовать потом сразу в таблице. Функция выбора цвета стандартная - как в Menu_ButtonEx.prg по правому клику мышки. Исправленный пример - https://cloud.mail.ru/public/8bb7a4832b49/MiniGui-TEST Не работал я с таким TBROWSE. Почему при задании цвета: COLORS CLR_BLACK, WHITE ADD COLUMN TO TBROWSE oBrw DATA ARRAY ELEMENT 1; HEADER "Variable" + CRLF + "name"; SIZE 150; COLORS CLR_BLACK, WHITE ; ALIGN DT_LEFT Получаю черный на красном ?

Haz: Andrey пишет: прорисовать цветом элемента aVar[5] Андрей , я и хочу понять что значит aVar[x][5] там многомерный массив - поподробнее что имеется ввиду , как думаешь его в качестве цвета использовать ? или я тебе пример самодостаточный нарисую а свой массив - сам прикрутишь? По цветам отвечу с работы , как приеду где нить после 11 утра

Haz: Haz пишет: COLORS CLR_BLACK, WHITE ; ALIGN DT_LEFT Получаю черный на красном ? почему именно на красном не знаю , да это и не важно. Важно что в описании команды из справки в качестве цвета - МАССИВ [ COLOR | COLORS <aColors> ] т.е. нужно писать COLORS { CLR_BLACK, WHITE }

Andrey: Haz пишет: что значит aVar[x][5] там многомерный массив - поподробнее что имеется ввиду Это массив цветов из другого моего Tbrowsa. Получается он из функции TbrowColorWriteFile(oBrw) - выложил в папку. Содержание его - цвета по всем полям Tbrowsa (правда не все нужны, т.к. где многомерные массивы, то это перечисление цветов ПОЛЕЙ ПОКАЗА из другого Tbrowsa, потом нужно будет убрать лишнее). Смотреть "Запись_в_ини.prg" - https://cloud.mail.ru/public/8bb7a4832b49/MiniGui-TEST

Haz: отправил пример на почту из профиля

Andrey: Вопрос по переводу на русский для пользователя. Правильный ли перевод по шрифтам в TBROWSE ? // nLevel 1 = Cells - Фонт ячеек в таблице // nLevel 2 = Headers - Фонт заголовков таблицы // nLevel 3 = Footers - Фонт нижнего колонтитула таблицы // nLevel 4 = SuperHeaders - Как перевести ???

Haz: Andrey пишет: SuperHeaders - Как перевести переведи как сложный, составной или многоуровневый заголовок. А вообще лучше пользователя в эти детали не погружать , а то вместо работы весь день в раскраски играть будут

Andrey: Haz пишет: а то вместо работы весь день в раскраски играть будут Ну и пускай, это их время. Хоть с программой будут работать, а не в одноклассниках сидеть !

SergKis: Andrey пишет:Ну и пускай Ты рисковый парень. Они же скажут, в итоге, с программой невозможно работать - цвета постоянно меняются, прыгают, а мы ни на что не нажимаем. (придется делать log, что бы уличить их - работы будет не початый край)

Andrey: SergKis пишет: придется делать log, что бы уличить их - работы будет не початый край Да ладно, лог-файл уже есть, сделаем дописку смены шрифта и цвета. Меня юзера достают, то шрифт им не тот , то цвет не тот. Компы то старые...

Andrey: Меняю фонт в TBROWSE: &cBrw:ChangeFont( aFont[ 1 ], , 1 ) &cBrw:ChangeFont( aFont[ 2 ], , 2 ) &cBrw:ChangeFont( aFont[ 3 ], 1 , 3 ) &cBrw:ChangeFont( aFont[ 4 ], , 4 ) Потом на кнопу "изменить фонты" делаю отдельную функцию смены фонтов. Как получить установленные фонты в виде массива имен и размеров ?

Haz: Andrey пишет: Как получить установленные фонты в виде массива имен и размеров ? Внимательно изучать примеры и тренировать память Здесь C:\MiniGUI\SAMPLES\Advanced\RichEditEx

Andrey: Haz пишет: Внимательно изучать примеры и тренировать память Здесь C:\MiniGUI\SAMPLES\Advanced\RichEditEx Спасибо за подсказку !

Andrey: Что-то не получается со шрифтами. До создания TBROWSE делаю определение фонтов: STATIC aFont := {} DEFINE FONT Font_1 FONTNAME "Times New Roman" SIZE 12 DEFINE FONT Font_2 FONTNAME "Times New Roman" SIZE 10 ITALIC DEFINE FONT Font_3 FONTNAME "Times New Roman" SIZE 10 BOLD DEFINE FONT Font_4 FONTNAME 'Arial' SIZE 12 ITALIC AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) AAdd( aFont, GetFontHandle( "Font_3" ) ) AAdd( aFont, GetFontHandle( "Font_4" ) ) Меняю фонт в TBROWSE - см выше. Потом в другой функции пытаюсь определить заданные фонты TBROWSE: MsgFile("@Log.txt","aFont=",aFont) FOR nI := 1 TO 4 hFont := aFont[nI] aDim := GetFontRTF( hFont, 1 ) MsgFile("@Log.txt", nI,"hFont=",hFont,"aDim=",aDim ) NEXT ------------------------ Результат @Log.txt: "aFont=", {-2012603099, -1190518991, 1158290916, -989192754} 1, "hFont=", -2012603099, "aDim=", {"D", 65228, .F., .F., 1304580, .F., .F., 49} 2, "hFont=", -1190518991, "aDim=", {"D", 65228, .F., .F., 1304580, .F., .F., 49} 3, "hFont=", 1158290916, "aDim=", {"D", 223941, .F., .F., 1304580, .F., .F., 49} 4, "hFont=", -989192754, "aDim=", {"D", 223941, .F., .F., 1304580, .F., .F., 49} ------------------------ Т.е. не могу получить через функцию GetFontRTF( hFont, 1 ) установленный шрифт. Что забыл или не так делаю ?

Haz: Andrey пишет: Что забыл или не так делаю ? все не так там есть rr_getfonts() которая выдает список установленных в системе фонтов выбираешь нужное ИМЯ и РАЗМЕР _DefineFont ( "Font_x", "ИМЯ", РАЗМЕР, .F., .F., .F., .F.,, .F. ) далее как и с Font_1 - Font_4, когда Font_x больше не нужен или надо его переопределить используй _ReleaseFont("Font_x")

Andrey: Haz пишет: там есть rr_getfonts() которая выдает список установленных в системе фонтов выбираешь нужное ИМЯ и РАЗМЕР Эту менюшку я уже сделал ! Мне нужно передать в это меню ТЕКУЩИЕ ФОНТЫ и РАЗМЕР ФОНТА моего TBROWSE. Вот на этом я и споткнулся.

Haz: может проще запоминать где нить какие шрифты назначил для бровса, чем по хендлу ( который кстати ранее назначается именно именем и размером ) получить тоже имя и размер

Andrey: Haz пишет: может проще запоминать где нить какие шрифты назначил для бровса, чем по хендлу Ну этот вариант я не рассматривал, т.к. он самый простой... Хотел сделать по уму, как в других системах. Да и хотел понять, как делаются такие вещи в программах.

Haz: Andrey пишет: Хотел сделать по уму ага, а потом будет вопрос как из TSb получить хендл шрифта по уму это когда максимально просто

Andrey: Haz пишет: ага, а потом будет вопрос как из TSb получить хендл шрифта Так этот вопрос я и задавал вверху ! Что-то не получается со шрифтами. До создания TBROWSE делаю определение фонтов: STATIC aFont := {} DEFINE FONT Font_1 FONTNAME "Times New Roman" SIZE 12 DEFINE FONT Font_2 FONTNAME "Times New Roman" SIZE 10 ITALIC DEFINE FONT Font_3 FONTNAME "Times New Roman" SIZE 10 BOLD DEFINE FONT Font_4 FONTNAME 'Arial' SIZE 12 ITALIC AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) AAdd( aFont, GetFontHandle( "Font_3" ) ) AAdd( aFont, GetFontHandle( "Font_4" ) ) Меняю фонт в TBROWSE - см выше. Потом в другой функции пытаюсь определить заданные фонты TBROWSE: MsgFile("@Log.txt","aFont=",aFont) FOR nI := 1 TO 4 hFont := aFont[nI] aDim := GetFontRTF( hFont, 1 ) MsgFile("@Log.txt", nI,"hFont=",hFont,"aDim=",aDim ) NEXT ------------------------ Результат @Log.txt: "aFont=", {-2012603099, -1190518991, 1158290916, -989192754} 1, "hFont=", -2012603099, "aDim=", {"D", 65228, .F., .F., 1304580, .F., .F., 49} 2, "hFont=", -1190518991, "aDim=", {"D", 65228, .F., .F., 1304580, .F., .F., 49} 3, "hFont=", 1158290916, "aDim=", {"D", 223941, .F., .F., 1304580, .F., .F., 49} 4, "hFont=", -989192754, "aDim=", {"D", 223941, .F., .F., 1304580, .F., .F., 49} ------------------------ Т.е. не могу получить через функцию GetFontRTF( hFont, 1 ) установленный шрифт. Что забыл или не так делаю ?

Haz: Andrey пишет: Так этот вопрос я и задавал вверху ! и это все сложности ? можно дернуть хендл из obrw:aColumns[n]:hFont или любой из определенных в исходнике TSCOLUMN.PRG ( нужно только в него заглянуть ) DATA hFont // cells font DATA hFontEdit // edition font DATA hFontHead // header font DATA hFontFoot // footer font DATA hFontSpcHd // special header font примерно так hFontHandle := oBrw:aColumns[n]:hFont

Andrey: Haz пишет: нужно только в него заглянуть Спасибо БОЛЬШОЕ за подсказку !!! Только мне нужны ТОЛЬКО 4 фонта: // nLevel 1 = Cells - Фонт ячеек в таблице // nLevel 2 = Headers - Фонт заголовков таблицы // nLevel 3 = Footers - Фонт нижнего колонтитула таблицы // nLevel 4 = SuperHeaders - Фонт составного заголовка таблицы Или я опять что-то не догоняю.... DATA hFontEdit // edition font - это фонт для редактирования в ячейке ? А почему он не задается в h_tbrowse.prg ? Эх, значит нужно менюшку другую делать...

Haz: nLevel - это не фонт а то куда его применить . Посмотри в исходнике :ChangeFont() если упрощенно то там это: Case nLevel == 1 // nLevel 1 = Cells ::aColumns[ nEle ]:hFont := hFont Case nLevel == 2 .and. ::lDrawHeaders // nLevel 2 = Headers ::aColumns[ nEle ]:hFontHead := hFont Case nLevel == 3 .and. ::lFooting .and. lDrawFooters // nLevel 3 = Footers ::aColumns[ nEle ]:hFontFoot := hFont Case nLevel == 4 .and. ::lDrawSuperHd // nLevel 4 = SuperHeaders ::aSuperHead[ nEle, 7 ] := hFont другими словами в зависимости от левела запоминаем хендл передаваемого фонта в нужное место. и соответственно его можно прочитать из этого места PS там же есть и такой код if ( FontHandle := GetFontHandle( FontName ) ) != 0 aFont := GetFontParam(FontHandle) FontName := aFont[1] FontSize := aFont[2] bold := aFont[3] italic := aFont[4] underline := aFont[5] strikeout := aFont[6] endif т.е. по хендлу получить параметры ( не проверял)

Andrey: Haz пишет: т.е. по хендлу получить параметры ( не проверял) Проверил у себя в TBROWSE: MsgFile("@Log.txt","aFont=",aFont) FOR nI := 1 TO 4 hFont := aFont[nI] aDim := GetFontParam( hFont ) MsgFile("@Log.txt", nI,"hFont=",hFont,"aDim=",aDim ) NEXT ------------------------ Результат @Log.txt: "aFont=", {587863100, 34214973, 1326059819, -1140188169} 1, "hFont=", 587863100, "aDim=", {"Arial", 9, .F., .F., .F., .F., 0} 2, "hFont=", 34214973, "aDim=", {"Arial", 9, .F., .F., .F., .F., 0} 3, "hFont=", 1326059819, "aDim=", {"Arial", 9, .F., .F., .F., .F., 0} 4, "hFont=", -1140188169, "aDim=", {"Arial", 9, .F., .F., .F., .F., 0} ------------------------ Что-то странное...

Haz: Andrey пишет: Что-то странное... а что именно странно - везде стоит дефолтом ариэль 9 попробуй так FontHandle := GetFontHandle( "Font_1") ) aFont := GetFontParam(FontHandle) Вот исходник из h_font.prg видно что ищет по хендлам определенным в программе FUNCTION GetFontParam( FontHandle ) LOCAL aFontAttr LOCAL i := AScan( _HMG_aControlHandles, FontHandle ) aFontAttr := { _HMG_DefaultFontName, _HMG_DefaultFontSize, .F. , .F. , .F. , .F. , 0 } IF i > 0 .AND. _HMG_aControlType == "FONT" aFontAttr := { _HMG_aControlFontName , ; _HMG_aControlFontSize , ; _HMG_aControlFontAttributes [i, FONT_ATTR_BOLD], ; _HMG_aControlFontAttributes [i, FONT_ATTR_ITALIC], ; _HMG_aControlFontAttributes [i, FONT_ATTR_UNDERLINE], ; _HMG_aControlFontAttributes [i, FONT_ATTR_STRIKEOUT], ; iif( Len( _HMG_aControlFontAttributes ) == 5, _HMG_aControlFontAttributes [i, FONT_ATTR_ANGLE], 0 ) } ENDIF RETURN aFontAttr

Andrey: Haz пишет: а что именно странно - везде стоит дефолтом ариэль 9 Вот это и странно !!! Я же делаю - До создания TBROWSE определение фонтов: STATIC aFont := {} DEFINE FONT Font_1 FONTNAME "Times New Roman" SIZE 12 DEFINE FONT Font_2 FONTNAME "Times New Roman" SIZE 10 ITALIC DEFINE FONT Font_3 FONTNAME "Times New Roman" SIZE 10 BOLD DEFINE FONT Font_4 FONTNAME 'Arial' SIZE 12 ITALIC AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) AAdd( aFont, GetFontHandle( "Font_3" ) ) AAdd( aFont, GetFontHandle( "Font_4" ) )

Haz: гдето глюк i := AScan( _HMG_aControlHandles, FontHandle ) не находит хендл

Andrey: Haz пишет: гдето глюк Глюк у меня... Опять поторопился. Исправил переменную, вот получилось нормально: "aFont=", {1326062803, 336207122, 235543787, -1895163474} 1, "hFont=", 1326062803, "aDim=", {"Times New Roman", 12, .F., .F., .F., .F., 0} 2, "hFont=", 336207122, "aDim=", {"Times New Roman", 10, .F., .T., .F., .F., 0} 3, "hFont=", 235543787, "aDim=", {"Times New Roman", 10, .T., .F., .F., .F., 0} 4, "hFont=", -1895163474, "aDim=", {"Arial", 12, .F., .T., .F., .F., 0} Спасибо БОЛЬШОЕ !!! Теперь можно получать фонты.

Andrey: Вопрос по ширине колонок в TBROWSE. Кто как их определяет ? Можно вручную задавать ширину колонки через переменные, а можно же сделать расчет ширины колонки (шрифт*на длину поля) ? Или можно для функции LoadFields( cBrw, ParentForm, lEdit, aPoleField) ничего не заполнять, а она сама заполнит ? Поделитесь опытом...

Andrey: Для Харборовского TBrowseDB() я использовал подготовленный список полей, типа: {"NN", "DOGOVOR", "City->City", "Street->Street", и т.д.} // т.е. использовал SET RELATION TO xxxxxx {"№", "Договор", "Город", "Улица", и т.д.} А как подготовить(заполнить) функцию LoadFields( cBrw, ParentForm, lEdit, aPoleField) ?

Haz: Andrey пишет: City->City ИМХО это не прокатит если это подчиненная рабочая область ( не проверял но судя по коду не должно работать правильно )

Andrey: Haz пишет: ИМХО это не прокатит если это подчиненная рабочая область А как тогда сделать ?

Haz: Andrey пишет: А как тогда сделать добавить столбец которому назначить блок выборки записи из/в City->City. :bData := {|| IF(Pcount() = 0, City->City, City->City := x )}

Andrey: А по исходнику есть: METHOD LoadRelated( cAlias, lEditable, aNames, aHeaders ) CLASS TSBrowse Только как прикрутить не знаю ?

Haz: Судя по исходнику должно вызываться явно oBrw:LoadRelated(.... ) Добавляет в бровс колонки с блоком выборки из указанной рабочей области Andrey пишет: Только как прикрутить не знаю что именно не понятно в вызове LoadRelated( cAlias, lEditable, aNames, aHeaders ) ?

Andrey: Haz пишет: что именно не понятно в вызове LoadRelated( cAlias, lEditable, aNames, aHeaders ) ? Синтаксис. Методом проб и ошибок получилось: &cBrw:LoadRelated( "Sity", lEdit, {"Sity"}, {"Город"} ) А как это поле вставить в определённую колонку ? Можно ли уже в сформировавшемся TBROWSE функцией LoadFields( cBrw, ParentForm, lEdit, aPoleField) заменить на мою колону LoadRelated() ?

Haz: LoadRelated - не заменяет, а добавляет через ::AddColumn( TSColumn():New() т.е. вместо - никак нужно использовать :DelColumn() и :InsColumn() руками или просто в нужной колонке отредактировать блок выборки записи на нужный

Andrey: Можно таблицу формировать и так: {"NN", "DOGOVOR", "City->City", "Street->Street", "FIO", и т.д.} // т.е. использовал SET RELATION TO xxxxxx {"№", "Договор", "Город", "Улица", "ФИО абонента",и т.д.} // -------------- запишим значения в объект TsBrowse ------------- For nI := 1 to Len(aPoleField) IF AT("->",aPoleField[nI]) > 0 cStr := ALLTRIM(aPoleField[nI]) cAlias:= SUBSTR(cStr,1, AT("->",cStr)-1) cPole := SUBSTR(cStr, AT("->",cStr)+2) &cBrw:LoadRelated( cAlias, lEdit, { cPole }, { aPoleName[nI] } ) ELSE &cBrw:LoadRelated( ALIAS(), lEdit, { aPoleField[nI]}, { aPoleName[nI] } ) ENDIF &cBrw:aColumns[nI]:cHeading := aPoleName[nI] &cBrw:aColumns[nI]:cPicture := aPolePict[nI] &cBrw:aColumns[nI]:nAlign := aPoleAlign[nI] &cBrw:SetColSize(nI,aPoleSize[nI]) Next Работает !!!

Andrey: Как изменить шрифт редактирования поля ? У себя в программе так: &cBrw:ChangeFont( aFont[ 1 ], , 1 ) &cBrw:ChangeFont( aFont[ 2 ], , 2 ) &cBrw:ChangeFont( aFont[ 3 ], , 3 ) &cBrw:ChangeFont( aFont[ 4 ], , 4 ) &cBrw:ChangeFont( aFont[ 5 ], , 5 ) // ? 5 шрифт завел для редактирования

Haz: попробуй так obrw:aColumns[n]:hFontEdit := aFont[5]

Andrey: Haz пишет: попробуй так Получилось !!! Спасибо !!! А курсор как огрызок. Такой должен быть ?

Haz: Andrey пишет: А курсор как огрызок. не знаю, надо :oEdit ковырять

Andrey: А как редактировать ПОЛЕ при многопользовательском режиме ???? Там же сначала нужно блокировать запись, а потом редактировать, а потом снимать блокировку ! Или TBROWSE сам это делает ?

Haz: Andrey пишет: Или TBROWSE сам это делает делает в методе :PostEdit по умолчанию, PS. вообще блокировка записи это для ленивых еще в clipper делал обработку ошибки "требуется блокировка" - как блокировку и повтор операции , если блокировать не удавалось - сообщение что нужно подождать и опять повтор или отказ. После этого забыл что такое Rlock() Сейчас не пользую т.к. работаю с ADS через SQL запросы и блокировка теперь это проблема ADS сервера

Andrey: Всем доброй ночи ! Подскажите пожалуйста про такую вещь... У меня в TBROWSE сделано так: // обработка нажатий клавиш, включая ENTER &cBrw2:bKeyDown := { | nKey , nFalgs| nRetCode := MyKeyAction(nKey,cBrw2, cParent, 0, nFalgs) } // Двойной клик мышки на МАРКЕРЕ &cBrw2:bLDblClick:= { || nRetCode := MyAction(cBrw2, cParent) } А функция обработки мышки и ENTER такая: ////////////////////////////////////////////////////////////////////////////// STATIC FUNCTION MyAction(oBrw, cParent ) LOCAL cText, nRet := 0 /*cText := "Здесь будет карточка !" + CRLF + CRLF cText += "Line: " + STR(oBrw_5:nLastPos) + CRLF + CRLF cText += "Cell: " + STR(oBrw_5:nCell) + CRLF + CRLF cText += "RECNO(): " + STR(RECNO())+ CRLF + CRLF cText += "1(): " + STR(FIELDGET(FIELDNUM("KSTREET")))+ CRLF + CRLF cText += "2(): " + FIELDGET(FIELDNUM("STREET"))+ CRLF + CRLF MsgInfo(cText) */ nRet := FIELDGET(FIELDNUM("KSTREET")) // Как мне здесь закончить выбор из TBROWSE ???? // чтобы вернулось значение nRet Return nRet Достаточно ли поставить ThisWindow.Release ? или еще что-то нужно ставить ? И возврат значения возможен только через STATIC/PUBLIC переменную ? Хотелось бы через LOCAL переменную, я к ним привык....

Haz: Andrey пишет: Подскажите пожалуйста про такую вещь... Не совсем понял о чем речь

Andrey: Haz пишет: Не совсем понял о чем речь Andrey пишет: // Как мне здесь закончить выбор из TBROWSE ???? // чтобы вернулось значение nRet Т.е. нужно закрыть сам TBROWSE и окно на котором TBROWSE открывался. И вернуть значение nRet которое было выбрано в TBROWSE. Это обычный выбор из справочника (у меня в терминалке).

Haz: Andrey пишет: Т.е. нужно закрыть сам TBROWSE и окно понятно. Все правильно ... Выбор из Tbrowse запоминаем в переменной и ее возвращаем функцией которая создает окно и сам бровс. перед вызовом ThisWindow.Release эту переменную и назначаем ( эту переменную можно передавать в обработчик по ссылке - через @ )

Andrey: Haz пишет: ( эту переменную можно передавать в обработчик по ссылке - через @ ) Вот мой код: STATIC FUNCTION MyActionDim(oBrw, cParent ) LOCAL nRet := 0 nRet := FIELDGET(FIELDNUM("KCITY")) DoMethod( 'Form_Dim',"oBrw_5", "Release" ) Domethod("Form_Dim", "Release") Return nRet У меня всегда возврат 0 !! Я так понял что формы обе закрываются, а в этой функции - Return nRet - не возвращается ! Т.е. тогда нужно делать наверно так: nRetCode := 0 MyActionDim(oBrw, cParent, @nRetCode) MsgDebug( nRetCode ) STATIC FUNCTION MyActionDim(oBrw, cParent, nRet) nRet := FIELDGET(FIELDNUM("KCITY")) DoMethod( 'Form_Dim',"oBrw_5", "Release" ) Domethod("Form_Dim", "Release") Return NIL И везьде делать про ссылке передачу @nRetCode - правильно ?

Haz: Проще повесить на ON CHANGE {|| nRetCode := FIELDGET(FIELDNUM("KCITY")) }. Это событие отрабатывает при перемещении по бровсу вверх низ и переменная всегда будет содержать значение из текущей строки ( а ведь ее нужно сделать текущей что б что то выбрать ). При отказе от выбора по ESC или кнопке CANCEL - обнулять переменную перед закрытием окна. PS/ уезжаю на несколько дней - м.б. не подскажу в это время - не знаю как с инетом

Andrey: Haz пишет: Проще повесить на ON CHANGE {|| nRetCode := FIELDGET(FIELDNUM("KCITY")) }. Вот это мне и нужно было ! Спасибо !

Andrey: Имею в задаче 2 почти одинаковых TBROWSE, один со STATUSBAR, второй с подвалом. У обоих навешаны функции обработки: ON GOTFOCUS MyChangeBrowse(cAlias,"oBrw_5") ; ON CHANGE (MyChangeBrowse(cAlias,"oBrw_5"),CorrectionFirstLast("oBrw_5")) Функция для 1-го TBROWSE: STATIC FUNCTION MyChangeBrowse(cAlias) LOCAL nI, cVal nI := INDEXORD() IF nI == 0 cVal := NTOC(Recno()) + '/' + NTOC(RecCount()) ELSE cVal := NTOC(OrdKeyNo()) + '/' + NTOC(OrdKeyCount()) ENDIF Form_Spr.StatusBar.Item(2) := " Запись: " + cVal RETURN Nil Функция для 2-го TBROWSE: STATIC FUNCTION MyChangeBrowse(cAlias) LOCAL nI, cVal nI := INDEXORD() IF nI == 0 cVal := NTOC(Recno()) + '/' + NTOC(RecCount()) ELSE cVal := NTOC(OrdKeyNo()) + '/' + NTOC(OrdKeyCount()) ENDIF oBrw_5:aColumns[3]:cFooting := "Запись: "+cVal+SPACE(10) RETURN Nil На 1-ом TBROWSE нумерация отлично меняется при перемещении МАРКЕРА(курсора). На 2-ом TBROWSE при перемещении МАРКЕРА(курсора) клавишами или мышкой в подвале нумерация записей НЕ МЕНЯЕТСЯ !!! Как исправить ?

Haz: Andrey пишет: Как исправить ? менять руками через присвоение :cFooting := 'новое значение'

Andrey: Haz пишет: менять руками через присвоение :cFooting := 'новое значение' Не понял...

Haz: Andrey пишет: Не понял.. это я не понял - не посмотрел что уже есть присвоение после него попробуй oBrw_5:DrawFooters()

Andrey: Haz пишет: попробуй oBrw_5:DrawFooters() Ура ! Заработало ! Спасибо БОЛЬШОЕ !!!

Andrey: Как сделать редактирование ячеек таблицы в TBROWSE, если нужно это сделать в отдельной функции ? Т.е. при создании TBROWSE я делаю запрет на редактировании ячеек - oBrw_5:aColumns[nI]:lEdit := .F. и назначаю свою функцию обработки клавиш: oBrw_5:bKeyDown := { | nKey , nFalgs| MyKeyActionDim(nKey,"oBrw_5", cParent) } А уже в этой функции хочу сделать обработку по номерам колонок. Допустит 1 колонку нельзя редактировать, вторую можно и т.д. Т.е. как сделать GET поля применительно к МиниГуи - TBROWSE ?

Haz: Andrey пишет: если нужно это сделать в отдельной функции в примерах tsbTest.prg есть Brw_4:aColumns[ 4 ]:bExtEdit := { |nAge,oBrw| fExternal( nAge, oBrw ) } см как там сделано

Andrey: Haz пишет: см как там сделано Спасибо БОЛЬШОЕ !!!

Andrey: Привет всем. Вот опять непонятка. Сделал контекстное меню для TBROWSE и после выбора из него это контекстное меню остается на экране. ТОЛЬКО после второго клика на этом меню, оно уходит. При использовании другого меню с MsgInfo() - нормально уходит, сразу после первого нажатия. Что в вызываемой функции нужно добавить ?

Haz: Andrey пишет: ТОЛЬКО после второго клика на этом меню, оно уходит. есть такой косяк, не разбираясь добавил в конец нужного действа информационное сообщение типа MsgBox('Включен показ удаленных записей')

a_sidorov: Есть проблема переключения вида курсора c длинного (маркер на всю таблицу) на короткий по размеру ячейки и обратно. Для выбора из справочника делаем при инициализации TBROWSE справочника курсор на всю таблицу oBrw:lCellBrw := .f. Если нужно редактировать справочник, переключаем на короткий курсор по размеру ячейки: oBrw:lCellBrw := .t. Курсор переключается нормально. Для возврата назад после редактирования делаем: oBrw:lCellBrw := .f. oBrw:lLockFreeze:=.f. oBrw:lEditable:=.f. Курсор никак не хочет переключаться и остается по размером ячейки редактирования. Переинициализировать TBROWSE не очень хочется. Проблему решить пока не смог, может быть есть идеи или решение проблемы?

Andrey: a_sidorov пишет: Курсор никак не хочет переключаться и остается по размером ячейки редактирования. Я тоже бы хотел узнать как в TBROWSE нужно это делать ?

Haz: a_sidorov пишет: Курсор никак не хочет попробуйте примерно так oBrw:lCellBrw := !oBrw:lCellBrw oBrw:lEditable := oBrw:lCellBrw AEval( oBrw:aColumns, { |oColumn| oColumn:lNoLite := oBrw:lCellBrw, oColumn:lFixLite := !oBrw:lCellBrw } ) oBrw:Refresh(.F.)

a_sidorov: Haz пишет: попробуйте примерно так Большое спасибо, работает!!! Нужно добавить, что перед переходом для редактирования (короткий курсор по ячейке) нужно поставить AEval( oBrw:aColumns, { |oColumn| oColumn:lFixLite := .f. } ) Иначе не работает второй переход на редактирование

Andrey: Всем привет. Пытаюсь изменить - Цвет линий между ячейками: // для всех колонок исполнить кодовый блок - поставиь цвета: ЧЕРНЫЙ-буквы ; // БЕЛЫЙ-ячейки ; // КРАСНЫЙ-фона курсора ; // ЖЕЛТЫЙ-букв курсора ; // ЖЕЛТЫЙ-фона редактируемого поля ; // СИНИЙ-букв редактируемого поля ; // CYAN-линий между ячейками ! AEval( &(cBrw):aColumns, { |oColumn| oColumn:nClrFore := Rgb( 0, 0, 0) ,; oColumn:nClrBack := Rgb(255,255,255) ,; oColumn:nClrFocuBack := RED ,; oColumn:nClrFocuFore := Rgb(255,255,0) ,; oColumn:nClrEditBack := Rgb(255,255, 0) ,; oColumn:nClrEditFore := Rgb( 0, 0,255) } ) // ------- Не работает !!! - oColumn:nClrLine := Rgb( 0,176,240) } ) Как это можно сделать ? Почему в методе SaveColor() и RestColor() CLASS TSColumn.prg не используется ::aColorsBack[ 15 ] := ? ::aColorsBack[ 16 ] := ? ::aColorsBack[ 17 ] := ? Как мне запомнить текущий Цвет линий между ячейками на время, а потом восстановить его ?

Haz: Andrey пишет: // ------- Не работает !!! - oColumn:nClrLine := Rgb( 0,176,240) } ) через oBrw:Setcolor( {CLR_LINE}, { Rgb( 0,176,240)} ) попробуй PS не проверял , но раз в методе есть - должно работать

Andrey: Haz пишет: через oBrw:Setcolor( {CLR_LINE}, { Rgb( 0,176,240)} ) попробуй PS не проверял , но раз в методе есть - должно работать Это работает ! Спасибо. Как мне запомнить текущий Цвет линий между ячейками на время, а потом восстановить его ?

Andrey: aSave_CLR_LINE := &cBrw:nClrLine //запомнить цвет линий между ячейками ............ &cBrw:SetColor( { CLR_LINE }, {aSave_CLR_LINE} ) // восстановить цвет линий между ячейками таблицы

Andrey: Опять руки дошли до TBROWSE и снова вопрос по нему. Как получить ширину колонок в TBROWSE после их изменением юзером ? Т.е. сохранить эту ширину в файле-настроек, а потом восстановить (установить) при других запусках.

Haz: Andrey пишет: Как получить ширину колонок в TBROWSE проще всего заглянуть в исходник METHOD GetColSizes() INLINE If( ValType( ::aColSizes ) == "A", ::aColSizes, Eval( ::aColSizes ) ) PS. И соответственно получить ширину колонки n можно oBrw:GetColSizes()[n]

Andrey: Haz пишет: И соответственно получить ширину колонки n можно oBrw:GetColSizes()[n] Спасибо !!! При создании окна есть ON INIT. А где при создании (или после создания) TBROWSE можно также сделать ? Т.е. нужно восстановить все настройки допустим из ини-файла.

SergKis: Andrey пишет:А где при создании (или после создания) TBROWSE можно также сделать ? Т.е. нужно восстановить все настройки допустим из ини-файла. сам же ответил:При создании окна есть ON INIT. там читаешь ini делаешь SetColWidth(...), расчитывашь новые (или из ini) размеры TsBrowse ... или между END WINDOW и ACTIVATE WINDOW

SergKis: Andrey SetColSize(...), надо, а не SetColWidth(...)

Andrey: SergKis пишет: или между END WINDOW и ACTIVATE WINDOW Понял. Спасибо БОЛЬШОЕ ! Насколько я понял TBROWSE использует 5 настраиваемых шрифтов. // --------- TSCOLUMN.PRG ------------------------------- // DATA hFont // 1-cells font // DATA hFontHead // 2-header font // DATA hFontFoot // 3-footer font // DATA hFontSpcHd // 4-special header font // DATA hFontEdit // 5-edition font Как изменить их - нашел oBrw:ChangeFont( aFont[nI], , nI ), а как получить из уже настроенного TBROWSE этот список шрифтов (с размерами и т.д.) ?

gfilatov2002: Andrey пишет: а как получить из уже настроенного TBROWSE этот список шрифтов Используйте для этого функцию GetFontParam(FontHandle) Пример: [pre2] aFontPar := GetFontParam(hFont) FontName := aFontPar [1] FontSize := aFontPar [2] bold := aFontPar [3] italic := aFontPar [4] underline := aFontPar [5] strikeout := aFontPar [6] [/pre2]

Andrey: gfilatov2002 пишет: Используйте для этого функцию GetFontParam(FontHandle) Это я видел в h_tbrowse.prg Мне нужно получить сам список хендлов. hFont1 := oBrw:hFont hFont2 := oBrw:hFontHead и т.д. не работает.... или нужно типа так - hFont1 := oBrw:aColumns[ 1 ]:hFont ? Но тоже не работает...

Haz: Andrey пишет: А где при создании (или после создания) TBROWSE можно также сделать ? Т.е. нужно восстановить все настройки допустим из ини-файла. у TsBrowse объекта есть блок DATA bInit // code block to be evaluated on init может он ?

Andrey: Haz пишет: может он ? Скорее всего нет ! Нужно ручками записывать и восстанавливать все параметры TBROWSA. Вопрос предыдущий так и не смог решить. Мне нужно получить сам список хендлов. hFont1 := oBrw:hFont hFont2 := oBrw:hFontHead и т.д. не работает.... или нужно типа так - hFont1 := oBrw:aColumns[ 1 ]:hFont ? Но тоже не работает...

Haz: Andrey пишет: hFont1 := oBrw:aColumns[ 1 ]:hFont ? Но тоже не работает... что именно не работает ? Нормально возвращает хендл и GetFontParam() по нему дает правильные данные

Andrey: Haz пишет: что именно не работает ? hFont1 := oBrw:aColumns[ 1 ]:hFont // строка 297 If hFont1 != Nil aFontTmp := GetFontParam(hFont1) ENDIF Ошибка: Error BASE/1004 Метод не экспортирован: ACOLUMNS Called from ACOLUMNS(0) Called from TBRUPFONTS(297)

Haz: Andrey пишет: Error BASE/1004 Метод не экспортирован: ACOLUMNS это в каком куске кода происходит ??? Похоже имеет место попытка получить шрифты с еще не инициализированного бровса. PS. как oBrw передается в функцию ? если никак то объявлен ли oBrw к примеру как PUBLIC oBrw перед созданием ?

Andrey: Haz пишет: это в каком куске кода происходит ??? Похоже имеет место попытка получить шрифты с еще не инициализированного бровса. Точно. Ж.. с ручкой - передача oBrw: между функциями неправильная !

Andrey: Как лучше менять шрифты в TBROWSе ? оBrw:ChangeFont( aFont[ 1 ], , 1 ) cBrw:ChangeFont( aFont[ 2 ], , 2 ) cBrw:ChangeFont( aFont[ 3 ], 1 , 3 ) cBrw:ChangeFont( aFont[ 4 ], , 4 ) или через oBrw:hFont := _SetFont (ControlHandle,FontName,FontSize,bold,italic,underline,strikeout) ...............

Haz: Andrey пишет: Как лучше менять шрифты в TBROWSе через оBrw:ChangeFont( aFont[ 1 ], , 1 ) , т.к. aFont[] может быть кодовым блоком и соответственно шрифт в колонке может меняться от условий. К примеру - обслуженная заявка может отображаться перечеркнутым шрифтом, а черновик - курсивом

Andrey: А как тогда из выбранного списка шрифтов (из меню) сделать переназначение шрифтов. Допустим есть массив: aFonts := {} AADD( aFonts, {"Times New Roman",11,lBold,lItalic} ) AADD( aFonts, {"Arial" ,12,lBold,lItalic} ) AADD( aFonts, {"Tahoma" ,14,lBold,lItalic} ) AADD( aFonts, {"Courier New" ,16,lBold,lItalic} ) AADD( aFonts, {"Courier New" ,12,lBold,lItalic} ) ---> через оBrw:ChangeFont( aFont[ 1 ], , 1 ) и т.д. Т.е. как из массива aFonts[1] получить хендл этого шрифта (размер,болд,италик) ? Достаточно сделать GetFontHandle( aFonts[1] ) или нет ?

Haz: Andrey пишет: Достаточно сделать GetFontHandle( aFonts[1] ) достаточно НО если это не блок кода Не понял конечную цель , чего именно хотим ? -если из меню шрифт назначить - тогда это передать параметры в define font и получив хендл назначенного шрифта через GetFontHandle() еспользовать его - если по хендлу параметры шрифта получить , так пару сообщений назад Григорий все расписал -если из объекта aColumns хендл получить - то сначала проверить его надо на тип данных через IF Valtype(::hFont) == "B" hFontHandle := eval(::hFont) END В итоге - цель то какая ?

Andrey: Haz пишет: достаточно НО если это не блок кода Что-то не работает. Сделал по другому - работает, но может я неправ ? ///////////////////////////////////////////////////////////////////////////////////////// FUNCTION TbrUpFonts(oBrw,aFonts) // перечитать шрифты TBROWSE LOCAL nI, hFont, aF, ControlHandle := oBrw:hWnd IF LEN(aFonts) > 0 FOR nI := 1 TO 5 aF := aFonts[nI] hFont := _SetFont(ControlHandle,aF[1],aF[2],aF[3],aF[4]) oBrw:ChangeFont( hFont, , nI ) NEXT ENDIF ..............

Haz: Andrey пишет: Что-то не работает. не обратил внимания у меня aFont из хендлов а твой массив параметров шрифта . тогда НЕ ДОСТАТОЧНО тогда пример richEditEx в помощь ( уже вроде говорили про него в этом контексте месяца три назад ) там как раз показано как использовать _SetFont(), и правильно что туда заглянул

Andrey: Haz пишет: тогда пример richEditEx в помощь ( уже вроде говорили про него в этом контексте месяца три назад ) там как раз показано как использовать _SetFont(), и правильно что туда заглянул Про него уже забыл. Увидел в h_tbrowse.prg : oBrw:hFont := _SetFont (ControlHandle,FontName,FontSize,bold,italic,underline,strikeout) Извиняюсь за повторные (тупые) вопросы. Память уже не та...

Andrey: Подскажи пожалуйста как сделать автоматический расчет ширины колонок ? Есть окно: DEFINE WINDOW Form_0 На нем DEFINE TBROWSE oBrw END TBROWSE hFont := oBrw:hFont // считать размер шрифта MsgDebug(hFont,GetFontParam(hFont)) // вроде правильно выдает... Хочу автоматом вычислять размер колонок в зависимости от шрифта: For nI := 1 TO ... oBrw:aColumns[nI]:cHeading := aTitleTbrw[nI] nLenPole := LEN( FIELDGET( FIELDNUM(aPole[nI]) ) ) nWidth := GetTextWidth( NIL, nLenPole, GetFontHandle(hFont) ) oBrw:SetColSize(nI, nWidth) oBrw:aColumns[nI]:nAlign := DT_CENTER ............. Только вот nWidth выдает всегда 0 ?

Andrey: Блин, разобрался... Нужно вместо nWidth := GetTextWidth( NIL, nLenPole, GetFontHandle(hFont) ) Задавать текст, а не число...

Andrey: Косяк при выводе таблицы - дублирование полей базы !!! В моей базе 14 полей (включая мемо поле), в таблицу вывожу только 10 ! А при выводе в таблице показывает 20 полей, причем 10 с русским заголовком + 10 с английским. Вот примерно код: aTbHead := { 'Дата' , 'Время' , 'Код' , 'Наименование события', .... } aTbField:= { 'DATE' , 'TIME' , 'NEVENT' , 'EVENT' , ... } aTbAlign:= { DT_CENTER, DT_CENTER, DT_CENTER, DT_LEFT , ... } */ // Стандартная функция загрузки базы LoadFields( "oBrw", 'Form_0', , aTbField ) FOR nI := 1 TO LEN(aTbHead) cStr := SPACE( FieldSize( FieldPos(aTbField[nI]) ) ) nTbColWidth := GetTextWidth( NIL, cStr, GetFontHandle(hFont) ) oBrw:aColumns[nI]:cHeading := aTbHead[nI] oBrw:SetColSize(nI, nTbColWidth) oBrw:aColumns[nI]:nAlign := aTbAlign[nI] NEXT .... Что не так делаю ?

Andrey: Разобрался. Мой косяк. Оказывается я два раза делал в программе загрузку файлов... LoadFields( oBrw, 'Form_0' ) oBrw:LoadFields( .F. ) // все поля НЕ редактируемые

Andrey: Как можно вывести МЕМО поле в TBROWSE в одну строчку, чтобы таблица не увеличивалась на две строки ?

Dima: написать свой блок кода для вывода этого поля

Andrey: Haz пишет: через oBrw_1:aColumns[1]:bData Что то не получается у меня.... Я отказался от функции (h_tbrowse.prg) : //LoadFields( "oBrw", 'Form_0', .F., aTbField ) // все поля НЕ редактируемые Воn мой код: END TBROWSE //* | наименование | алиас | поле | формат поля | AADD( aPole, { "Дата" , "" , "DATE" , "99.99.9999" , .... AADD( aPole, { "Время" , "" , "TIME" , "99:99:99" , ... AADD( aPole, { "Код" , "" , "NEVENT" , "@Z 999" , ... AADD( aPole, { "Наименование" , "" , "EVENT" , REPLICATE("x",60) , ... FOR nI := 1 TO LEN(aPole) cStr := aPole[nI,4] // шаблон вывода поля nTbColWidth := GetTextWidth( NIL, cStr, GetFontHandle(hFont) ) oBrw:aColumns[nI]:cHeading := aPole[nI,1] // Строка 106 oBrw:aColumns[nI]:bData := &('{ || "'+aPole[nI,3]+'" }') oBrw:SetColSize(nI, nTbColWidth) oBrw:aColumns[nI]:nAlign := aPole[nI,6] oBrw:aColumns[nI]:cPicture := aPole[nI,4] NEXT Выдает ошибку: Error BASE/1132 Переполнение массива: Неверное количество аргументов Called from MAIN(106) Где неправ, подскажите пожалуйста...

Dima: Примеры смотрел ? TsB_Mdi.prg TsBtest.prg

Andrey: Dima пишет: Примеры смотрел ? Вот мой исходник - https://cloud.mail.ru/public/6fedc2671caf/Tsb_Config0.prg Там удалил пару строк - теперь ошибка в 104 строке. В примере нужно наверно создавать колонки типа oBrw:AddColumn( TSColumn():New( If(.F., OemToAnsi(hb_eol() + "№№"), hb_eol() + "№№") ..... А как я не знаю... Подскажите пожалуйста, может я и не прав.

Andrey: Вот, разобрался. FOR nI := 1 TO LEN(aPole) ADD COLUMN TO TBROWSE oBrw // добавить новую колонку в TBROWSE cStr := aPole[nI,4] // шаблон вывода поля nTbColWidth := GetTextWidth( NIL, cStr, GetFontHandle(hFont) ) oBrw:aColumns[nI]:cHeading := aPole[nI,1] bBlock := FieldBlock( aPole[nI,3] ) IF VALTYPE(FIELDGET(FIELDNUM(aPole[nI,3]))) == "M" ELSE oBrw:aColumns[nI]:bData := bBlock ENDIF oBrw:SetColSize(nI, nTbColWidth) oBrw:aColumns[nI]:nAlign := aPole[nI,6] oBrw:aColumns[nI]:cPicture := aPole[nI,4] NEXT

Andrey: Хотелось бы сделать показ мемо в отдельном (дополнительном) окне Haz пишет: если примерно как на картинке то добавить в бровс пустую колонку , дать ей болк выборки { || 'MEMO'}. разрешить редактирование :lEdit := .T.и через oBrw_1:aColumns[11]:bPrewEdit := {|| ...} вызывать функцию которая в окне показывает мемо, Эта функция должна вернуть FALSE ( ну или через BtnBox делать чтоб совсем как на картинке) Что-то не получается это окно.... Пожалуйста помоги подправить... Вот исходник мой - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample/

Haz: Andrey пишет: Что-то не получается это окно... 1. EdtiBox value нужно присваивать не пустую строку а значение мемо поля 2. Forma_memo должна вернуть .F. чтоб не пустить в редактирование поля бровс

Andrey: Haz пишет: 1. EdtiBox value нужно присваивать не пустую строку а значение мемо поля 2. Forma_memo должна вернуть .F. чтоб не пустить в редактирование поля бровс Сделал и получилось ! Спасибо !!! А как теперь сделать: 1) Возврат и запись отредактированного мемо-поля ? 2) Кнопочку маленькую (квадратненькую, в размер ячейки) повесить на активное мемо-поле в TBROWSE как в DBFNavigator-e ? Пример там же - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample/ Только базу удалить старую нужно.

Haz: Andrey пишет: А как теперь сделать: 1) Возврат и запись отредактированного мемо-поля ? 2) Кнопочку маленькую (квадратненькую, в размер ячейки) повесить на активное мемо-поле в TBROWSE 1. При закрытии окна если мемо поле редактировалось - запросить сохранение и если пользователь скажет ДА - то присвоить значение Value из Editbox в мемо поле ( возможно через RLock() ). 2. Посмотри в примерах TsBrowse использование метода :SetBtnGet() это и есть кнопочка

Andrey: Haz пишет: 2. Посмотри в примерах TsBrowse использование метода :SetBtnGet() это и есть кнопочка В одно примере TsBtest.prg есть только одно использование: Brw_4:SetBtnGet( 5, "", { | oEdit, dVar | dVar := fBtnGet( dVar, oEdit:oWnd ),; oEdit:VarPut( dVar ), oEdit:Refresh() }, 16 ) В другом примере TsB_Mdi.prg все (кроме одного) закомментировано: // activating BtnGet to column 7 - not impement yet // Brw_6:SetBtnGet( 7, "Calen16", { | oGet, dVar | aRect := GetCoors( oGet:hWnd ), ; // dVar := FwCalendar( oGet:Value(), aRect[ 1 ], aRect[ 2 ], oGet:oWnd ),; // oGet:cText( dVar ), oGet:Refresh(), oGet:KeyDown( VK_RETURN, 0 ) }, 16 ) Как у себя сделать, вообще не пойму ... И почему текст закомментирован ? И вдобавок еще FwCalendar() - наверно из FiveWin'a дернули ? Помогите пожалуйста разобраться.

Haz: Andrey пишет: В одно примере TsBtest.prg есть только одно использование: Brw_4:SetBtnGet( 5, "", { | oEdit, dVar | dVar := fBtnGet( dVar, oEdit:oWnd ),; oEdit:VarPut( dVar ), oEdit:Refresh() }, 16 ) а чего тут разбираться колонке 5 назначается кнопка размером 16 пикселей, на нажатие которой вешаем кодовый блок . в сам блок передаем параметрами объект редактирования и значение до редактирования dVar. после редактирования dVar содержит новое значение и через VarPut присваиваем ее значение буферу редактора , потом делаем Refresh чтоб на экране значение поля ввода перерисовалось на значение буфера. В твоем случае dVar это значение мемо поля , fBtnGet - функция внешнего редактора которая возвращает - значение новое для мемо Но тогда :PrevEdit не надо использовать т.к. BtnGet появляется внутри ячейки редактируемой

Andrey: Нет не появляется кнопка при активном маркере, как картинке: oBrw:SetBtnGet( nI, "", { | oEdit, dVar | dVar := fBtnGet( dVar, oEdit:oWnd ),; oEdit:VarPut( dVar ), oEdit:Refresh() }, 16 ) oBrw:aColumns[nI]:bPrevEdit := {|| FORMA_MEMO( &( bBlock2 ) ) } Если убрать oBrw:aColumns[nI]:bPrevEdit := {|| FORMA_MEMO( &( bBlock2 ) ) } , то кнопка появляется ТОЛЬКО при редактировании. Пример там же - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample/

Haz: Andrey пишет: Если убрать oBrw:aColumns[nI]:bPrevEdit := {|| FORMA_MEMO( &( bBlock2 ) ) } , то кнопка появляется ТОЛЬКО при редактировании. так и должно быть это btnGET - т.е. кнопка в GET объекте , поэтому и писал что нужно не использовать PrevEdit (иначе GET не создается )

Andrey: Haz пишет: так и должно быть это btnGET - т.е. кнопка в GET объекте , поэтому и писал что нужно не использовать PrevEdit (иначе GET не создается ) А как тогда быть ? Кнопка на МАРКЕРЕ НЕ ПОКАЗЫВАЕТСЯ, только при редактировании ? А я хочу показ кнопки без редактирования, а при редактировании чтобы срабатывала функция FORMA_MEMO( &( bBlock2 ) ? Или это сделать нельзя ?

Haz: Andrey пишет: Или это сделать нельзя ? похоже что невозможно , сам остановился на варианте с PrevEdit

Andrey: Хочу сделать обработку полей в своей ОТДЕЛЬНОЙ функции. //* | наименование | алиас | поле | формат поля | AADD( aPole, { "Дата" , "" , "DATE" , "99.99.9999" , .... AADD( aPole, { "Время" , "" , "TIME" , "99:99:99" , ... AADD( aPole, { "Код" , "" , "NEVENT" , "@Z 999" , ... ..... aPole := ListFieldsTbrws() // считать структуру таблицы FOR nI := 1 TO LEN(aPole) ADD COLUMN TO TBROWSE oBrw // добавить новую колонку в TBROWSE .... aDimPole := aPole[nI] oBrw:aColumns[nI]:lEdit := .T. oBrw:aColumns[nI]:bPrevEdit := {|| MyEditPole( aDimPole ) } .... NEXT ... При вызове MyEditPole( aDimPole ) всегда показывается последний массив aPole[ПОСЛЕДНИЙ!!!]. FUNCTION MyEditPole( aPole ) LOCAL lRet := .F. MsgDebug("Здесь хочу сделать обработку ВСЕХ полей БД !",aPole) RETURN lRet Почему ? Как сделать правильно ? Пример тут - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample

gfilatov2002: Andrey пишет: Как сделать правильно ? Ответ отправил по почте

Haz: Andrey пишет: Как сделать правильно ? gfilatov2002 пишет: Ответ отправил по почте думаю в почте примерно так oBrw:aColumns[nI]:bPrevEdit := &("{|| MyEditPole( " + NTOC(nI) + ") }" ) FUNCTION MyEditPole( nI ) ... aDimPole := aPole[nI] ...

gfilatov2002: Haz пишет: oBrw:aColumns[nI]:bPrevEdit := &("{|| MyEditPole( " + NTOC(nI) + ") }" ) Да, так сработает... Но я предложил не использовать макроподстановку, и выкрутился с помощью массива oBrw:aColumns[oBrw:nCell]

Andrey: Спасибо за помощь ! Что выбрать даже и не знаю... Глаза разбегаются... Я сделал еще вариант: oBrw:aColumns[nI]:Cargo := aPole[nI] oBrw:aColumns[nI]:bPrevEdit := {|| MyEditPole( oBrw:aColumns[oBrw:nCell]:Cargo ) }

Haz: Andrey пишет: oBrw:aColumns[nI]:Cargo Андрей, выведи чему равно значение ::cData для каждой колонки и у тебя появится четвертый вариант

Andrey: Не совсем понял для чего выводить - значение ::cData для каждой колонки.... Мне вообще то нужно передать всю строку (текущую) массива aPole[nI], для дальнейшего анализа. Более подробно функция MyEditPole() в примере - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample А как получить допустим по нажатии Enter или мышки в функцию MyEditPole() координаты МАРКЕРА/КУРСОРА ? И длину маркера тоже как получить ?

Haz: Andrey пишет: Не совсем понял для чего выводить - значение ::cData для каждой колонки чтобы убедиться что cData после значка алиаса содержит имя поля базы Alias->FieldName по которому эта колонка построена . Т.к. колонки можно менять местами , удалять и пр. то номер колонки бровса очень часто НЕ совпадает с номером поля базы . И попытки вытянуть поле по номеру приведут к ошибке. Правильным будет решение выделять имя поля например как сFieldName := Substr( oBrw:aColumns[x]:cData, ">") или найти номер колонки , соответствующий полю nCol := Ascan( oBrw:aColumns, {|e| Substr(e:cData, ">") == cField ) }) Andrey пишет: координаты МАРКЕРА/ при нажатии Enter попадаем в oEdit объект и читаем его переменные oEdit:oWnd:nTop. oEdit:oWnd:nLeft и тд

Andrey: Спасибо Haz за разъяснения ! Haz пишет: и читаем его переменные oEdit:oWnd:nTop. oEdit:oWnd:nLeft и тд НЕ читаются. Пишет Метод не экспортирован: OWND или другую хрень. Покажи пожалуйста как правильно прочитать для моего примера ?

Haz: Andrey пишет: НЕ читаются. Похоже добраться до объекта oEdit можно только через :SetBtnGet(), а точнее через его bAction. Андрей , зачем тебе это , поделись что удумал. Может есть какой выход

Andrey: Haz пишет: Андрей , зачем тебе это , поделись что удумал. Может есть какой выход Хочу для юзеров сделать показ подсказки типа такой: А то при редактировании юзера не будут закрывать поле и данные не сохранятся. А еще есть всплывающие подсказки, их тоже можно прикрутить. Только координаты маркера нужны ! Как их получить ?

Haz: Andrey пишет: А то при редактировании юзера не будут закрывать поле и данные не сохранятся. стандартными средствами похоже не сделать , надо менять исходники или TGetBox или TSBrowse. я для таких забывчивых пользователей так и делаю в каждом релизе HMG чтоб было как в Excel сдвинул фокус и данные уже сохранились

Andrey: Haz пишет: стандартными средствами похоже не сделать , надо менять исходники или TGetBox или TSBrowse. я для таких забывчивых пользователей так и делаю в каждом релизе HMG чтоб было как в Excel сдвинул фокус и данные уже сохранились А почему дополнительный флаг не сделать сразу в исходники ? Григорий бы внес и все пользовались бы ? Не только у меня проблемы такие, у всех....

SergKis: Andrey пишет:А почему дополнительный флаг не сделать сразу в исходники ? Григорий бы внес и все пользовались бы ? Сам внеси или на весь объект TsBrowse или в каждую колонку (объект) : [pre2] IF ! __objHasData(oBrw, 'nModify_Rec') // добавим переменну в oBrw __objAddData (oBrw, 'nModify_Rec' ) ENDIF oBrw:nModify_Rec := 0 при модификации +1 и обрабатывай когда надо и не забываем в 0 ставить или на колонки FOR i := 1 TO len(oBrw:aColumns) oCol := oBrw:aColumns[ i ] IF ! __objHasData(oCol, 'nModify_Col') // добавим переменну в oCol __objAddData (oCol, 'nModify_Col' ) ENDIF oCol:nModify_Col := 0 NEXT во When на колонку oCol:nModify_Col := 0 в OnChange +1 [/pre2]

SergKis: PS это делаешь в своем коде, после создания oBrw или всех колонок - смотря что выбрал для реализации

Haz: SergKis пишет: это делаешь в своем коде, после создания oBrw Думаю, Андрей имел в виду "флаг" при переключении которого запись в редактируемую ячейку происходила бы при потере фокуса get объектом даже если LastKey() <> VK_ENTER (просто ткнули мышом в другую ячейку) . В TSB сейчас редактирование прерывается и значение не сохраняется ,Get закрыт и значение его буфера потеряно.

SergKis: Haz пишет:запись в редактируемую ячейку происходила бы при потере фокуса get объектом даже если Я тоже это имел ввиду, т.е. если не хватает флага, то можно добавить на oBrw или на каждую колонку oTsColumn. Можно добавить новый или изменить сущест. метод объекта (см. Harbour для начинающих), без обращения к Григорию Я с TsBrowse не работаю, но GetBox использую, а в него из TsColumn передается блок LostFocus, а в нем (блоке) спокойно, получив oGet проделать операции по сохранению ...

Haz: SergKis пишет: получив oGet проделать операции по сохранению ... спасибо за идею, я просто менял исходники постояннно

Andrey: Возвращаюсь дальше к моему примеру. Вот возник следующий вопрос: Как мне сделать редактирование ТОЛЬКО первой колонки ("Код") ТОЛЬКО по клавише F10 ? Вот пример тут - https://cloud.mail.ru/public/56155cb9fec5/MiniGui-Sample

Haz: Andrey пишет: Как мне сделать редактирование ТОЛЬКО первой колонки ("Код") ТОЛЬКО по клавише F10 ? F10 завязана на Sysmenu окна и по умолчанию бровсом не перехватывается. Разбираться как отучить не стал а на F9 - нет ничего проще oBrw:nFireKey := VK_F9 oBrw:bUserKeys := { |a,b,c| KeyPressed(a,b,c) } FUNC KeyPressed( nKey, nFlag, oBrw ) LOCAL xRet := nKey IF nKey == VK_RETURN .OR. nKey == oBrw:nFireKey .AND. oBrw:nCell > (IF(oBrw:lSelector, 2, 1)) xRet := .F. END RETURN xRet

Andrey: Haz пишет: нет ничего проще Не совсем получается. При обработке первой колонки по F9 попадаю в обработку 1-ой колонки. А остальные колонки - становятся закрытыми !!! Что-то не так делаю ? Исправленный пример там же.

Haz: Andrey пишет: Не совсем получается. При обработке первой колонки по F9 попадаю в обработку 1-ой колонки. А остальные колонки - становятся закрытыми !!! Сам же хотел ТОЛЬКО первую и ТОЛЬКО по F Или остальные как обычно должны ? Тогда подправь условие KeyPressed() - там всего 3 строки кода PS. IF nKey == VK_RETURN .AND. oBrw:nCell == (IF(oBrw:lSelector, 2, 1)) .OR. nKey == oBrw:nFireKey .AND. oBrw:nCell > (IF(oBrw:lSelector, 2, 1))

Andrey: Haz пишет: там всего 3 строки кода Понял, разобрался. А как все-таки получить в функции MyEditPole() координаты курсора/маркера ? MsgDebug( "Right=", oBrw:aColumns[oBrw:nCell]:oEdit:nRight, "Left=", oBrw:aColumns[oBrw:nCell]:oEdit:nLeft ) Выдает ошибку : Error BASE/1004 Метод не экспортирован: NRIGHT

Haz: Andrey пишет: А как все-таки получить в функции MyEditPole() координаты курсора/маркера ? Получить можно , но при выводе твоей подсказки "Нажмите ввод для сохранения" Get объект потеряет фокус и скорее всего редактирование завершится до Get можно добраться через блок oColumns:bEditing - этот блок выполняется ( если определен) когда GET создан.В него передается 2 параметра : If oCol:bEditing != Nil Eval( oCol:bEditing, uVar, Self ) EndIf т.е. значение ячейки и объект aColumn, координаты можно дернуть через oColumn:oEdit:nTop, oColumn:oEdit:nLeft. Но вот что с ними делать будешь ?

SergKis: Andrey пишет:А как все-таки получить в функции MyEditPole() координаты курсора/маркера ? попробуй отработать по GetBox (bWhen, bGotFocus, bValid): [pre2] // h := GetFocus() - на GotFocus и Valid можно, на When не помню, на Action // нельзя в фокусе будет Button Action, тут только через: h := GetControlHandle(_HMG_ThisControlName, _HMG_ThisFormName) i := aScan(_HMG_aControlHandles, h) IF i > 0 .and. _HMG_aControlType[ i ] == "GETBOX" nRow := GetWindowRow(h) // _HMG_aControlRow [ i ] nCol := GetWindowCol(h) // _HMG_aControlCol [ i ] nWidth := GetWindowWidth(h) // _HMG_aControlWidth [ i ] nHeight := GetWindowHeight(h) // _HMG_aControlHeight[ i ] oGet := _HMG_aControlHeadClick[ i ] uValue := oGetVarGet() // значение получить ... oGet:VarPut(uValue) // значение записать ENDIF[/pre2] т.е. Label создать в bWhen, убрать в bLoctFocus или bValid

Andrey: Имею вот такую таблицу. Хочу раскрасить её по строкам, коме 3 и 4 колонки. Цвета текста содержатся в 3-ей колонке, а цвет фона в 4-ой колонке. Массив aStColorUsl равен: { 1, 'Цвет текста/фона удаленных записей' , CLR_HGRAY , CLR_BLACK , 0 } { 2, 'Цвет текста/фона столбца "Код" = 0' , 255 , MyRGB({235,117,123}) , 0 } { 3, 'Цвет столбца "Наименование события" пустое' , 128 , MyRGB({235,117,123}) , 0 } { 4, 'Цвет текста/фона столбца "Код" = 1' , CLR_WHITE , CLR_GRAY , 1 } { 5, 'Цвет текста/фона столбца "Код" = 2' , CLR_YELLOW , CLR_GRAY , 1 } { 6, 'Цвет текста/фона столбца "Код" = 3' , CLR_RED , CLR_GRAY , 1 } { 7, 'Цвет текста/фона столбца "Код" = 4' , CLR_HGRAY , CLR_GRAY , 1 } { 8, 'Цвет текста/фона столбца "Код" = 5' , CLR_BLUE , CLR_GRAY , 1 } { 9, 'Остальные цвета ' , CLR_BLACK , CLR_GRAY , 1 } Как мне рас красить таблицу по строкам ? FOR nJ := 1 TO LEN(aStColorUsl) // массив цвета по условию nTextColor := aStColorUsl[nJ,3] // цвет текста nBackColor := aStColorUsl[nJ,4] // цвет фона oBrw_2:Setcolor( { 1 }, { nTextColor }, 1 ) // 1 колонка - цвет текста oBrw_2:Setcolor( { 2 }, { nBackColor }, 1 ) // 1 колонка - цвет фона oBrw_2:Setcolor( { 1 }, { nTextColor }, 2 ) // 2 колонка - цвет текста oBrw_2:Setcolor( { 2 }, { nBackColor }, 2 ) // 2 колонка - цвет фона NEXT Не могу сообразить как выставить условие показа....

Haz: Andrey пишет: Как мне рас красить таблицу по строкам ? не понял вопрос в oBrw_2:Setcolor( { 1 }, { nTextColor }, 1 ) вместо { nTextColor } укажи блок кода , который вернет массив цвета в зависимости от номера строки

Andrey: Haz пишет: кажи блок кода , который вернет массив цвета в зависимости от номера строки Вот с этим блоком кода у меня и не получается....

Haz: как то так ? oBrw_2:Setcolor( { 1,2 }, { || { aStColorUsl[ oBrw:nAt][3], aStColorUsl[ oBrw:nAt][4] }}, 2 )

Andrey: Haz пишет: как то так Нет, не получается.... Я файл на почту отправил. Посмотри пожалуйста.

Andrey: С таблицами и базой я немного разобрался. А как мне работать с массивом из которого сделан TBROWSE: DEFINE TBROWSE oBrw_2 ; ............... END TBROWSE oBrw_2:SetArray( aVar2 ) ADD COLUMN TO TBROWSE oBrw_2 DATA ARRAY ELEMENT 1; ................ Т.е. как мне записать в ELEMENT 5 свои значения ?

Haz: Andrey пишет: Т.е. как мне записать в ELEMENT 5 свои значения ? 1. oBrw_2:aArray[oBrw_2:nAt][5] := "Свое значение" 2. Eval( oBrw_2:aColumns[5]:bBlock, "Свое значение" ) 3. использовать SQLMIX и работать с массивом как с DBF (индексы фильтры сортировка и пр)

Andrey: Haz пишет: 1. oBrw_2:aArray[oBrw_2:nAt][5] := "Свое значение" Немного ошибся. Нужно 4 элемент изменять. В ней у меня цвета - числа. Как сделать цикл по 4 колонке ? FOR nI := 1 TO ??? ( oBrw_2:nLen - так или ошибаюсь ?) oBrw_2:aArray[oBrw_2:nI][4] := aStColorUsl[nI,4] ... NEXT

Haz: Andrey пишет: Как сделать цикл по 4 колонке FOR nI := 1 TO Len(oBrw_2:aArray) oBrw_2:aArray[nI][4] := aStColorUsl[nI,4] ... NEXT

Andrey: Haz Спасибо ! Еще можно и так: FOR nI := 1 TO oBrw_2:nLen

Haz: Andrey пишет: Еще можно и так: можно, я просто привык к Len( aArray ) можно и так nI := 0 Aeval( oBrw_2:aArray, {|e| e[4] := aStColorUsl[++nI,4] }) PS. Даже короче в одну строку Aeval( oBrw_2:aArray, {|e, n| e[4] := aStColorUsl[n,4] })

Andrey: Haz пишет: Aeval( oBrw_2:aArray, {|e| e[4] := aStColorUsl[++nI,4] }) Не, это трудно читаемое... Не для меня ! Потом свои тексты фиг разберешь !!! А я пример делаю для всех, в коллекцию Григория. Там тоже читаемый текст нужен... Посмотри пожалуйста еще 3 вопроса, письмо отправил.

Andrey: С изменением цвета понял, СПАСИБО ! // редактирование 4-колонки и перерисовка цвета после его изменения oBrwClr:aColumns[4]:bPrevEdit := { || ColorPicker(oBrwClr), oBrwClr:Refresh(FALSE), FALSE } А почему не работает вот эта конструкция ? oBrwClr:aColumns[4]:bPostEdit := { || ViewColorTbrws(oBrwClr,4,aVar) } Т.е. я хотел бы чтобы после изменения цвета выполнялась функция перерисовки цвета по таблице. За что отвечает bPostEdit ?

Haz: Andrey пишет: А почему не работает вот эта конструкция Она не может не работать , bPostEdit автоматически выполняется после редактирования Проверь вызов , oBrwClr:aColumns[4]:bPostEdit := { || MsgDebug('ДО'), ViewColorTbrws(oBrwClr,4,aVar), MsgDebug('ПОСЛЕ') } Скорее в логике проблема.

Andrey: Спасибо, буду разбираться. Еще вопрос, в программе делаю: oBrwClr:nAdjColumn := 3 // растянуть колонку 3 до заполнения пустоты в бровсе справа oBrw_2:nAdjColumn := 2 // растянуть колонку 2 до заполнения пустоты в бровсе справа Вот результат: Но это только при таких параметрах ХР: Как бороться с такой ситуацией ? Юзеров же не заставишь переключаться на обычный шрифт...

Andrey: Т.е. я понял что никто не знает как бороться с такой ситуацией. Есть ли для объекта TBROWSE такое же свойство как Enabled Property: <WindowName>.<ControlName>.Enabled [<nItemNumber>] := lEnabledState ? Т.е. запретить редактирование, да и переход тоже на TBROWSE. Или аналогичное свойство ?

Andrey: Нашел метод. Метод Enabled() класса TSBrowse Смотреть здесь (совсем забыл про этот сайт) - http://gustow.narod.ru/tsb_help/50.htm

Andrey: Haz пишет: Она не может не работать , bPostEdit автоматически выполняется после редактирования Проверь вызов , oBrwClr:aColumns[4]:bPostEdit := { || MsgDebug('ДО'), ViewColorTbrws(oBrwClr,4,aVar), MsgDebug('ПОСЛЕ') } Скорее в логике проблема. Посмотрел. Ничего не понял. Пример у тебя есть. Я делаю последовательно в коде: // редактирование 4-колонки и перерисовка цвета после его изменения oBrwClr:aColumns[4]:bPrevEdit := { || ColorPicker(oBrwClr), oBrwClr:Refresh(FALSE), FALSE } oBrwClr:aColumns[4]:bPostEdit := { || MsgDebug("DO"),ViewColorTbrws(oBrwClr,4,aVar),MsgDebug("Posle") } :bPrevEdit - отработало нормально, а :bPostEdit вообще не отрабатывает ! Т.е. я хотел бы чтобы после изменения цвета выполнялась функция перерисовки цвета по таблице. Хотя можно эту функцию засунуит и после oBrwClr:Refresh(FALSE). За что отвечает bPostEdit ?

Haz: Andrey пишет: а :bPostEdit вообще не отрабатывает ! так самого Edit нет же т.к. PrevEdit туда и не пускает возвращая FALSE в этом и есть проблема в логике - выполнение назначается на условие - которое не наступит Andrey пишет: Хотя можно эту функцию засунуит и после oBrwClr:Refresh(FALSE). туда и нужно засунуть Andrey пишет: За что отвечает bPostEdit ? TSCOLUMN.PRG DATA bPrevEdit // Action to be performed before editing cell DATA bPostEdit // Action to be performed after editing cell

Andrey: Haz пишет: так самого Edit нет же т.к. PrevEdit туда и не пускает возвращая FALSE Понял, считал что по другому. Спасибо БОЛЬШОЕ за разъяснение !

Andrey: А как насчет вопроса про растягивание колонок при крупном шрифте (120) ? В программе делаю: oBrwClr:nAdjColumn := 3 // растянуть колонку 3 до заполнения пустоты в бровсе справа oBrw_2:nAdjColumn := 2 // растянуть колонку 2 до заполнения пустоты в бровсе справа

Haz: Andrey пишет: крупном шрифте ( не знаю, не пользую

SergKis: Andrey пишет:А как насчет вопроса про растягивание колонок можно определить из видимых колонок, колонку с max width и для нее устанавливать ширину на +разницу от width окна tsbrowse и суммы других видимых width колонок, используя методы IsColVisible/IsColVis2 (в чем разница не знаю) и SetColSize

Andrey: Andrey пишет: А как насчет вопроса про растягивание колонок при крупном шрифте (120) ? Поборол эту ситуацию ! Сделал свою функцию под это дело и применяю в различных случаях после назначения растяжки: oBrwClr:nAdjColumn := 3 // растянуть колонку 3 до заполнения пустоты в бровсе справа // Если включен БОЛЬШОЙ ШРИФТ, то добавить 170 пикселей для oBrwClr:nAdjColumn MyAdjColumn( oBrwClr, 170 ) oBrw_2:nAdjColumn := 2 // растянуть колонку 2 до заполнения пустоты в бровсе справа // Если включен БОЛЬШОЙ ШРИФТ, то добавить 230 пикселей для oBrw_2:nAdjColumn MyAdjColumn( oBrw_2, 230 ) ////////////////////////////////////////////////////////////////// STATIC PROCEDURE MyAdjColumn( oBrw, nAdd ) LOCAL nWidth, nCell := oBrw:nAdjColumn // включена ли растяжка на колонку IF LargeFonts() .AND. nCell > 0 nWidth := oBrw:GetColSizes()[nCell] oBrw:SetColSize( nCell, nWidth + nAdd ) // новая ширина колонкм ENDIF RETURN

Andrey: Опять облом с этим TSBrowse.... Взял рабочий пример, переделал на новую новую базу и вылет... Даже и не знаю где искать ошибку ? Хотя что-то может и сам намудрил, но в качестве информативности с ошибками TSBrowse заметно уступает терминалке. Вот такая ошибка: Строка ошибки: oBrw:Refresh(.T.) Ставлю перед ошибкой MsgDebug(oBrw:nLen) выдает 0 ! До этого такая ошибка была с наличием БИТОГО индекса, сейчас всё правильно: индекс удаляю, потом заново строю. И где искать ошибку... Как бы сделать проверку перед выводом TSBrowse что все в порядке: поля, индексы, фильтр и т.д.

Andrey: Andrey пишет: И где искать ошибку... Нашёл ошибку. Поставил свою проверку перед oBrw:Refresh(.T.) IF oBrw:nLen == 0 // для отладки, чтобы искать ошибки MsgDebug("Условие отбора TBROWSE == 0 !","DbSetFilter=",DBFILTER()) ELSE //MsgDebug("Условие отбора TBROWSE == ", oBrw:nLen ,"DbSetFilter=",DBFILTER()) ENDIF oBrw:Refresh(.T.)

Andrey: Подскажите пожалуйста, какой параметр отвечает за фон при очистке ?

Andrey: Очень раздражает в новом TBrowse мелькание при перерисовке цвета. В Клипере, да и Харборе были операторы: dispbegin() ..... dispend() Есть ли здесь такие же аналоги ?

Andrey: Как получить координаты TBROWSE в окне для отдельной функции ? PUBLIC oBrw DEFINE TBROWSE oBrw ; AT 20,20 ; WIDTH GetClientWidth(hWnd)-40 ; HEIGHT GetClientHeight(hWnd)-10 ; ..... /////////////////////////////// Function DopWin() MsgDebug( oBrw:nLeft , oBrw:nTop ) Выдает ошибку: Error BASE/1004 Метод не экспортирован: NLEFT Called from NLEFT(0)

Haz: Andrey пишет: Как получить координаты TBROWSE в все правильно , ни чё не перепутал ? Andrey пишет: Function DopWin() MsgDebug( oBrw:nLeft , oBrw:nTop ) можно явно MEMVAR oBrw MsgDebug( oBrw:nLeft , oBrw:nTop ) или через GetProperty( "Form", "oBrw", "nTop" )

Andrey: Haz пишет: все правильно , ни чё не перепутал ? Перепутал. Оказывается, пытаюсь получить координаты еще НЕ НАРИСОВАННОГО (не объявленного) TBROWSE. Моя ошибка. Спасибо !

Dima: Andrey пишет: ( Отправлено: Сегодня 02:00) Перепутал. Ну так в 2 часа ночи спать надо ;)

Andrey: Dima пишет: Ну так в 2 часа ночи спать надо ;) Покой нам только сниться... Все переводом на МиниГуи занимаюсь ! Днем не дают.

Andrey: Вот опять фигня получается. Делаю по разному, один TBROWSE (простой) цвет фона рисует, другой основной нет. Белизна достает, пока меня, но чую если заказчику отдам, то будут меня заказчики просто и сложно доставать. Народ, подскажите как убрать белизну (цвет фона TBROWSE) если таблица не заполнена или записи фильтруются ? Вот как на картинке: Блин http://shot.qip.ru не доступен ....

Dima: Andrey пишет: Народ, подскажите как убрать белизну А Григорий что говорит по этому поводу ?



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