Code: Alles auswählen
PROCEDURE titelsuchen()
LOCAL aSizeText := {120,30}
LOCAL aPos := {0,0}
LOCAL nEvent := 0
LOCAL mp1 := 0
LOCAL mp2 := 0
LOCAL oBrowse := NIL
LOCAL oDialog := NIL
LOCAL oMaske := masken():new()
LOCAL oRahmenSuchfelder := NIL
LOCAL oText := NIL
LOCAL oXbp := NIL
MEMVAR lAbbruch
MEMVAR oGenre
MEMVAR oSysteme
MEMVAR oVideoF4temp
MEMVAR oVostamm
PUBLIC lAbbruch := .F.
oVideof4Temp := videoF4Temp():new()
oDialog := XbpDialog():new()
oDialog:border := XBPDLG_RECESSEDBORDERTHICK
oDialog:titlebar := .F.
oDialog:create()
oDialog:setFrameState(XBPDLG_FRAMESTAT_MAXIMIZED)
oRahmenSuchFelder := XbpStatic():new(oDialog)
oRahmenSuchFelder:type := XBPSTATIC_TYPE_GROUPBOX
oRahmenSuchfelder:create()
oRahmenSuchfelder:setPosAndSize( {1,oDialog:clientSize[2]-50},{oDialog:clientSize[1]-2,50} )
aPos := {1,oRahmenSuchFelder:currentSize()[2]/2- (aSizeText[2]/3) }
oText := feldtexte():new(oRahmenSuchFelder,,aPos )
oText:autosize := .T. // damit die Breite immer paßt
oText:caption := "Interpret:"
oText:create()
aPos := {oText:currentSize()[1]+oText:currentPos()[1],5}
oVostamm:oV_darstell := mk_Sle():new(oRahmenSuchFelder,,aPos,{300,30})
oVostamm:oV_darstell:bufferlength := 33
oVostamm:oV_Darstell:dataLink := {|x| IIf(x==NIL, oVostamm:v_darst, oVostamm:v_darst := x ) }
oVostamm:oV_Darstell:keyboard := { |nKey,x,o| geaendert(oBrowse,"v_darstell",nKey,oVostamm:oV_Darstell,oDialog) }
oVostamm:oV_darstell:create()
aPos := {oVostamm:oV_darstell:currentpos()[1] + oVostamm:oV_darstell:currentsize()[1] + 5,oRahmenSuchFelder:currentSize()[2]/2- (aSizeText[2]/3) }
oText := feldtexte():new(oRahmenSuchFelder,,aPos )
oText:autosize := .T. // damit die Breite immer paßt
oText:caption := "Titel:"
oText:create()
aPos := {oText:currentSize()[1]+oText:currentPos()[1],5}
oVostamm:oV_titel := mk_Sle():new(oRahmenSuchFelder,,aPos,{300,30})
oVostamm:oV_titel:bufferlength := 40
oVostamm:oV_titel:dataLink := {|x| IIf(x==NIL, oVostamm:v_titel, oVostamm:v_titel := x ) }
oVostamm:oV_titel:keyboard := { |nKey,x,o| geaendert(oBrowse,"v_titel",nKey,oVostamm:oV_titel,oDialog) }
oVostamm:oV_titel:create()
oBrowse := mk_Browse():new(oDialog,,,{oDialog:currentsize()[1]-3,oRahmenSuchfelder:currentpos()[2]-8})
oBrowse:create()
IF ! oMaske:leseBrowseFelder("videoF4")
RETURN
ENDIF
oVideoF4Temp:db_oeffnen(,,.T.) // muß direkt vor der Erzeugung der Spalten stehen
oBrowse:erzeugeSpalten(oMaske,{XBP_PP_COMPOUNDNAME,"8.Arial"} )
(oVostamm:nArea)->(DbSetRelation((oGenre:nArea) ,{|| Str((oVostamm:nArea)->idgenre,8,0) },,"id" ) )
(oVostamm:nArea)->(DbSetRelation((oSysteme:nArea),{|| Str((oVostamm:nArea)->idsystem,8,0) },,"id" ) )
SetAppFocus(oVostamm:oV_darstell)
oDialog:show()
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
IF nEvent == xbeP_Keyboard
IF mp1 = xbeK_ENTER // erstmal nur pauschal auf Return reagieren
IF oXbp:isDerivedFrom("XBPPUSHBUTTON")
PostAppEvent(xbeK_SPACE, NIL, NIL, oXbp) // wird eine Leertaste draus
ELSEIF oXbp:isDerivedFrom("XBPSLE")
PostAppEvent(xbeK_TAB, NIL, NIL, oXbp) // und ein Tab draus machen
ENDIF
ELSEIF mp1 = xbeK_ESC
EXIT
ENDIF
ENDIF
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
(oVostamm:nArea)->(DbClearRelation())
oVideoF4Temp:schliesse_datenbank()
oDialog:destroy()
RETURN
********************************************************************************
FUNCTION geaendert(oBrowse,cWoher,nKey,objekt,oDialog)
MEMVAR oVostamm
IF Upper(cWoher) == "V_DARSTELL"
IF ! Empty(objekt:editbuffer())
oVostamm:oV_Titel:disable()
ELSE
oVostamm:oV_Titel:enable()
ENDIF
ELSE
IF ! Empty(objekt:editbuffer())
oVostamm:oV_Darstell:disable()
ELSE
oVostamm:oV_Darstell:enable()
ENDIF
ENDIF
IF nKey == xbeK_ENTER .OR. nKey == xbeK_TAB
suchen(oBrowse,cWoher,oDialog)
ENDIF
RETURN(.T.)
********************************************************************************
FUNCTION suchen(oBrowse,cWoher,oDialog) // kann das hier auch noch in eine Methode?
LOCAL lErfolg := .T.
LOCAL nZeichenLaenge
LOCAL oThread
MEMVAR lAbbruch
MEMVAR oGenre
MEMVAR oVideoF4Temp
MEMVAR oMessage
MEMVAR oSysteme
MEMVAR oVo
MEMVAR oVostamm
lAbbruch := .F.
IF Empty(oVostamm:oV_Darstell:editbuffer()) .AND. Empty(oVostamm:oV_titel:editbuffer())
RETURN(.F.)
ENDIF
oVideoF4Temp:schliesse_datenbank()
oVideoF4Temp:db_oeffnen(,,.T.) // immer vorher leer machen
IF Upper(cWoher) == "V_DARSTELL"
oVostamm:indexfocus("darst")
nZeichenLaenge := Len(oVostamm:oV_Darstell:editbuffer()) + 1
oVostamm:oV_Darstell:setMarked( {1,nZeichenLaenge} )
(oVostamm:nArea)->(DbSetScope(SCOPE_TOP,Upper(oVostamm:oV_Darstell:editbuffer())))
(oVostamm:nArea)->(DbSetScope(SCOPE_BOTTOM,Trim(Upper(oVostamm:oV_Darstell:editbuffer()))))
ELSE
oVostamm:indexfocus("titel")
nZeichenLaenge := Len(oVostamm:oV_titel:editbuffer()) + 1
oVostamm:oV_titel:setMarked( {1,nZeichenLaenge} )
(oVostamm:nArea)->(DbSetScope(SCOPE_TOP,Upper(oVostamm:oV_titel:editbuffer())))
(oVostamm:nArea)->(DbSetScope(SCOPE_BOTTOM,Trim(Upper(oVostamm:oV_titel:editbuffer()))))
ENDIF
IF (oVostamm:nArea)->(Eof())
oMessage:anzeigen("Es wurden keine Einträge gefunden zum Suchbegriff")
lErfolg := .F.
ENDIF
IF lErfolg
oThread := gedrueckt():new()
oThread:start()
DO WHILE ! (oVostamm:nArea)->(Eof()) .AND. ! lAbbruch
(oVo:nArea)->(DbClearScope())
(oVo:nArea)->(DbSetScope(SCOPE_BOTH,Str((oVostamm:nArea)->id,8,0)))
IF ! (oVo:nArea)->(Eof()) .AND. (oVo:nArea)->preissoll > 0 .AND. ! (oVo:nArea)->reserve
(oVideoF4Temp:nArea)->(DbAppend())
(oVideoF4Temp:nArea)->ean := (oVo:nArea)->ean
(oVideoF4Temp:nArea)->(DbGoTop())
oBrowse:refreshAll()
ENDIF
(oVostamm:nArea)->(DbSkip())
ENDDO
IF lAbbruch
(oVideoF4Temp:nArea)->(DbAppend())
(oVideoF4Temp:nArea)->interpret := "ABBRUCH DER SUCHE"
(oVideoF4Temp:nArea)->(DbGoTop())
oBrowse:refreshAll()
ENDIF
oThread:terminate()
ENDIF
SetAppWindow(oDialog) // muß sein, weil wir im Hybridmodus sind
SetAppFocus(oBrowse)
(oVostamm:nArea)->(DbClearScope())
RETURN(.T.)
********************************************************************************
CLASS gedrueckt FROM THREAD
PROTECTED:
VAR terminated
EXPORTED:
INLINE METHOD init
::thread:init()
::terminated := .F.
RETURN self
INLINE METHOD terminate
RETURN ( ::terminated := .T. )
METHOD checkTermination
METHOD execute
ENDCLASS
********************************************************************************
METHOD gedrueckt:execute()
LOCAL nEvent := 0
LOCAL mp1 := 0
LOCAL mp2 := 0
LOCAL oDialog := XbpDialog():new(,,,{180,100})
LOCAL oPb
LOCAL oXbp := NIL
MEMVAR lAbbruch
oDialog:title := "Suche..."
oDialog:tasklist := .T.
oDialog:create()
CenterControl(oDialog)
oPb := XbpPushButton():new(oDialog,,,{160,30})
oPb:activate := {|| lAbbruch := .T.}
oPb:caption := "Abbruch mit Leertaste"
oPb:create()
CenterControl(oPb)
SetAppFocus(oPb)
DO WHILE ! ::terminated
nEvent := AppEvent( @mp1, @mp2, @oXbp)
IF nEvent == xbeP_Keyboard
IF mp1 = xbeK_ENTER
PostAppEvent(xbeP_Activate, NIL, NIL, oXbp) // wird eine Leertaste draus
ENDIF
ENDIF
oXbp:handleEvent( nEvent, mp1, mp2 )
::checkTermination(oDialog)
ENDDO
RETURN self
********************************************************************************
METHOD gedrueckt:checkTermination(oDialog)
IF ::terminated
::terminated := .F.
oDialog:destroy()
::quit()
ENDIF
RETURN self
********************************************************************************