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

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

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

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

Andrey: Спасибо Дима ! Чудо свершилось, чуток переделал и горизонтальный скролинг пропал, а вертикальный стал нормально показываться: [pre2]SetProperty(oBrwX:cParentWnd, oBrwX:cControlName, "Enabled", .F.) oBrwX:bChange := {|| oBrwX:oHScroll:SetRange( 0, 0 ) } oBrwX:Reset() oBrwX:Refresh(.T.) oBrwX:Upstable() SetProperty(oBrwX:cParentWnd, oBrwX:cControlName, "Enabled", .T.) oBrwX:Setfocus() [/pre2]

Vlad04: Есть основная база, к примеру, MIBLP.dbf. Есть вторая база - INFEKZII.dbf, это источник данных Пример, заготовка здесь - TsBrows И COMBOBOX Хотелось , бы 1) чтобы в TsBrows в поля 'KRANK1','KRANK2','KRANK3' был подключены COMBOBOX и можно было бы производить выбор данных из второй базы (подобное возможно, но примеры которые есть сильно перегружены лишней информацией) 2)в Combo_1, который на поле формы отображалось значение , к примеру поля 'KRANK1' базы MIBLP.dbf. Но в то же время была-бы возможность изменить данные выбором из сомбо

SergKis: Vlad04 пишет Хотелось , бы Тут вариант http://my-files.ru/q9hcvw

Vlad04: Не просто.Если программа большая, запутаться легко. Почему-то в Browse в подстановке в поле базы данных из массива через комбобох нет особых проблем.

SergKis: Vlad04 Может так проще http://my-files.ru/ltps9w

SergKis: Vlad04 Т.к. TBROWSE_1 private, может быть public, то упростить можно еще так[pre2] FUNC Combo_Enter() Local cForm := ThisWindow.Name Local cComb := This.Name Local oBrw := TBROWSE_1 // Local cBrw := "TBROWSE_1" // Local oBrw := _HMG_aControlIds[ GetControlIndex(cBrw, cForm) ] Local oCol := oBrw:GetColumn[cComb] Local nVal, cVal nVal := This.&(cComb).Value cVal := This.&(cComb).Item(nVal) Eval(oCol:bPostEdit, cVal, oBrw) oBrw:SetFocus() RETURN NIL [/pre2] и в блоках кода вместо obr использовать TBROWSE_1 Я не исп. Public\Private потому использую параметры блоков кода

SergKis: Vlad04 подправил, с учетом уст. курсора тсб на любой колонке и модификация инф. из combobox [pre2] FUNC TBrowse_1_Sets() ... :GetColumn('KRANK3'):bPostEdit := bPost :GoPos(1, 1) :SetFocus() END WITH ... FUNC Combo_Enter() Local cForm := ThisWindow.Name Local cComb := This.Name Local oBrw := TBROWSE_1 Local oCol := oBrw:GetColumn(cComb) Local nVal, cVal nVal := This.&(cComb).Value cVal := This.&(cComb).Item(nVal) (oBrw:cAlias)->( FieldPut(FieldPos(cComb), cVal) ) oBrw:SetFocus() RETURN NIL [/pre2]

Vlad04: SergKis Спасибо Пока остановился на таком варианте: По горячей клавише или Клику открывается вспомогательная форма, там редактирую и т.д. И все таки , почему же в Browse проще?

SergKis: Vlad04 пишет И все таки , почему же в Browse проще? Обманчивая видимость простоты. Мои клиенты категорически отказались работать с InplaceEdit, т.к. оно реализовано на модальном окне и мелькание фокуса с бровсе на ячейку - глаз\нервы не держат. Выделение на мод. окно объекта коректировки, позволяет разделить сообщения управления бровсе и контрола коректировки. Вот кусочек текста.[pre2] DEFINE WINDOW _InPlaceEdit ; AT This.CellRow + GridRow - _HMG_aControlRow [ i ] - 1 , This.CellCol + GridCol - _HMG_aControlCol [ i ] + 2 ; WIDTH This.CellWidth ; HEIGHT This.CellHeight + 6 + Ldelta ; MODAL ; NOCAPTION ; NOSIZE ON KEY CONTROL + U ACTION iif( _IsWindowActive( '_InPlaceEdit' ), ; _InPlaceEdit.Control_1.Value := iif( ControlType == 'L', iif ( CellData , 1 , 2 ), CellData ), NIL ) ON KEY RETURN ACTION iif( _IsWindowActive( '_InPlaceEdit' ), ; _InPlaceEditOk ( i , _InPlaceEdit.Control_1.Value , aValid , CellColIndex , ; sFieldName , _GridWorkArea , aValidMessages , lock , ControlType , aInputItems ), NIL ) ON KEY ESCAPE ACTION ( _HMG_IPE_CANCELLED := .T. , iif( lock == .T. , dbUnlock(), NIL ) , ; iif( _IsWindowActive( '_InPlaceEdit' ), _InPlaceEdit.Release, NIL ) ) IF lInputItems == .T. // Fill Items Array AEval( aInputItems [ CellColIndex ] , { |p| AAdd ( aItems , p [1] ) } ) // Fill Values Array AEval( aInputItems [ CellColIndex ] , { |p| AAdd ( aValues , p [2] ) } ) r := AScan ( aValues , CellData ) DEFINE COMBOBOX Control_1 ROW 0 COL 0 ITEMS aItems WIDTH This.CellWidth VALUE iif ( Empty( r ) , 1 , r ) FONTNAME _hmg_aControlFontName [ i ] FONTSIZE _hmg_aControlFontSize [ i ] ON LISTDISPLAY Eval( bOnDisplay ) ON LISTCLOSE Eval( bOnCloseUp ) END COMBOBOX [/pre2] В тсб все управление сообщениями таблицы и контрола edit заложено в объект блоками кода. Думаю, немного попривыкнув\изучив, сложности не будет в понимании.

SergKis: Vlad04 По поводу краткости записи. Пример тот же [pre2] #include <minigui.ch> #include "tsbrowse.ch" REQUEST DBFCDX , DBFFPT REQUEST HB_CODEPAGE_RU866 REQUEST HB_CODEPAGE_RU1251 FUNCTION Main Local nArea, oBrw Local aKRANK1 := {}, aKRANK2 := {}, aKRANK3 := {} hb_SetCodepage("RU1251") SET DELETED ON SET DATE BRITISH SET CENTURY ON SET EPOCH TO 1925 SET BROWSESYNC ON PRIVATE TBROWSE_1 USE INFEKZII Via "DBFCDX" NEW CODEPAGE 'RU866' nArea := select() dbEval({|| aAdd(aKRANK1, (nArea)->NAME), ; aAdd(aKRANK2, (nArea)->NAME), ; aAdd(aKRANK3, (nArea)->NAME) }) GO TOP USE MIBLP Via "DBFCDX" NEW CODEPAGE 'RU866' DEFINE WINDOW FrmGL AT 0, 0 WIDTH 650 HEIGHT 578 MAIN DEFINE TBROWSE TBROWSE_1 AT 30, 10 ; WIDTH This.ClientWidth - 10 * 2 ; HEIGHT This.ClientHeight - 30 * 2 ; COLSIZES 50,130,130,130,130,130 ; WORKAREA 'MIBLP' ; CELL ; COLUMNS 'CODE','MIBP','KRANK1','KRANK2','KRANK3' :LoadFields(.T.) // Edit :nClrLine := COLOR_GRID :nWheelLines := 1 :SetColor( { CLR_FOCUSB }, { { |nAt,nNr,oBr| nAt := Nil, ; If( oBr:nCell == nNr, RGB(166, 202, 240), RGB(220, 220, 220) ) } } ) AEval( :aColumns, {|oCol| oCol:lFixLite := .T., ; oCol:lOnGotFocusSelect := .T.} ) // :GetColumn("CODE"):lEdit := .F. :SetData('KRANK1', , aKRANK1) :SetData('KRANK2', , aKRANK2) :SetData('KRANK3', , aKRANK3) END TBROWSE END WINDOW FrmGL.Center FrmGL.Activate RETURN( NIL ) [/pre2]

Andrey: SergKis пишет: :SetData('KRANK1', , aKRANK1) Что за параметр :SetData() ?

Петр: Andrey пишет: Что за параметр :SetData() ? SetData это метод - функция с 3-мя параметрами Это мило и симпатично, но тоже самое можно решить и др. способами. На любителя ООП (их тут мало с МиниГуи работающих)

SergKis: Петр :GetColumn('KRANK1'):aItems := aKRANK1 :GetColumn('KRANK1'):lComboBox := .T.

Vlad04: SergKis По поводу краткости записи Да уж, на счет краткости слов нет. 1) Почему-то периодически вылетает программа (ваша редакция) с ошибкой - Выход за границы массива. Связь не уловил. 2) Перенес код с тестовой в настоящую программу. Комбобокс создается , но почему-то на первом слева поле, где его не должно быть

Vlad04: Колонки я добавляю так ... ADD COLUMN TO Brw_1 DATA FieldWBlock(.. ...

gfilatov2002: Vlad04 пишет: Почему-то периодически вылетает программа (ваша редакция) с ошибкой Проверь эту строку в примере COLSIZES 50,130,130,130,130,130 TBROWSE имеет 5 колонок, а размеры установлены для шести колонок Отсюда имеем вылет в методе :nAtColl() P.S. Поправил эту бяку в исходнике библиотеки TsBrowse, теперь не вылетает

Vlad04: gfilatov2002 теперь не вылетает Да, всё нормально. А что же определяет привязку комбобокса к колонкам ?

SergKis: Vlad04 пишет А что же определяет привязку комбобокса к колонкам ? :SetData( nColumn, bData, aList ) nColumn (номер колонки) может быть задано симв. именем колонки из ADD .... NAME ... :GetColumn(5):cName := "..." :LoadFields(.T.\.F.) ставит :cName от имени поля

Vlad04: SergKis Все хорошо. Если указываешь НОМЕР колонки - происходит правильная привязка комбобокса .

Vlad04: TsBrowse и дизайнер Работа с компонентами оказывается отличается, если форму вы построили в дизайнере или описали в программном коде. Это возможно связано с видимостью переменных. Вот пример построения TsBrowse в IDE, который идет в поставке MiniGui. Добавим на форму компоненты, связанные с TsBrowse (вполне обычная ситуация) [url=https://cloud.mail.ru/public/4taw/Yc13QvLBM]TsBrowseTsBrowse[/url] Компилируется без ошибок, но при запуске не работает



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