**BRegieAL.prg - Regie-Zentrum fr Bestattungsverwaltung // Verwaltung der Artikel+Leistungen #include "Gra.ch" #include "Xbp.ch" #include "Appevent.ch" #include "Appedit.ch" #include "Appbrow.ch" #include "Font.ch" #include "Dmlb.ch" FUNCTION ArtikelEingabe( oDlg1 ) LOCAL oDlg, nEvent, mp1, mp2, oXbp, oBrowse, cArtLei := Trim(" "), cArtBez := Trim(" ") LOCAL oCtrl, oFocus := SetAppFocus(), aEditControls := {} LOCAL aPP := { { XBP_PP_FGCLR , GRA_CLR_BLACK } , ; { XBP_PP_BGCLR , GRA_CLR_WHITE } } LOCAL aPPSle := { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } LOCAL aPPTxt := { { XBP_PP_FGCLR , GRA_CLR_BLACK } , ; { XBP_PP_BGCLR , XBPSYSCLR_DIALOGBACKGROUND } } LOCAL aSizeDesktop := AppDesktop():currentSize() LOCAL nBSb := aSizeDesktop[1] LOCAL nBSh := aSizeDesktop[2] // folgende Zahlen-Werte basieren auf 800x600: // LOCAL nV := nBSb/800 // Korrekturfaktor fr tats„chliche Aufl”sung LOCAL nBo := 400*nV //, nBz := 25*nV LOCAL nOldArea := Select() PRIVATE oCB, oALDA, oSle0, oSle, oEdit // 29.08.2005: oEdit muá PRIVATE sein, wegen k SELECT 6 // cArtLei := 6->art_lei oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo ) oDlg:tasklist := .T. oDlg:title := "Eingabe/Žnderung von Artikeln/Leistungen" oDlg:maxButton := .F. oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:create(,, {10,int(30*nV)}, {int(770*nV),int(500*nV)} ) SetAppFocus(oDlg) // Fenster muá den Focus haben, damit Parts ihn dann kriegen k”nnen! oDlg:lockUpdate(.T.) // damit der Bildaufbau unsichtbar bleibt // oDlg:drawingArea:setColorBG( GRA_CLR_BLUE ) oDlg:drawingArea:setColorBG( XBPSYSCLR_TRANSPARENT ) oCB := oDlg:drawingArea oALDA := oDlg:drawingArea oALDA:cargo := oDlg nBo := Int(255*nV) // Lage des Mittelstreifens nSBy := 45 nSEy := 45 cArtLei := Space(6); cArtBez := Space(10) oXbp := XbpStatic():new( oDlg:drawingArea, , {int(5*nV),nBo}, {int(50*nV),int(25*nV)}) oXbp:caption := "Bezeichn.:" oXbp:clipSiblings := .T. oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:helpLink := MagicHelpLabel():New(390) oXbp:create() oSle0 := XbpGet():new( oDlg:drawingArea, , {int(60*nV),nBo}, {int(80*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle0:bufferLength := 10 oSle0:setInputFocus := {|mp1,mp2,obj| HiliteSle( obj ) } oSle0:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) } oSle0:group := XBP_WITHIN_GROUP oSle0:dataLink := {|x| IIf( PCOUNT()==0, cArtBez, cArtBez := x ) } oSle0:helpLink := MagicHelpLabel():New(390) oSle0:create():setData(cArtBez) oDlg:addEditControl( oSle0 ) oXbp := XbpStatic():new( oDlg:drawingArea, , {int(150*nV),nBo}, {int(50*nV),int(25*nV)}) oXbp:caption := "Art-Nr:" oXbp:clipSiblings := .T. oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:helpLink := MagicHelpLabel():New(391) oXbp:create() oSle := XbpGet():new( oDlg:drawingArea, , {int(210*nV),nBo}, {int(80*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle:bufferLength := 6 oSle:setInputFocus := {|mp1,mp2,obj| HiliteSle( obj ) } oSle:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) } oSle:group := XBP_WITHIN_GROUP oSle:dataLink := {|x| IIf( PCOUNT()==0, cArtLei, cArtLei := x ) } oSle:helpLink := MagicHelpLabel():New(391) oSle:create():setData(cArtLei) oDlg:addEditControl( oSle ) // jetzt folgt die Erzeugung der Eingabefelder oEdit := ArtikelFF():new( oALDA,oDlg, {330*nV,0}, {440*nV,475*nV},,, nBz, "s_art", -100, 299, 6 ) oEdit:CREATE( oALDA,oDlg, {330*nV,0}, {440*nV,475*nV},,, nBz, "s_art", -100, 299, 6 ) oEdit:SingleZeile[1]:postblock := {|o| oDlg:isIndexUnique( 1, PadR(Trim(o:editBuffer()),6) ) } oEdit:SingleZeile[1]:validate := oEdit:SingleZeile[1]:postblock AEval( oEdit:editControls, {|x| oDlg:addEditControl( x ) } ) // AEval( oEdit:appendControls, {|x| oDlg:addAppendControl( x ) } ) // bis hierhin geht die Erzeugung der Eingabefelder // oFocus := SetAppFocus( oSle0 ) oDlg:setModalState( XBP_DISP_APPMODAL ) // oDlg:show() oCtrl := XbpGetController():new( oDlg ) oCtrl:create() oCtrl:READ( , .F. ) SET ORDER TO 1 * Shortcuts initialisieren oDlg:InitShortCuts( oDlg ) oDlg:lockUpdate(.F.) oDlg:invalidateRect() DO WHILE nEvent <> xbeP_Close nEvent := AppEvent( @mp1, @mp2, @oXbp ) IF nEvent == xbeP_Keyboard DO CASE CASE mp1 == xbeK_RETURN IF oXbp == oSle0 PostAppEvent( xbeP_Activate,,, oEdit:DruckKnopf[9]) ENDIF IF oXbp == oSle PostAppEvent( xbeP_Activate,,, oEdit:DruckKnopf[8]) ENDIF CASE mp1 == xbeK_ESC PostAppEvent( xbeP_Close) CASE mp1 == xbeK_F1 ModalDialog( (cDatver+"f1_AL.dbf"), "Bedienungshinweise", oALDA, 680*nV, 460*nV ) CASE mp1 == xbeK_F10 lEinfg := .F. PostAppEvent( xbeP_Close,,,oDlg) ENDCASE ENDIF oXbp:handleEvent( nEvent, mp1, mp2 ) ENDDO oDlg:setModalState( XBP_DISP_MODELESS ) DbDeRegisterClient(oEdit) oEdit:destroy() oDlg:destroy() SetAppFocus( oFocus ) Select &nOldArea RETURN .T. FUNCTION ArtikelNeu(oDlg1) 6->(DbAppend()) 6->(DbGotop()) 6->(DbSkip(0)) SetAppFocus( oDlg1:setParent():childFromName( 6->(FieldPos( "art_lei" )) ) ) RETURN .T. FUNCTION ArtikelEntf(oDlg1) IF ConfirmBox( oDlg1, "Soll der Datensatz gel”scht werden?", ; "Datensatz l”schen", ; XBPMB_YESNO, ; XBPMB_QUESTION ) == XBPMB_RET_YES Satzsp( oCB ) 6->(DbDelete()) 6->(DbSkip(-1)) RETURN .T. ENDIF RETURN .T. FUNCTION ArtikelSuch( oDlg1, cSuchFeld ) LOCAL oDlg, nEvent, mp1, mp2, oBrowse, cArtLei := Trim(" ") LOCAL aSizeDesktop := AppDesktop():currentSize() LOCAL nBSb := aSizeDesktop[1] LOCAL nBSh := aSizeDesktop[2] // folgende Zahlen-Werte basieren auf 800x600: // LOCAL nV := nBSb/800 // Korrekturfaktor fr tats„chliche Aufl”sung LOCAL nOldArea := Select(), oFocus := SetAppFocus() LOCAL lFlucht := .F., nRec := RecNo(), cSuchWort := "" // 7.2.2005 PRIVATE oCB (nOldArea)->(DbSuspendNotifications()) SELECT 6 oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo ) oDlg:tasklist := .T. oDlg:title := "Artikel suchen" oDlg:maxButton := .F. oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:create(,, {10*nV,30*nV}, {int(330*nV),int(250*nV)} ) oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN ) oCB := oDlg:drawingArea oCB:cargo := oDlg 6->(DbSuspendNotifications()) IF Upper(cSuchFeld) = "BEZ" cSuchFeld := oDlg1:childFromName( 6->(FieldPos( cSuchFeld ))):getData() cSuchFeld := IIf(!Empty(oSle0:getData()),oSle0:getData(),cSuchFeld) // cSuchFeld := oSle0:getData() 6->(DbSetFilter( {|| IIf( !Empty(cSuchFeld),Trim(cSuchFeld)," " )$6->bez } )) IIf( !(6)->(Bof()), 6->(DbGotop()), ) ELSEIF Upper(cSuchFeld) = "ART_LEI" cArtLei := Trim( oDlg1:childFromName( 6->(FieldPos( cSuchFeld )) ):getData() ) cArtLei := IIf(!Empty(Trim(oSle:getData())),Trim( oSle:getData() ),cArtLei) // cArtLei := Trim( oSle:getData() ) 6->(DbSeek( cArtLei, .T. )) ELSE oDlg:destroy() (6)->(DbResetNotifications()) Select &nOldArea (nOldArea)->(DbResetNotifications()) (nOldArea)->(DbSkip(0) ) SetAppFocus( oFocus ) RETURN .F. ENDIF // jetzt folgt die Erzeugung der Eingabefelder oBrowse := ArtikelFF():new( oCB,oDlg, {330*nV,0}, {440*nV,475*nV},,, nBz, "s_art",300,399, 6 ) oBrowse:CREATE( oCB,oDlg, {330*nV,0}, {440*nV,475*nV},,, nBz, "s_art",300,399, 6 ) // bis hierhin geht die Erzeugung der Eingabefelder oDlg:setModalState( XBP_DISP_APPMODAL ) oDlg:show() SetAppFocus( oBrowse:BrowseFeld[1] ) nEvent := xbeP_None DO WHILE nEvent <> xbeP_Close nEvent := AppEvent( @mp1, @mp2, @oXbp ) // IF nEvent == xbeM_LbDblClick .AND. SetAppFocus():isDerivedFrom( "XbpBrowse" ) // IF nEvent == xbeM_LbDblClick .AND. oXbp:isDerivedFrom( "XbpColumn" ) IF nEvent == xbeBRW_ItemSelected PostAppEvent( xbeP_Close) ENDIF IF nEvent == xbeP_Keyboard DO CASE CASE mp1 >= Asc("0") .and. mp1 <= Asc("z") // 7.2.2005 cSuchWort += Chr(mp1) DbSeek( cSuchWort, .T. ) IF !Found() DbSkip(-1) ENDIF oBrowse:BrowseFeld[1]:refreshAll() CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10 PostAppEvent( xbeP_Close) CASE mp1 == xbeK_ESC lFlucht := .T. PostAppEvent( xbeP_Close) ENDCASE ENDIF oXbp:handleEvent( nEvent, mp1, mp2 ) ENDDO 6->(DbResetNotifications()) oDlg:setModalState( XBP_DISP_MODELESS ) oDlg:destroy() /// 6->(DbClearFilter()) Select &nOldArea (nOldArea)->(DbResetNotifications()) IF lFlucht = .T. (nOldArea)->(DbGoto(nRec)) ENDIF (nOldArea)->(DbSkip(0)) SET ORDER TO 1 SetAppFocus( oFocus ) RETURN .T. CLASS ArtikelFF FROM DialogFF EXPORTED: VAR VArea METHOD INIT METHOD CREATE METHOD notify ENDCLASS METHOD ArtikelFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA ) ::DialogFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA ) ::Fancy := cLeistBM ::VArea := nA ::BEArea := {} AAdd( ::BEArea, oParent ) ::BENr := Len( ::BEArea ) RETURN self METHOD ArtikelFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA ) ::DialogFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA ) (nA)->(DbRegisterClient(self)) // reicht es, wenn das Fenster als Ganzes registriert ist?? RETURN self METHOD ArtikelFF:notify( nEvent, mp1, mp2 ) LOCAL nRec, oFocus,i IF nEvent == xbeDBO_Notify // Notify-Ereignis IF mp1 == DBO_MOVE_DONE // Skip ist beendet IF !SetAppFocus():isDerivedFrom( "XbpBrowse" ) .AND. Len(::BrowseFeld) > 0 (::VArea)->(DbSuspendNotifications()) nRec := (::VArea)->(RecNo()) FOR i := 1 TO Len(::BrowseFeld) ::BrowseFeld[i]:refreshAll() NEXT (::VArea)->(DbGoto( nRec )) (::VArea)->(DbResetNotifications()) ENDIF ENDIF ENDIF RETURN self