Browse aus anderem thread aktualisieren [ERLEDIGT]
Verfasst: So, 20. Feb 2011 21:47
Hi
Ich habe das Problem, dass der Browse zwar aktualisiert wird, aber vollkommen wirr. Ich denke mal, es liegt daran, dass die eigentliche DBF, die mit dem browse verbunden ist kein DbGoTop() bekommt. Aber wie kann ich das anders lösen? Muß ich die oVideof4Temp in den Zerospace packen um dann in dem Thread an die DBF zu gelangen, oder wie löst man sowas?
Code: Alles auswählen
* *
* *
* *
* *
* letzte Änderung:19.02.2011 *
********************************************************************************
* titelsuchen.prg Suchen von Titel/Interpreten im Vostamm *
* (c) Manfred Kunz Dezember 2008 *
********************************************************************************
#include "appevent.ch"
#include "common.ch"
#include "q:\include\inkey.ch"
#include "Xbp.ch"
********************************************************************************
PROCEDURE titelsuchen()
LOCAL aPbSize := {100,20}
LOCAL aSleSize := {300,20}
LOCAL aTextSize := {70,20}
LOCAL lRahmen := .T.
LOCAL nEvent := 0
LOCAL mp1 := 0
LOCAL mp2 := 0
LOCAL nRahmenEingabeHoehe := 40
LOCAL oBrowse := NIL
LOCAL oDialog := NIL
LOCAL oMaske := masken():new()
LOCAL oPbEnde := NIL
LOCAL oPbStart := NIL
LOCAL oRahmenBrowse := NIL
LOCAL oRahmenEingabe := NIL
LOCAL oText := NIL
LOCAL oThreadF4 := threadf4():new()
LOCAL oVideoF4Temp := videof4temp():new()
LOCAL oXbp := NIL
MEMVAR oVostamm
oVostamm:felderleeren()
oDialog := DialogFenster():new()
oDialog:title := "Interpret-/Titelsuche"
oDialog:create()
oDialog:setFrameState(XBPDLG_FRAMESTAT_MAXIMIZED)
oRahmenEingabe := rahmen():new(oDialog,,{5,oDialog:clientsize[2]-nRahmenEingabeHoehe},{oDialog:clientsize[1]-10,nRahmenEingabeHoehe},,,lRahmen)
oRahmenEingabe:create()
oRahmenBrowse := rahmen():new(oDialog,,{5,5},{oDialog:clientsize[1]-10,oDialog:clientsize[2]-nRahmenEingabeHoehe},,,lRahmen)
oRahmenBrowse:create()
oText := feldtexte():new(oRahmenEingabe,,{1,5},aTextSize)
oText:caption := "Interpret:"
oText:create()
oVostamm:oV_Darstell := mk_sle():new(oRahmenEingabe,,{oText:currentsize()[1]+oText:currentPos()[1]+5,5},aSleSize)
oVostamm:oV_Darstell:bufferlength := Len(oVostamm:v_darstell)
oVostamm:oV_Darstell:cuebanner := "Interpret eingeben"
oVostamm:oV_Darstell:datalink := {|x| IIf(x==NIL, oVostamm:v_darstell, oVostamm:v_darstell := x ) }
oVostamm:oV_Darstell:keyboard := {|nKey,x,o| geaendert("v_darstell",oVostamm,oPbStart) }
oVostamm:oV_Darstell:create()
oText := feldtexte():new(oRahmenEingabe,,{oVostamm:oV_darstell:currentsize()[1]+oVostamm:oV_darstell:currentPos()[1],5},aTextSize)
oText:caption := "Titel:"
oText:create()
oVostamm:oV_Titel := mk_sle():new(oRahmenEingabe,,{oText:currentsize()[1]+oText:currentPos()[1]+5,5},aSleSize)
oVostamm:oV_Titel:bufferlength := Len(oVostamm:v_Titel)
oVostamm:oV_Titel:cuebanner := "Titel eingeben"
oVostamm:oV_Titel:datalink := {|x| IIf(x==NIL, oVostamm:v_Titel, oVostamm:v_Titel := x ) }
oVostamm:oV_Titel:keyboard := {|nKey,x,o| geaendert("v_titel",oVostamm,oPbStart) }
oVostamm:oV_Titel:create()
oPbStart := pushButton():new(oRahmenEingabe,,{oVostamm:oV_titel:currentsize()[1]+oVostamm:oV_titel:currentPos()[1]+10,5},aPbSize)
oPbStart:activate := {|| IF(! oThreadF4:lGestartet, oVideoF4Temp:schliesse_datenbank(),oVideoF4Temp:db_oeffnen(,,.T.),oThreadF4:start("suchen",oThreadF4,oPbStart,oPbEnde,oBrowse,oVostamm)),oThreadF4:lGestartet := .F.)}
oPbStart:caption := "Start"
oPbStart:create()
oPbStart:disable()
oPbEnde := pushButton():new(oRahmenEingabe,,{oPbStart:currentsize()[1]+oPbStart:currentPos()[1],5},aPbSize)
oPbEnde:caption := "Ende"
oPbEnde:create()
oBrowse := mk_browseDb():new(oRahmenBrowse,,{5,5},{oRahmenBrowse:currentsize()[1]-10,oRahmenBrowse:currentsize()[2]-20})
oBrowse:create()
IF oMaske:leseBrowseFelder("videof4")
oVideoF4Temp:db_oeffnen(,,.T.) // muß direkt vor der Erzeugung der Spalten stehen
oBrowse:erzeugeSpalten(oMaske,{XBP_PP_COMPOUNDNAME,"8.Arial"} )
SetAppFocus(oVostamm:oV_Darstell)
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
ENDDO
ENDIF
oDialog:destroy()
oVideoF4Temp:schliesse_datenbank()
RETURN
********************************************************************************
PROCEDURE geaendert(cWoher,oVostamm,oPbStart)
IF Upper(cWoher) == "V_DARSTELL"
IF ! Empty(oVostamm:oV_Darstell:editbuffer())
oPbStart:enable()
oVostamm:oV_titel:disable()
ELSE
oVostamm:oV_Titel:enable()
oPbStart:disable()
ENDIF
ELSE
IF ! Empty(oVostamm:oV_titel:editbuffer())
oPbStart:enable()
oVostamm:oV_darstell:disable()
ELSE
oVostamm:oV_darstell:enable()
oPbStart:disable()
ENDIF
ENDIF
RETURN
********************************************************************************
PROCEDURE suchen(oThread,oPbStart,oPbEnde,oBrowse,objekt)
LOCAL cSuch
LOCAL lWeicheSuche := .F.
LOCAL oGenre := genre():new()
LOCAL oSysteme := systeme():new()
LOCAL oVideoF4Temp := videof4temp():new()
LOCAL oVo := kassette():new()
LOCAL oVostamm := fstamm():new()
MEMVAR oSysPara
oThread:lGestartet := .T.
oPbEnde:disable()
oPbStart:setCaption("Abbruch")
oGenre:db_oeffnen()
oSysteme:db_oeffnen()
oVo:db_oeffnen("idvostamm")
oVostamm:db_oeffnen()
oVideoF4Temp:db_oeffnen()
(oVostamm:nArea)->(DbSetRelation((oGenre:nArea) ,{|| Str((oVostamm:nArea)->idgenre,8,0) },,"id" ) )
(oVostamm:nArea)->(DbSetRelation((oSysteme:nArea),{|| Str((oVostamm:nArea)->idsystem,8,0) },,"id" ) )
IF ! Empty(objekt:oV_Darstell:editbuffer())
oVostamm:indexfocus("darst")
IF "*" $ objekt:oV_Darstell:editbuffer() .OR. "?" $ objekt:oV_darstell:editbuffer()
objekt:oV_darstell:getData()
objekt:v_darstell := StrTran(Trim(objekt:v_darstell)," " ,"?") // ein evtl. "*" wird gegen ein "?" ausgetauscht wegen OrdWildSeek
oPbStart:disable()
oPbStart:setCaption("Suche..")
(oVostamm:nArea)->(OrdWildSeek(Upper(objekt:v_darstell)))
oPbStart:setCaption("Abbruch")
oPbStart:enable()
lWeicheSuche := .T.
ELSE
cSuch := ConvToAnsiCP(Upper(objekt:oV_darstell:editBuffer()))
(oVostamm:nArea)->(DbSetScope(SCOPE_TOP ,cSuch))
(oVostamm:nArea)->(DbSetScope(SCOPE_BOTTOM,cSuch))
ENDIF
ELSE
oVostamm:indexfocus("titel")
ENDIF
IF ! lWeicheSuche
IF (oVostamm:nArea)->(Eof())
oSysPara:oMessage:anzeigen("Es wurden keine Einträge gefunden zum Suchbegriff")
oThread:lGestartet := .F.
ENDIF
ENDIF
DO WHILE .T.
Sleep(0)
IF ! oThread:lGestartet
EXIT
ENDIF
erstelleSatz(oVideoF4Temp,oBrowse,oVostamm,oVo,oSysteme,oGenre)
IF lWeicheSuche
IF (oVostamm:nArea)->(Found())
(oVostamm:nArea)->(OrdWildSeek())
ELSE
oThread:lGestartet := .F.
ENDIF
ELSE
(oVostamm:nArea)->(Dbskip())
IF (oVostamm:nArea)->(Eof())
oThread:lGestartet := .F.
ENDIF
ENDIF
ENDDO .T.
(oVostamm:nArea)->(DbClearRelation())
oVideoF4Temp:schliesse_datenbank(.T.) // klappt das hier mit dem .T.
oPbStart:setCaption("Start")
oPbEnde:enable()
oThread:lGestartet := .F.
RETURN
********************************************************************************
PROCEDURE erstelleSatz(oVideoF4Temp,oBrowse,oVostamm,oVo,oSysteme,oGenre)
(oVo:nArea)->(DbClearScope())
(oVo:nArea)->(DbSetScope(SCOPE_BOTH,Str((oVostamm:nArea)->id,8,0)))
DO WHILE ! (oVo:nArea)->(Eof())
(oVideoF4Temp:nArea)->(DbAppend())
(oVideoF4Temp:nArea)->datumleih := (oVo:nArea)->datumleih
(oVideoF4Temp:nArea)->datumrueck := (oVo:nArea)->datumrueck
(oVideoF4Temp:nArea)->ean := (oVo:nArea)->ean
(oVideoF4Temp:nArea)->genre := (oGenre:nArea)->bez
(oVideoF4Temp:nArea)->interpret := (oVostamm:nArea)->v_darstell
(oVideoF4Temp:nArea)->lagertg := Date()-(oVo:nArea)->datumein+1
(oVideoF4Temp:nArea)->lagernr := (oVo:nArea)->lagernr
(oVideoF4Temp:nArea)->preis := (oVo:nArea)->preissoll
(oVideoF4Temp:nArea)->reserve := (oVo:nArea)->reserve
(oVideoF4Temp:nArea)->system := (oSysteme:nArea)->bez
(oVideoF4Temp:nArea)->titel := (oVostamm:nArea)->v_titel
(oVideoF4Temp:nArea)->(DbGoTop())
oBrowse:refreshAll()
(oVo:nArea)->(Dbskip())
ENDDO
RETURN