Автор | Сообщение |
Vlad04
|
| постоянный участник
|
Пост N: 420
Зарегистрирован: 13.10.05
|
|
Отправлено: 19.12.13 18:16. Заголовок: TsBrowse в Минигуи (продолжение)
TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру цитата: | 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 |
| Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
gfilatov2002
|
| moderator
|
Пост N: 1078
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.03.17 14:42. Заголовок: SergKis пишет: там ..
SergKis пишет: Почистил также и другие неиспользуемые переменные, и добавил в заголовке следующие строки для подавления ненужных предупреждений FIELD KODS, NAME, ID MEMVAR oBrw, aResult
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1389
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.03.17 15:13. Заголовок: gfilatov2002 :sm36:..
gfilatov2002
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1390
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.03.17 12:25. Заголовок: gfilatov2002 Может ..
gfilatov2002 Может в пример добавить использование функции ShowGetValid(...) (сообщение в getbox valid об ошибке) ? Изменения такие 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
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1391
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.03.17 12:29. Заголовок: PS опять пропустил ...
PS опять пропустил [ i ]. повтор Скрытый текст
#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
|
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1079
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.03.17 13:50. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может в пример добавить использование функции ShowGetValid |
| Благодарю за Ваши усилия, но, думаю, что в данном случае нет необходимости в усложнении этого примера Кстати, эта функция уже использовалась в одном из примеров, которые прислал Андрей: - в папке Basic\COMM_2
| |
|
Haz
|
| |
Пост N: 1074
Зарегистрирован: 20.02.11
|
|
Отправлено: 17.03.17 16:10. Заголовок: SergKis пишет: Goto..
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
|
| постоянный участник
|
Пост N: 1392
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.03.17 17:35. Заголовок: gfilatov2002 пишет э..
gfilatov2002 пишет цитата: | эта функция уже использовалась в одном из примеров, которые прислал Андрей |
| По тому примеру не очень ясно основное назначение функции - работа в valid GetBox-ов. Но если усложняет, то тогда не надо.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1393
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.03.17 17:46. Заголовок: Haz пишет возможны с..
Haz пишет цитата: | возможны сюрпризы типа ... рассчитал нужный RowPos , а тебя опередил кто то и впихнул пачку записей |
| Игорь, в тек. версии миниГуи GotoRec работает приемлемо и действительно управляется через установку nRowPos до GotoRec. Просто в моей версии тсб 7.0 в базе и доводка мной до приближения к тсб 9.0. Получается при всей похожести кода есть разница, но это уже моя головная боль. GotoRec у себя уже подправил и управление через nRowPos тоже работает, может, в некоторых случаях, не так как в тсб 9.0, но похоже. Спасибо за участие.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1395
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.03.17 19:24. Заголовок: Для информации. В пр..
Для информации. В представленном выше примере, после добавления записи для включения Edit на след. колонке надо сделать : 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
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1397
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.03.17 17:11. Заголовок: Сделал Tsb_addrecord..
Сделал Tsb_addrecord_3 с удалением F3. Скрытый текст
/* * 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
|
| |
|
Dima
|
| |
Пост N: 6336
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.03.17 17:56. Заголовок: SergKis пишет: nCo..
SergKis пишет: цитата: | nCol := oBrw:nColumn("NAM") |
| Вероятно нужно oBrw:nColumn("NAME")
| |
|
|
SergKis
|
| постоянный участник
|
Пост N: 1398
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.03.17 18:30. Заголовок: Dima пишет Вероятно ..
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5329
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.03.17 12:13. Заголовок: Слушайте, а почему б..
Слушайте, а почему бы не добавить возможность в Tsb прорисовку пустой таблицы ? Или фон таблицы сделать из картинки ?
| |
|
Vlad04
|
| постоянный участник
|
Пост N: 675
Зарегистрирован: 13.10.05
|
|
Отправлено: 22.03.17 14:53. Заголовок: пустой таблицы Нет ..
Нет данных или структура не определена ?
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5330
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.03.17 16:30. Заголовок: Хочется несколько ва..
Хочется несколько вариантов: 1) Данные есть, структура определена, но при первом показе хочется открывать базу с пустыми графами таблицы. 2) Если нет данных по фильтру по базе - то показывается таблица без граф (разделительных линей нет) - не совсем красиво, юзер не понимает почему таблица пустая... Вот в этом случае и нужно выводить пустую таблицу или картинку-фон в таблице.
| |
|
Haz
|
| |
Пост N: 1075
Зарегистрирован: 20.02.11
|
|
Отправлено: 22.03.17 18:04. Заголовок: Andrey пишет: Хочет..
Andrey пишет: цитата: | Хочется несколько вариантов: |
| А как объяснить пользователю почему курсор не идет ниже последней заполненной ??? там же еще много пустых По сути вопроса сделать то очень легко в 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. мне как сейчас больше нравится Ну а с картинками и сам справишься - окно бровса известно, если фильтр выдал пусто то рисуй или пиши в это окно чего надо
| |
|
Dima
|
| |
Пост N: 6337
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.03.17 18:12. Заголовок: Haz пишет: мне как ..
Haz пишет: цитата: | мне как сейчас больше нравится |
| +1
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1399
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.03.17 10:30. Заголовок: Haz пишет А как объя..
Haz пишет цитата: | А как объяснить пользователю почему курсор не идет ниже последней заполненной ??? там же еще много пустых |
| Полностью согласен У себя делаю принудительно :nLen := 1 (при пустой базе\выборке) ставлю в колонках oCol:lEmptyValToChar := .T. и в процедурах на клавишах (кроме добавления новой записи) делаю проверку IF (:cAlias)->( BOF() ) .and. (:cAlias)->( EOF() ); RETURN .F. ENDIF тогда одна пустая (Selected) линия есть всегда в тсб. Еще можно оставаться на окне запроса к выборке, выдав сообщение "Нет дааных запроса" и не входить в процедуру с тсб.
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5332
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.03.17 12:08. Заголовок: Haz , SergKis - СПАС..
Haz , SergKis - СПАСИБО БОЛЬШОЕ !
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5351
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.04.17 15:12. Заголовок: Всем привет ! Вот во..
Всем привет ! Вот возник вопрос - как закрасить виртуальный столбец другим цветом ? А то этот столбец наверное использует цвет последнего столбца в таблице.
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|