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

Ответов - 181, стр: 1 2 3 4 5 6 7 8 9 10 All

Andrey: Опять старая проблема вылезла, несколько лет назад такое было и не решили как исправить. Глюк показа в левом нижнем углу колонки SELECTOR - при условии что цвет фона ПОДВАЛА последней колонки отличается от основного цвета. Вот так на картинке: Т.е. цвет фона последней колонки ОРАНЖЕВЫЙ и он перескакивает на SELECTOR - кружок (2). Вот код как это происходит: [pre2] // цвета изменить nClrNoDbf := GetSysColor( COLOR_BTNFACE ) oCol := oBrw:GetColumn("ORDKEYNO") oCol:nClrBack := nClrNoDbf // цвет фона шапки таблицы + подвала списка колонок - (1) FOR nI := oBrw:nColumn("ORDKEYNO") TO Len( oBrw:aColumns ) oCol := oBrw:aColumns[ nI ] cCol := oCol:cName cTyp := oCol:cFieldTyp IF cTyp $ "+=^" // Type: [+] [=] [^] oCol:nClrHeadBack := CLR_ORANGE oCol:nClrFootBack := CLR_ORANGE ENDIF NEXT // Левый верхний уголок - (3) исправление фона oBrw:nClrSelectorHdBack := nClrNoDbf [/pre2] Как исправить уголок (2) ? Может можно сделать в коде ТСБ примерно такую переменную ? [pre2] // Левый нижний уголок oBrw:nClrSelectorHdFoot := nClrNoDbf [/pre2]

SergKis: Andrey пишет Как исправить уголок (2) ? Может можно сделать в коде ТСБ примерно такую переменную ? Можно использовать ту же переменную, что и для Header, т.е. сделать такую правку [pre2] METHOD DrawHeaders( lFooters, lDrawCell ) CLASS TSBrowse ... IF ::lFooting .AND. ::lDrawFooters ... If !( nJ == 1 .AND. ::lSelector ) // JP nClrBack := iif( oColumn:nClrFootBack != NIL, oColumn:nClrFootBack, nClrFootBack ) ELSEIF ::nClrSelectorHdBack != NIL nClrBack := ::nClrSelectorHdBack ELSE nClrBack := ATail( ::aColumns ):nClrFootBack ENDIF nClrBack := ::GetValProp( nClrBack, nClrBack, nJ ) [/pre2]

krutoff: SergKis пишет: Желательно, перейти на MODA Сергей, спасибо за такой детальный совет, буду копать у себя. PS: Помогло DO EVENTS. Нет, не помогло. SergKis пишет: А как вы получаете :nCell := 0 ? Нашел ошибку! Да, у меня перед Activate формы с броузом, стоял блок восстанова параметров из INI-файла - там был ноль и тупо присвоило ::nCell := 0 У себя я, конечно, исправил, но, может для присвоения ::nCel сделать метод класса с проверкой?


Andrey: Пытаюсь положить окно в размер ТСБ, не получается... Окно больше и со сдвигом идёт ... Делаю так:[pre2] cForm := oBrw:cParentWnd nRow := GetProperty(cForm, "Row") + GetTitleHeight() + oBrw:nTop nCol := GetProperty(cForm, "Col") + GetBorderWidth() + oBrw:nLeft nH := oBrw:nBottom - oBrw:nTop nW := oBrw:nRight - oBrw:nLeft DEFINE WINDOW Forma_Zero AT nRow, nCol CLIENTAREA nW, nH MODAL NOCAPTION ; BACKCOLOR aBColor ON LOSTFOCUS oWnd:Release() oWnd := ThisWindow.Object[/pre2] Подскажите пожалуйста, где промахнулся...

Haz: Andrey пишет: где промахнулся.. В алгоритме, берешь oBrw:hWnd и по его координатам (getwindowrect() ) рисуешь свое

Andrey: Haz пишет: берешь oBrw:hWnd и по его координатам (getwindowrect() ) рисуешь свое Спасибо БОЛЬШОЕ ! Вот пример. Когда окно по ценру, то окно wZero по таблице закрывается пиксель в пиксель !!! А если окно сдвинуть, то наступает фигня... Может команда нужна типа SET DIALOGBOX CENTER OF PARENT ? Как исправить ? Вот исходник - [pre2]/* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2021 Sergej Kiselev <bilance@bilance.lv> */ #include "hmg.ch" #include "tsbrowse.ch" REQUEST DBFCDX, DBFFPT Function Main() LOCAL cFont := "Arial" LOCAL nSize := 12 LOCAL cForm := "wMain" LOCAL oBrw1, oBrw2, nY, nX, nH, nW, nG, oTsb1, oTsb2 RddSetDefault("DBFCDX") SET OOP ON SET EPOCH TO 2000 SET DATE TO GERMAN SET CENTURY ON SET AUTOPEN OFF SET DELETED OFF SET NAVIGATION EXTENDED SET DEFAULT ICON TO "HMG_ICO" SET FONT TO cFont, nSize USE ( "CUSTOMER" ) ALIAS CUST1 NEW SHARED USE ( "CUSTOMER" ) ALIAS CUST2 NEW SHARED DEFINE WINDOW &cForm TITLE "Demo 2 TBrowse" MAIN TOPMOST ; ON INIT ( This.Topmost := .F. ) ; ON RELEASE ( dbCloseAll() ) This.Maximize nY := nX := nG := 20 nW := This.ClientWidth - nG * 2 nH := Int( This.ClientHeight / 2 ) - nG - nG/2 oTsb1 := oHmgData() oTsb1:lDrawSpecHd := .T. oTsb1:uSelector := .T. @ 0, 5 LABEL Label_1 VALUE "F1-window to table" FONTCOLOR RED SIZE 8 AUTOSIZE TRANSPARENT oBrw1 := _TBrowse( oTsb1, "CUST1", "Brw_1", nY, nX, nW, nH ) ; DO EVENTS nY += nH + 1 + nG nH -= 1 oTsb2 := oHmgData() oTsb2:lDrawSpecHd := .T. oTsb2:uSelector := .T. @ nH + 22, 5 LABEL Label_2 VALUE "F2-window to table" FONTCOLOR RED SIZE 8 AUTOSIZE TRANSPARENT oBrw2 := _TBrowse( oTsb2, "CUST2", "Brw_2", nY, nX, nW, nH ) ; DO EVENTS oBrw1:SetFocus() ; DO EVENTS ON KEY F1 ACTION NIL ON KEY TAB ACTION { |cf| cf := ThisWindow.FocusedControl, ; iif( cf == "Brw_1", This.Brw_2.SetFocus, This.Brw_1.SetFocus ) } ON KEY ESCAPE ACTION ( iif( oBrw1:IsEdit, oBrw1:SetFocus(), ; iif( oBrw2:IsEdit, oBrw2:SetFocus(), ; ThisWindow.Release ) ) ) (This.Object):Event(1, {|ow| myWin(ow, "Brw_1", .F.) }) (This.Object):Event(2, {|ow| myWin(ow, "Brw_2", .T.) }) ON KEY F1 ACTION _wPost(1) ON KEY F2 ACTION _wPost(2) END WINDOW //CENTER WINDOW wMain ACTIVATE WINDOW wMain RETURN NIL FUNCTION myWin(oWnd, cBrw, lHead) Local ob, hb, nY, nX, nW, nH, nRow, nCol SET WINDOW THIS TO oWnd:Name ob := This.&(cBrw).Object hb := ob:hWnd nY := GetWindowRow(hb) nX := GetWindowCol(hb) nW := GetWindowWidth(hb) nH := GetWindowHeight(hb) nRow := iif( oWnd:Row >= 0, oWnd:Row, 0 ) + nY nCol := iif( oWnd:Col >= 0, oWnd:Col, 0 ) + nX IF !Empty(lHead) nRow += ( ob:nHeightHead + 1 + ob:nHeightSpecHd ) // + 1 это линия сверху nH -= ( ob:nHeightHead + 1 + ob:nHeightSpecHd + GetHScrollBarHeight() + 1 ) // и снизу nCol += ( ob:GetColumn("SELECTOR"):nWidth + 1 ) // + 1 это линия слева nW -= ( ob:GetColumn("SELECTOR"):nWidth + 1 + GetVScrollBarWidth() + 1 ) // и справа ENDIF SET DIALOGBOX CENTER OF PARENT DEFINE WINDOW wZero AT nRow, nCol WIDTH nW HEIGHT nH MODAL NOCAPTION NOSIZE BACKCOLOR YELLOW This.Cargo := oHmgData() This.Cargo:oParent := oWnd This.Cargo:cBrw := cBrw This.Cargo:oBrw := ob @ 20, 20 LABEL Label_0 VALUE "ESC - exit" FONTCOLOR RED SIZE 28 AUTOSIZE TRANSPARENT ON KEY F1 ACTION NIL ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW ACTIVATE WINDOW wZero SET WINDOW THIS TO ob:SetFocus() Return Nil[/pre2]

SergKis: Andrey пишет Как исправить ? Вспомнил, что с Игорем сделали недавно метод :GetCellSize(), применил [pre2] FUNCTION myWin(oWnd, cBrw, lHead) Local ob, nY, nX, nW, nH, nRow, nCol, oc1, oc2 SET WINDOW THIS TO oWnd:Name ob := This.&(cBrw).Object oc1 := ob:GetCellSize(1, 1) oc2 := ob:GetCellSize(ob:nRowCount(), 1) nRow := oc1:nRow nRow -= ( ob:nHeightSpecHd + ob:nHeightHead ) nCol := oc1:nCol + 1 nW := GetWindowWidth (ob:hWnd) - 2 nH := GetWindowHeight(ob:hWnd) - 2 DEFINE WINDOW wZero AT nRow, nCol WIDTH nW HEIGHT nH MODAL NOCAPTION NOSIZE BACKCOLOR YELLOW This.Cargo := oHmgData() This.Cargo:oParent := oWnd This.Cargo:cBrw := cBrw This.Cargo:oBrw := ob ON KEY F1 ACTION NIL ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW ACTIVATE WINDOW wZero SET WINDOW THIS TO ob:SetFocus() Return Nil [/pre2]

Haz: SergKis пишет: применил необычное решение

Andrey: Супер !

SergKis: Andrey Обработаем lHead и передадим параметры [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2021 Sergej Kiselev <bilance@bilance.lv> */ #include "hmg.ch" #include "tsbrowse.ch" REQUEST DBFCDX, DBFFPT Function Main() LOCAL cFont := "Arial" LOCAL nSize := 12 LOCAL cForm := "wMain" LOCAL oBrw1, oBrw2, nY, nX, nH, nW, nG, oTsb1, oTsb2 RddSetDefault("DBFCDX") SET OOP ON SET EPOCH TO 2000 SET DATE TO GERMAN SET CENTURY ON SET AUTOPEN OFF SET DELETED OFF SET NAVIGATION EXTENDED SET DEFAULT ICON TO "HMG_ICO" SET FONT TO cFont, nSize USE ( "CUSTOMER" ) ALIAS CUST1 NEW SHARED USE ( "CUSTOMER" ) ALIAS CUST2 NEW SHARED DEFINE WINDOW &cForm TITLE "Demo 2 TBrowse" MAIN TOPMOST ; ON INIT ( This.Topmost := .F. ) ; ON RELEASE ( dbCloseAll() ) This.Maximize nY := nX := nG := 20 nW := This.ClientWidth - nG * 2 nH := Int( This.ClientHeight / 2 ) - nG - nG/2 oTsb1 := oHmgData() oTsb1:lDrawSpecHd := .T. oTsb1:uSelector := .T. oTsb1:nBrw := 1 @ 0, 5 LABEL Label_1 VALUE "F1-window to table" FONTCOLOR RED SIZE 8 AUTOSIZE TRANSPARENT oBrw1 := _TBrowse( oTsb1, "CUST1", "Brw_1", nY, nX, nW, nH ) ; DO EVENTS nY += nH + 1 + nG nH -= 1 oTsb2 := oHmgData() oTsb2:lDrawSpecHd := .T. oTsb2:uSelector := .T. oTsb2:nBrw := 2 @ nH + 22, 5 LABEL Label_2 VALUE "F2-window to table" FONTCOLOR RED SIZE 8 AUTOSIZE TRANSPARENT oBrw2 := _TBrowse( oTsb2, "CUST2", "Brw_2", nY, nX, nW, nH ) ; DO EVENTS oBrw1:SetFocus() ; DO EVENTS ON KEY F1 ACTION NIL ON KEY TAB ACTION { |cf| cf := ThisWindow.FocusedControl, ; iif( cf == "Brw_1", This.Brw_2.SetFocus, This.Brw_1.SetFocus ) } ON KEY ESCAPE ACTION ( iif( oBrw1:IsEdit, oBrw1:SetFocus(), ; iif( oBrw2:IsEdit, oBrw2:SetFocus(), ; ThisWindow.Release ) ) ) (This.Object):Event(1, {|ow| myWin(ow, "Brw_1", .F.) }) (This.Object):Event(2, {|ow| myWin(ow, "Brw_2", .T.) }) ON KEY F1 ACTION _wPost(1) ON KEY F2 ACTION _wPost(2) END WINDOW //CENTER WINDOW wMain ACTIVATE WINDOW wMain RETURN NIL FUNCTION myWin( oWnd, cBrw, lHead ) Local oBrw, nBrw, nY, nX, nW, nH, nRow, nCol, oTsb, oc1, oc2, nw1 SET WINDOW THIS TO oWnd:Name oBrw := This.&(cBrw).Object oTsb := oBrw:Cargo:oParam // parameters oTsb1 or oTsb2 nBrw := oTsb:nBrw oc1 := oBrw:GetCellSize(1, 1) oc2 := oBrw:GetCellSize( oBrw:nRowCount(), 1 ) nw1 := oBrw:GetColumn( "SELECTOR" ):nWidth nRow := oc1:nRow nCol := oc1:nCol + 1 nW := GetWindowWidth ( oBrw:hWnd ) - 2 nH := GetWindowHeight( oBrw:hWnd ) - 2 IF Empty( lHead ) nRow -= ( oBrw:nHeightSpecHd + oBrw:nHeightHead ) nRow += 1 nCol += 1 nW -= 1 ELSE nCol += nw1 nRow += 1 nCol += 1 nW -= ( nw1 + GetVScrollBarWidth() + 1 ) nH -= ( oBrw:nHeightHead + oBrw:nHeightSpecHd + GetHScrollBarHeight() + 1 ) ENDIF DEFINE WINDOW wZero AT nRow, nCol WIDTH nW HEIGHT nH MODAL NOCAPTION NOSIZE BACKCOLOR YELLOW This.Cargo := oHmgData() This.Cargo:oParent := oWnd This.Cargo:cBrw := cBrw This.Cargo:oBrw := oBrw This.Cargo:nBrw := nBrw This.Cargo:oTsb := oTsb ON KEY F1 ACTION NIL ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW ACTIVATE WINDOW wZero SET WINDOW THIS TO oBrw:SetFocus() RETURN Nil [/pre2]

Andrey: Непонятка возникла по ТСБ. Ставлю отключение вывода суперхидера/шапки/нумератора/подвала [pre2]oBrw:lDrawHeaders := .F.[/pre2] Всё скрывается, отлично но: (1) теряется формат полей "T=@" (2) размеры ТСБ уменьшаются снизу Вот картинка: И ещё один вопрос. Как мне можно оставить Нумератор и Подвал в ТСБ ? Или только отдельно Подвал ? Или только отдельно Нумератор ?

krutoff: Никто не копировал объект OBRW TSBrowse? Я сформировал TSBrowse на одной форме со всеми картинками, блоками кода и т.д. и хотел бы скопировать(клонировать) этот объект на другую форму, это возможно?

SergKis: krutoff пишет Я сформировал TSBrowse на одной форме со всеми картинками, блоками кода и т.д. и хотел бы скопировать(клонировать) этот объект на другую форму, это возможно? Чисто технически копировать можно, но колонки это объекты и в скопированном варианте будут ссылки на одни и те же колонки, при lEdit := .T. каждый тсб будет создавать каждый свои :oEdit, хорошо это или плохо, хз. Делал копирование колонок[pre2] aColOld := {} FOR EACH oCol IN oBrw:aColumns AADD( aColOld, oCol:Clone() ) NEXT [/pre2] менял колонки в oBrw:aColumns (добавлял переменные в oCol) и потом восстанавливал обратно из aColOld. Можно создать новый DEFINE TBROWSE ... и методом oBrw:AddColumn( oCol ) перегнать туда массив aColOld, но надо помнить, что в колонках в :bData, через FieldWBlock("FieldName", select(oBrw:cAlias)), заложена область dbf файла. Можно создать базу колонок и потом исп. ее для создания разных тсб (алиас для тсб задается). Примеры: app_oopcolumns и app_ooptsbbox Если исп. _TBrowse(...) с oTsb := oHmgData() ... параметрами, то для др. разных тсб можно использовать параметры настройки одного объекта oTsb, возможно, это неплохой вариант.

SergKis: Пример из серии Crazy https://TransFiles.ru/w6x7n Возможно будет кому то интересен.

alex_II: Имеется код: DEFINE TBROWSE Br_sch AT h_tlbar,0 ALIAS 'sch' WIDTH w_br HEIGHT h_br BOLD CELLED ... ADD COLUMN TO Br_sch HEADER 'Ввод в'+CRLF+'работу' SIZE w_dtv ; DATA FieldWBlock('dtuse', Select('sch')) ; ALIGN DT_CENTER, DT_CENTER ; PREEDIT {|uVar| oldVal := uVar, IF(Status = 1, .T., .F.)} ; POSTEDIT {|uVar| postMod(uVar,'введен'), Br_sch:DrawSelect()} ; EDITABLE ... Пользователи недовольны тем, как приходится набирать дату, процесс получается довольно протяженный пока выберешь год, потом месяц и наконец дату. В примере d:\MiniGUI\SAMPLES\Advanced\Tsb_Basic дата вводится простыми цифрами, но как это сделать в моём случае я так и не сообразил. Помогите люди добрые.

Dima: у меня так примерно oBrw3:SetColSize("data_c", 85 ) oBrw3:GetColumn("data_c"):cHeading :="Дата"+CRLF+"создания" oBrw3:GetColumn("data_c"):cPicture :="@D" oBrw3:GetColumn( "data_c"):lEdit := kaka("master") obrw3:GetColumn("data_c"):bPrevEdit := { |a, b, lLock| SetGetAdjustBrw(b,{2,0,-2,-3}) , If( lLock := (b:cAlias)->(RLock()), (b:cAlias)->(dbUnLock()), Msgstop("Запись заблокирована","Внимание")), lLock } oBrw3:GetColumn("data_c"):nAlign:=DT_CENTER oBrw3:lPickerMode := .F.

alex_II: Dima пишет: oBrw3:lPickerMode := .F. Спасибо, помогла данная установка.

alex_II: Наткнулся на непонятную ситуацию DEFINE TBROWSE ... ... ADD COLUMN TO Br_sch HEADER '' SIZE w_lod ; DATA FieldWBlock('lm1', Select('sch')) ; CHECKBOX ; PREEDIT {|| preMod('lm1')} ; EDITABLE ... У меня редактирование логического поля происходит по уcловию из preMod. Всё работает, когда используется клавиатура, но когда используется мышь то двойной клик по полю хоть и вызывает выполнение функции preMod, её возврат не анализируется и поле lm1 всегда меняет своё значение на противоположное. Такое впечатление, что двойной клик мышью вызывает сначала безусловное редактирование логического поля, а потом обработку из PREEDIT.

SergKis: alex_II пишет PREEDIT {|| preMod('lm1')} Что возвращает эта конструкция и какие значения имеют oCol:lCheckBoxNoReturn .OR. ::lCheckBoxAllReturn ? То о чем спрашиваете тут (метод :Edit(...))[pre2] ... IF oCol:bPrevEdit != NIL IF ::lIsArr .AND. ( ::lAppendMode .OR. ::nAt > Len( ::aArray ) ) // append mode for arrays ELSEIF nKey != VK_RETURN // GF 15-10-2015 uVar := Eval( oCol:bPrevEdit, uValue, Self, nCell, oCol ) IF ValType( uVar ) == "A" uVar := uVar[ 1 ] uValue := uVar[ 2 ] ENDIF IF ValType( uVar ) == "L" .AND. ! uVar nKey := VK_RETURN ENDIF ENDIF ENDIF ::FastDrawClear( hb_ntos( ::nAtPos ) + "." + hb_ntos( oCol:nId ) ) cMsg := iif( ValType( cMsg ) == "B", Eval( cMsg, Self, nCell ), cMsg ) IF cType == "L" .AND. oCol:lCheckBox IF nKey != VK_RETURN .OR. ! oCol:lCheckBoxNoReturn .OR. ::lCheckBoxAllReturn IF Upper( Chr( nKey ) ) $ "YCST1" ::lChanged := ( uVar == .F. ) uVar := .T. ELSEIF Upper( Chr( nKey ) ) $ "FN0" ::lChanged := ( uVar == .T. ) uVar := .F. ELSEIF nKey == VK_SPACE .OR. nKey == VK_RETURN uVar := ! uValue ::lChanged := .T. ELSE RETURN 0 ENDIF ::lHasChanged := iif( ::lChanged, .T., ::lHasChanged ) ::oWnd:nLastKey := VK_RETURN ::PostEdit( uVar, nCell ) ::lPostEdit := .F. RETURN 0 ELSE ::lPostEdit := .T. ::lChanged := .F. ::oWnd:nLastKey := nKey ::PostEdit( uValue, nCell ) ::lPostEdit := .F. RETURN 0 ENDIF ENDIF [/pre2]

alex_II: PREEDIT возвращает .F. oCol:lCheckBoxNoReturn = .T. ::lCheckBoxAllReturn = .T.



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