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

gfilatov2002: SergKis пишет: там убрать над лишнее Почистил также и другие неиспользуемые переменные, и добавил в заголовке следующие строки для подавления ненужных предупреждений [pre2] FIELD KODS, NAME, ID MEMVAR oBrw, aResult [/pre2]

SergKis: gfilatov2002

SergKis: gfilatov2002 Может в пример добавить использование функции ShowGetValid(...) (сообщение в getbox valid об ошибке) ? Изменения такие [pre2] STATIC FUNC VldNewRec() ... If lSek Tone(500, 1) ShowGetValid(GetControlHandle(cGkd, cWnd), "Kod dublicate", "Error", 'E') // можно 'E'\'I'\'W' InkeyGui(4000) _SetValue(cGkd, cWnd, GetNewKod()) _SetFocus(cGkd, cWnd) ... и добавить #pragma BEGINDUMP #define _WIN32_WINNT 0x0600 #include <windows.h> #include "hbapi.h" #include "hbapicdp.h" #include <commctrl.h> typedef struct _tagEDITBALLOONTIP { DWORD cbStruct; LPCWSTR pszTitle; LPCWSTR pszText; INT ttiIcon; // From TTI_* } EDITBALLOONTIP, *PEDITBALLOONTIP; #define EM_SHOWBALLOONTIP (ECM_FIRST + 3) // Show a balloon tip associated to the edit control #define Edit_ShowBalloonTip(hwnd, peditballoontip) \ (BOOL)SNDMSG((hwnd), EM_SHOWBALLOONTIP, 0, (LPARAM)(peditballoontip)) #define EM_HIDEBALLOONTIP (ECM_FIRST + 4) // Hide any balloon tip associated with the edit control #define Edit_HideBalloonTip(hwnd) \ (BOOL)SNDMSG((hwnd), EM_HIDEBALLOONTIP, 0, 0) // ToolTip Icons (Set with TTM_SETTITLE) #define TTI_NONE 0 #define TTI_INFO 1 #define TTI_WARNING 2 #define TTI_ERROR 3 #if (_WIN32_WINNT >= 0x0600) #define TTI_INFO_LARGE 4 #define TTI_WARNING_LARGE 5 #define TTI_ERROR_LARGE 6 #endif // (_WIN32_WINNT >= 0x0600) #define ECM_FIRST 0x1500 // Edit control messages /* ShowGetValid( hWnd, cText [ , cTitul ] [ , cTypeIcon ] ) */ #if ( HB_VER_MAJOR == 3 ) #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, ch) #else #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, fCtrl, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, fCtrl, ch) #endif HB_FUNC( SHOWGETVALID ) { int i,k; char *tp, *s; WCHAR Text[512]; WCHAR Title[512]; EDITBALLOONTIP bl; PHB_CODEPAGE s_cdpHost = hb_vmCDP(); HWND hWnd = ( HWND ) hb_parnl( 1 ); if( ! IsWindow( hWnd ) ) return; bl.cbStruct = sizeof( EDITBALLOONTIP ); bl.pszTitle = NULL; bl.pszText = NULL; bl.ttiIcon = TTI_NONE; if( HB_ISCHAR( 2 ) ){ ZeroMemory( Text, sizeof(Text) ); k = hb_parclen(2); s = (unsigned char *) hb_parc(2); for(i=0;i<k;i++) Text = _hb_cdpGetU16( s_cdpHost, TRUE, s ); bl.pszText = Text; } if( HB_ISCHAR( 3 ) ){ ZeroMemory( Title, sizeof(Title) ); k = hb_parclen(3); s = (unsigned char *) hb_parc(3); for(i=0;i<k;i++) Title = _hb_cdpGetU16( s_cdpHost, TRUE, s ); bl.pszTitle = Title; } tp = ( char * ) hb_parc(4); switch( *tp ){ case 'E' : bl.ttiIcon = TTI_ERROR_LARGE; break; case 'e' : bl.ttiIcon = TTI_ERROR; break; case 'I' : bl.ttiIcon = TTI_INFO_LARGE; break; case 'i' : bl.ttiIcon = TTI_INFO; break; case 'W' : bl.ttiIcon = TTI_WARNING_LARGE; break; case 'w' : bl.ttiIcon = TTI_WARNING; break; } Edit_ShowBalloonTip( hWnd, &bl ); } #pragma ENDDUMP [/pre2]

SergKis: PS опять пропустил [ i ]. повтор [pre2] #pragma BEGINDUMP #define _WIN32_WINNT 0x0600 #include <windows.h> #include "hbapi.h" #include "hbapicdp.h" #include <commctrl.h> typedef struct _tagEDITBALLOONTIP { DWORD cbStruct; LPCWSTR pszTitle; LPCWSTR pszText; INT ttiIcon; // From TTI_* } EDITBALLOONTIP, *PEDITBALLOONTIP; #define EM_SHOWBALLOONTIP (ECM_FIRST + 3) // Show a balloon tip associated to the edit control #define Edit_ShowBalloonTip(hwnd, peditballoontip) \ (BOOL)SNDMSG((hwnd), EM_SHOWBALLOONTIP, 0, (LPARAM)(peditballoontip)) #define EM_HIDEBALLOONTIP (ECM_FIRST + 4) // Hide any balloon tip associated with the edit control #define Edit_HideBalloonTip(hwnd) \ (BOOL)SNDMSG((hwnd), EM_HIDEBALLOONTIP, 0, 0) // ToolTip Icons (Set with TTM_SETTITLE) #define TTI_NONE 0 #define TTI_INFO 1 #define TTI_WARNING 2 #define TTI_ERROR 3 #if (_WIN32_WINNT >= 0x0600) #define TTI_INFO_LARGE 4 #define TTI_WARNING_LARGE 5 #define TTI_ERROR_LARGE 6 #endif // (_WIN32_WINNT >= 0x0600) #define ECM_FIRST 0x1500 // Edit control messages /* ShowGetValid( hWnd, cText [ , cTitul ] [ , cTypeIcon ] ) */ #if ( HB_VER_MAJOR == 3 ) #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, ch) #else #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, fCtrl, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, fCtrl, ch) #endif HB_FUNC( SHOWGETVALID ) { int i,k; char *tp, *s; WCHAR Text[512]; WCHAR Title[512]; EDITBALLOONTIP bl; PHB_CODEPAGE s_cdpHost = hb_vmCDP(); HWND hWnd = ( HWND ) hb_parnl( 1 ); if( ! IsWindow( hWnd ) ) return; bl.cbStruct = sizeof( EDITBALLOONTIP ); bl.pszTitle = NULL; bl.pszText = NULL; bl.ttiIcon = TTI_NONE; if( HB_ISCHAR( 2 ) ){ ZeroMemory( Text, sizeof(Text) ); k = hb_parclen(2); s = (unsigned char *) hb_parc(2); for(i=0;i<k;i++) Text[ i ] = _hb_cdpGetU16( s_cdpHost, TRUE, s[ i ] ); bl.pszText = Text; } if( HB_ISCHAR( 3 ) ){ ZeroMemory( Title, sizeof(Title) ); k = hb_parclen(3); s = (unsigned char *) hb_parc(3); for(i=0;i<k;i++) Title[ i ] = _hb_cdpGetU16( s_cdpHost, TRUE, s[ i ] ); bl.pszTitle = Title; } tp = ( char * ) hb_parc(4); switch( *tp ){ case 'E' : bl.ttiIcon = TTI_ERROR_LARGE; break; case 'e' : bl.ttiIcon = TTI_ERROR; break; case 'I' : bl.ttiIcon = TTI_INFO_LARGE; break; case 'i' : bl.ttiIcon = TTI_INFO; break; case 'W' : bl.ttiIcon = TTI_WARNING_LARGE; break; case 'w' : bl.ttiIcon = TTI_WARNING; break; } Edit_ShowBalloonTip( hWnd, &bl ); } #pragma ENDDUMP [/pre2]

gfilatov2002: SergKis пишет: Может в пример добавить использование функции ShowGetValid Благодарю за Ваши усилия, но, думаю, что в данном случае нет необходимости в усложнении этого примера Кстати, эта функция уже использовалась в одном из примеров, которые прислал Андрей: - в папке Basic\COMM_2

Haz: SergKis пишет: GotoRec работатет нормально в тек. версии, немного не привычно - выталкивает первую строку экрана (привычнее последнюю) Сергей, посмотрел исходнички и вот чего увидел: GotoRec ничего не знает о том что сделали с базой ( добавили запись , фильтранули или просто скипнули куда то и пр)., соответственно проблематично отследить что на рабочем поле бровса появилать новая запись и выталкивать нужно вниз от новой записи. Можно сохранить тот же ::RowPos т.к. он известен достоверно, но корректно сохранить первую строку я не придумал как. Пример ( база отсортирована по отображаемому полю): в базе есть пять значений C текущее , в бровсе 4 строки ( видим с A до D ) ----- A B C <- D ----- E Добавили значение C1 через dbAppend и оно стало текущей записью вместо С и встало после С Если сделать у С1 ::RowPos = 3 то вытолкнем А вверх за пределы бровса и проанализировать то нечего т.к. в данном случае мы знаем только 1) номер записи текущей после добавления 2) номер записи С как ::nLastPos но не знаем какая была первой (если анализировать сверху ) или последней (если снизу) в бровсе, чтобы понять куда и что вытолкнуть , не заем сколько записей добавили или удали. Все что можно сделать в GoToRec так это на выбор 1) Сохранить ::nRowPos 2) Сделать его = 1 2) Сделать его = ::nRowCount() PS я бы предпочел вариант 1 и новый метод ::AddRec() который добавляет запись и правильно ее позиционирует с учетом установок до добавления. И то при совместной работе возможны сюрпризы типа ... рассчитал нужный RowPos , а тебя опередил кто то и впихнул пачку записей

SergKis: gfilatov2002 пишет эта функция уже использовалась в одном из примеров, которые прислал Андрей По тому примеру не очень ясно основное назначение функции - работа в valid GetBox-ов. Но если усложняет, то тогда не надо.

SergKis: Haz пишет возможны сюрпризы типа ... рассчитал нужный RowPos , а тебя опередил кто то и впихнул пачку записей Игорь, в тек. версии миниГуи GotoRec работает приемлемо и действительно управляется через установку nRowPos до GotoRec. Просто в моей версии тсб 7.0 в базе и доводка мной до приближения к тсб 9.0. Получается при всей похожести кода есть разница, но это уже моя головная боль. GotoRec у себя уже подправил и управление через nRowPos тоже работает, может, в некоторых случаях, не так как в тсб 9.0, но похоже. Спасибо за участие.

SergKis: Для информации. В представленном выше примере, после добавления записи для включения Edit на след. колонке надо сделать :[pre2] If ! empty(aResult) dbSelectArea(cAls) dbAppend() If ! NetErr() .and. RLock() nRec := RecNo() REPL KODS with aResult[1], ; NAME with aResult[2] if oBrw:nLen == oBrw:nRowCount() oBrw:oHScroll:SetRange(0,0) EndIf oBrw:GotoRec(nRec) nCol := oBrw:nColumn("NAM") If nCol != oBrw:nCell oBrw:nCell := nCol oBrw:DrawSelect() EndIf oBrw:lChanged := .T. oBrw:PostEdit(aResult[2], nCol, Nil ) DO EVENTS oBrw:PostMsg(WM_KEYDOWN, VK_F4, 0) EndIf EndIf [/pre2]

SergKis: Сделал Tsb_addrecord_3 с удалением F3. [pre2] /* * MINIGUI - Harbour Win32 GUI library Demo * */ #include "minigui.ch" #include "tsbrowse.ch" REQUEST DBFCDX FIELD KODS, NAME, ID MEMVAR oBrw, aResult *----------------------------------- PROCEDURE Main() *----------------------------------- LOCAL i, oCol, aStru, cAls, cBrw LOCAL cFile := "datab" RddSetDefault("DBFCDX") SET CENTURY ON SET DATE GERMAN SET DELETED ON SET EXCLUSIVE ON SET EPOCH TO 2000 SET AUTOPEN ON SET EXACT ON SET SOFTSEEK ON SET NAVIGATION EXTENDED SET FONT TO "Arial", 11 aStru := { ; { "KODS", "C", 10, 0 }, ; { "NAME", "C", 15, 0 }, ; { "EDIZ", "C", 10, 0 }, ; { "KOLV", "N", 15, 3 }, ; { "CENA", "N", 15, 3 }, ; { "ID" , "+", 4, 0 } ; } IF ! hb_FileExists( cFile + ".dbf" ) dbCreate( cFile, aStru ) ENDIF USE datab ALIAS base NEW IF LastRec() == 0 FOR i := 10 TO 1 STEP -1 APPEND BLANK REPLACE KODS WITH hb_ntos(i), ; NAME WITH RandStr(15), ; EDIZ WITH 'kg', ; KOLV WITH RecNo() * 1.5, ; CENA WITH RecNo() * 2.5 NEXT ENDIF dbGoTop() IF ! hb_FileExists( cFile + IndexExt() ) INDEX ON TR0(KODS) TAG KOD FOR ! deleted() INDEX ON UPPER(NAME) TAG NAM FOR ! deleted() INDEX ON ID TAG FRE FOR deleted() EndIf OrdSetFocus("NAM") dbGoTop() cALs := Alias() GO TOP DEFINE FONT FontBold FONTNAME _HMG_DefaultFontName ; SIZE _HMG_DefaultFontSize BOLD // Default for TsBrowse PRIVATE oBrw DEFINE WINDOW win_1 AT 0, 0 WIDTH 650 HEIGHT 500 ; MAIN TITLE "TSBrowse Add Record Demo" ; NOMAXIMIZE NOSIZE ; ON INIT NIL ; ON RELEASE dbCloseAll() DEFINE TBROWSE oBrw AT 40, 10 ALIAS cAls WIDTH 620 HEIGHT 418 CELL WITH OBJECT oBrw cBrw := :cControlName :hFontHead := GetFontHandle( "FontBold" ) :hFontFoot := :hFontHead :lCellBrw := .T. :aColSel := { "KODS", "NAME", "KOLV", "CENA", "ID" } :LoadFields(.T.) :SetColor( { 6 }, { { |a,b,c| If( c:nCell == b, {Rgb( 66, 255, 236), Rgb(209, 227, 248)}, ; {Rgb(220, 220, 220), Rgb(220, 220, 220)} ) } } ) oCol := :GetColumn('KODS') oCol:lEdit := .F. oCol:cHeading := "Product"+CRLF+"code" oCol:cOrder := "KOD" oCol:lNoDescend := .T. oCol:nAlign := 1 oCol:nFAlign := 1 oCol:cFooting := {|nc| nc := (oBrw:cAlias)->( OrdKeyNo() ), ; iif( empty(nc), '', '#'+hb_ntos(nc) ) } oCol := :GetColumn('NAME') oCol:cHeading := "Denomination" oCol:cOrder := "NAM" oCol:nWidth := 190 oCol:lNoDescend := .T. oCol:lOnGotFocusSelect := .T. oCol:lEmptyValToChar := .T. oCol:bPrevEdit := { |val,brw| Prev(val,brw) } oCol:bPostEdit := { |val,brw| Post(val,brw) } oCol := :GetColumn('KOLV') oCol:cHeading := "Amount" oCol:lOnGotFocusSelect := .T. oCol:lEmptyValToChar := .T. oCol:bPrevEdit := { |val,brw | Prev(val,brw ) } oCol:bPostEdit := { |val,brw,add| Post(val,brw,add) } oCol := :GetColumn('CENA') oCol:cHeading := "Price"+CRLF+"for unit" oCol:lOnGotFocusSelect := .T. oCol:lEmptyValToChar := .T. oCol:bPrevEdit := { |val,brw | Prev(val,brw ) } oCol:bPostEdit := { |val,brw,add| Post(val,brw,add) } oCol := :GetColumn('ID') oCol:lEdit := .F. oCol:nWidth := 60 oCol:cHeading := "Id" oCol:cPicture := '99999' oCol:nAlign := 1 oCol:nFAlign := 1 oCol:cFooting := {|nc| nc := (oBrw:cAlias)->( OrdKeyCount() ), ; iif( empty(nc), '', hb_ntos(nc) ) } :aSortBmp := { LoadImage("br_up.bmp"), LoadImage("br_dn.bmp") } :SetIndexCols( :nColumn('KODS'), :nColumn('NAME') ) :SetOrder( :nColumn('NAME') ) AEval( :aColumns, {|oCol| oCol:lFixLite := .T. } ) :lNoGrayBar := .T. :nWheelLines := 1 :nClrLine := COLOR_GRID :nHeightCell += 5 :nHeightHead += 5 :nHeightFoot := :nHeightCell + 5 :lDrawFooters := .T. :lFooting := .T. :lNoVScroll := .F. :lNoHScroll := .T. :nFreeze := 1 :lLockFreeze := .T. :SetDeleteMode(.T., .F.) :bChange := {|oBr| oBr:DrawFooters() } :bUserKeys := {|nKy,nFl,oBr| OnKeyDown(nKy, nFl, oBr) } :bLDblClick := {|uP1,uP2,nFl,oBr| uP1 := Nil, uP2 := Nil, nFl := Nil, ; oBr:PostMsg( WM_KEYDOWN, VK_F4, 0 ) } :nFireKey := VK_F4 // default Edit if :nLen > :nRowCount() :ResetVScroll( .T. ) :oHScroll:SetRange(0,0) EndIf END WITH END TBROWSE @ 06, 10 BUTTON BADD CAPTION "Add F2" ACTION oBrw:PostMsg( WM_KEYDOWN, VK_F2, 0 ) @ 06, 110 BUTTON BDEL CAPTION "Del F3" ACTION oBrw:PostMsg( WM_KEYDOWN, VK_F3, 0 ) @ 06, 210 BUTTON BEDIT CAPTION "Edit F4" ACTION oBrw:PostMsg( WM_KEYDOWN, VK_F4, 0 ) @ 06, 310 BUTTON BORD CAPTION "Order F6" ACTION oBrw:PostMsg( WM_KEYDOWN, VK_F6, 0 ) @ 0, 0 GETBOX DELETE HEIGHT 5 WIDTH 7 VALUE "" ; BACKCOLOR {RED, RED, RED} INVISIBLE END WINDOW oBrw:SetNoHoles() oBrw:SetFocus() CENTER WINDOW win_1 ACTIVATE WINDOW win_1 RETURN FUNCTION TR0( c ) RETURN PADL(AllTrim(c), len(c)) *----------------------------------- FUNCTION RandStr( nLen ) *----------------------------------- LOCAL cSet := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" LOCAL cPass := "" LOCAL i If pCount() < 1 cPass := " " Else FOR i := 1 TO nLen cPass += SubStr( cSet, Random( 52 ), 1 ) NEXT EndIf RETURN cPass *----------------------------------- STATIC FUNCTION Prev( uVal, oBrw ) *----------------------------------- Local nCol, oCol WITH OBJECT oBrw nCol := :nCell oCol := :aColumns[ nCol ] oCol:Cargo := uVal // old value END WITH RETURN .T. *----------------------------------- STATIC FUNCTION Post( uVal, oBrw ) *----------------------------------- Local nCol, oCol, cNam, uOld, lMod, cAls WITH OBJECT oBrw nCol := :nCell oCol := :aColumns[ nCol ] cNam := oCol:cName uOld := oCol:Cargo // old value lMod := ! uVal == uOld // .T. - modify value cAls := :cAlias END WITH RETURN .T. *----------------------------------- STATIC FUNC OnKeyDown( nKey, nFlg, oBrw ) *----------------------------------- Local uRet, cOrd nFlg := Nil If nKey == VK_RETURN uRet := .F. oBrw:SetFocus() ElseIf nKey == VK_F2 Add_Rec(oBrw) oBrw:SetFocus() ElseIf nKey == VK_F3 Del_Rec(oBrw) oBrw:SetFocus() uRet := .F. ElseIf nKey == VK_F4 oBrw:SetFocus() ElseIf nKey == VK_F6 WITH OBJECT oBrw cOrd := (:cAlias)->( OrdSetFocus() ) :SetOrder( :nColumn(iif( cOrd == "KOD", 'NAME', 'KODS' )) ) :SetFocus() END WITH EndIf RETURN uRet *----------------------------------- STATIC FUNC Del_Rec( oBrw ) *----------------------------------- Local oCel, nY, nX, nH, nK, lNoG WITH OBJECT oBrw lNoG := :lNoGrayBar oCel := :GetCellInfo(:nRowPos, :nColumn("KODS")) nY := oCel:nRow nX := oCel:nCol nH := oCel:nHeight :lNoGrayBar := .F. win_1.DELETE.Row := nY + 2 win_1.DELETE.Col := nX + 2 win_1.DELETE.Height := nH - 4 win_1.DELETE.Show() win_1.DELETE.SetFocus() DO EVENTS ShowGetValid( win_1.DELETE.Handle, " Y - delete ", 'DELETE RECORD', 'E' ) nK := InkeyGui(10 * 1000) win_1.DELETE.Hide() :lNoGrayBar := lNoG If nK == 89 // .or. nK == 13 :DeleteRow(.F.) EndIf END WITH RETURN Nil *----------------------------------- STATIC FUNC Add_Rec( oBrw ) *----------------------------------- Local cBrw, cAls Local nWdt, nPos, nLen Local nRow, nCol, nRec, oCel Local cKods, cName, cKodP, cNamP Local nY , nX , nW , nHgt Local nX1, nW1 Local nX2, nW2 Local cWnd := oBrw:cParentWnd Local hWnd := GetFormHandle(cWnd) Local hInpl := _HMG_InplaceParentHandle _HMG_InplaceParentHandle := hWnd PRIVATE aResult WITH OBJECT oBrw cBrw := :cControlName cAls := :cAlias nRow := :nTop + GetWindowRow(hWnd) - GetBorderHeight() nCol := :nLeft + GetWindowCol(hWnd) - GetBorderWidth () + 1 nPos := iif( :nLen < :nRowCount(), :nLen, :nRowCount() ) oCel := :GetCellInfo(nPos, :nColumn("KODS")) nY := oCel:nRow + :nHeightCell nX := oCel:nCol nW := oCel:nWidth nHgt := :nHeightCell nWdt := nW nW1 := nW - 4 nX1 := 1 oCel := :GetCellInfo(nPos, :nColumn("NAME")) nW := oCel:nWidth nW2 := nW nWdt += nW END WITH nRow += nY nCol += nX nLen := len( (cAls)->KODS ) cKods := GetNewKod() cKodP := "@K "+repl('9', nLen) nLen := len( (cAls)->NAME ) cName := space(nLen) cNamP := "@K "+repl('X', nLen) DEFINE WINDOW wNewRec ; AT nRow, nCol WIDTH nWdt HEIGHT nHgt TITLE '' ; MODAL NOSIZE NOSYSMENU NOCAPTION ; ON INIT ( This.Topmost := .T., InkeyGui(10), ; This.Topmost := .F. ) ; @ 0, nX1 GETBOX KODS HEIGHT nHgt WIDTH nW1 VALUE cKods PICTURE cKodP VALID VldNewRec() nX2 := This.KODS.Width + nX1 + 1 @ 0, nX2 GETBOX NAME HEIGHT nHgt WIDTH nW2 VALUE cName PICTURE cNamP VALID VldNewRec() ON KEY ESCAPE ACTION ThisWindow.Release END WINDOW ACTIVATE WINDOW wNewRec _HMG_InplaceParentHandle := hInpl If ! Empty(aResult) dbSelectArea(cAls) dbAppend() If ! NetErr() .and. RLock() nRec := RecNo() REPL KODS with aResult[1], ; NAME with aResult[2] If oBrw:nLen == oBrw:nRowCount() oBrw:oHScroll:SetRange(0,0) EndIf oBrw:GotoRec(nRec) nCol := oBrw:nColumn("NAME") If nCol != oBrw:nCell oBrw:nCell := nCol oBrw:DrawSelect() EndIf oBrw:lChanged := .T. oBrw:PostEdit(aResult[2], nCol, Nil) DO EVENTS oBrw:PostMsg(WM_KEYDOWN, VK_F4, 0) EndIf EndIf RETURN Nil *----------------------------------- STATIC FUNC GetNewKod() *----------------------------------- Local cAls := oBrw:cAlias Local nLen := len( (cAls)->KODS ) RETURN left(hb_ntos((cAls)->( OrdKeyCount() )+1)+space(nLen), nLen) *----------------------------------- STATIC FUNC VldNewRec() *----------------------------------- Local cWnd := _HMG_ThisFormName Local cGet := _HMG_ThisControlName Local cAls := oBrw:cAlias Local lRet := .T., lSek, cOrd Local cVal := _GetValue(cGet, cWnd) Local cGkd := 'KODS', cKod If empty(cVal) lRet := .F. ElseIf cGet == cGkd ElseIf cGet == 'NAME' cKod := _GetValue(cGkd, cWnd) cOrd := OrdSetFocus("KOD") lSek := (cAls)->( dbSeek(TR0(cKod)) ) OrdSetFocus(cOrd) If lSek Tone(500, 1) _SetValue(cGkd, cWnd, GetNewKod()) _SetFocus(cGkd, cWnd) aResult := NIL Else aResult := { cKod, cVal } DoMethod(cWnd, 'Release') EndIf EndIf RETURN lRet #pragma BEGINDUMP #define _WIN32_WINNT 0x0600 #include <windows.h> #include "hbapi.h" #include "hbapicdp.h" #include <commctrl.h> typedef struct _tagEDITBALLOONTIP { DWORD cbStruct; LPCWSTR pszTitle; LPCWSTR pszText; INT ttiIcon; // From TTI_* } EDITBALLOONTIP, *PEDITBALLOONTIP; #define EM_SHOWBALLOONTIP (ECM_FIRST + 3) // Show a balloon tip associated to the edit control #define Edit_ShowBalloonTip(hwnd, peditballoontip) \ (BOOL)SNDMSG((hwnd), EM_SHOWBALLOONTIP, 0, (LPARAM)(peditballoontip)) #define EM_HIDEBALLOONTIP (ECM_FIRST + 4) // Hide any balloon tip associated with the edit control #define Edit_HideBalloonTip(hwnd) \ (BOOL)SNDMSG((hwnd), EM_HIDEBALLOONTIP, 0, 0) // ToolTip Icons (Set with TTM_SETTITLE) #define TTI_NONE 0 #define TTI_INFO 1 #define TTI_WARNING 2 #define TTI_ERROR 3 #if (_WIN32_WINNT >= 0x0600) #define TTI_INFO_LARGE 4 #define TTI_WARNING_LARGE 5 #define TTI_ERROR_LARGE 6 #endif // (_WIN32_WINNT >= 0x0600) #define ECM_FIRST 0x1500 // Edit control messages /* ShowGetValid( hWnd, cText [ , cTitul ] [ , cTypeIcon ] ) */ #if ( HB_VER_MAJOR == 3 ) #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, ch) #else #define _hb_cdpGetU16( cdp, fCtrl, ch) hb_cdpGetU16(cdp, fCtrl, ch ) #define _hb_cdpGetChar(cdp, fCtrl, ch) hb_cdpGetChar(cdp, fCtrl, ch) #endif HB_FUNC( SHOWGETVALID ) { int i,k; char *tp, *s; WCHAR Text[512]; WCHAR Title[512]; EDITBALLOONTIP bl; PHB_CODEPAGE s_cdpHost = hb_vmCDP(); HWND hWnd = ( HWND ) hb_parnl( 1 ); if( ! IsWindow( hWnd ) ) return; bl.cbStruct = sizeof( EDITBALLOONTIP ); bl.pszTitle = NULL; bl.pszText = NULL; bl.ttiIcon = TTI_NONE; if( HB_ISCHAR( 2 ) ){ ZeroMemory( Text, sizeof(Text) ); k = hb_parclen(2); s = (unsigned char *) hb_parc(2); for(i=0;i<k;i++) Text[ i ] = _hb_cdpGetU16( s_cdpHost, TRUE, s[ i ] ); bl.pszText = Text; } if( HB_ISCHAR( 3 ) ){ ZeroMemory( Title, sizeof(Title) ); k = hb_parclen(3); s = (unsigned char *) hb_parc(3); for(i=0;i<k;i++) Title[ i ] = _hb_cdpGetU16( s_cdpHost, TRUE, s[ i ] ); bl.pszTitle = Title; } tp = ( char * ) hb_parc(4); switch( *tp ){ case 'E' : bl.ttiIcon = TTI_ERROR_LARGE; break; case 'e' : bl.ttiIcon = TTI_ERROR; break; case 'I' : bl.ttiIcon = TTI_INFO_LARGE; break; case 'i' : bl.ttiIcon = TTI_INFO; break; case 'W' : bl.ttiIcon = TTI_WARNING_LARGE; break; case 'w' : bl.ttiIcon = TTI_WARNING; break; } Edit_ShowBalloonTip( hWnd, &bl ); } #pragma ENDDUMP [/pre2]

Dima: SergKis пишет: nCol := oBrw:nColumn("NAM") Вероятно нужно oBrw:nColumn("NAME")

SergKis: Dima пишет Вероятно нужно oBrw:nColumn("NAME") Да, c Григорием уже сегодня cписались http://clipper.borda.ru/?1-1-0-00000495-000-100-0-1490094063 и в пред. посте подправлено тоже

Andrey: Слушайте, а почему бы не добавить возможность в Tsb прорисовку пустой таблицы ? Или фон таблицы сделать из картинки ?

Vlad04: пустой таблицы Нет данных или структура не определена ?

Andrey: Хочется несколько вариантов: 1) Данные есть, структура определена, но при первом показе хочется открывать базу с пустыми графами таблицы. 2) Если нет данных по фильтру по базе - то показывается таблица без граф (разделительных линей нет) - не совсем красиво, юзер не понимает почему таблица пустая... Вот в этом случае и нужно выводить пустую таблицу или картинку-фон в таблице.

Haz: Andrey пишет: Хочется несколько вариантов: А как объяснить пользователю почему курсор не идет ниже последней заполненной ??? там же еще много пустых По сути вопроса сделать то очень легко [pre2] в METHOD Paint() после этого If ::lAppendMode .and. ::nLen == ::nRowPos .and. ::nRowPos < nLines ::DrawLine( ++ ::nRowPos ) EndIf Добавить это If ::nLen < ::nRowCount() n := ::nRowPos m := (::cAlias)->(RecNo()) k := ::nLen ::nRowPos := ::nLen (::cAlias)->(dbGoBottom()) (::cAlias)->(dbSkip(1)) While ::nRowPos < ::nRowCount() ::nLen++ ::DrawLine( ++ ::nRowPos ) END ::nRowPos := n (::cAlias)->(dbGoto(m)) ::nLen := k EndIf ЗЫ и не забыть в начале метода объявить переменные local m,n,k можно еще и флаг добавить ::lPhantomGrid := .F. чтобы код выше выполнялся только когда obrw:lPhantomGrid := .T. [/pre2] мне как сейчас больше нравится Ну а с картинками и сам справишься - окно бровса известно, если фильтр выдал пусто то рисуй или пиши в это окно чего надо

Dima: Haz пишет: мне как сейчас больше нравится +1

SergKis: Haz пишет А как объяснить пользователю почему курсор не идет ниже последней заполненной ??? там же еще много пустых Полностью согласен У себя делаю принудительно :nLen := 1 (при пустой базе\выборке) ставлю в колонках oCol:lEmptyValToChar := .T. и в процедурах на клавишах (кроме добавления новой записи) делаю проверку IF (:cAlias)->( BOF() ) .and. (:cAlias)->( EOF() ); RETURN .F. ENDIF тогда одна пустая (Selected) линия есть всегда в тсб. Еще можно оставаться на окне запроса к выборке, выдав сообщение "Нет дааных запроса" и не входить в процедуру с тсб.

Andrey: Haz , SergKis - СПАСИБО БОЛЬШОЕ !

Andrey: Всем привет ! Вот возник вопрос - как закрасить виртуальный столбец другим цветом ? А то этот столбец наверное использует цвет последнего столбца в таблице.



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