ich habe einen Hybridmodus, in dem ich in ein Get Feld einen Suchstring eingebe. Dieser Suchstring wird über ein Valid weiterverarbeitet. Dieses Valid ruft einen Thread auf, in dem über Ordwildseek gesucht wird und ein GUI Hinweis erscheint, dass die Suche stattfindet. Gleichzeitig wird ja das Read abgearbeitet und danach wird ein Browser mit GUI aufgemacht, der im "Hintergrund" die gefundenen Werte anzeigt. Wenn jetzt aber die Suche beendet ist, erscheint wieder ein GUI Hinweis, dass das der Fall ist. Wird der OK Button geklickt, schließt sich dieses Hinweisfenster, aber der Focus ist danach nicht im Browser, wo ich ihn haben müßte.
Wie kriege ich nach einem beendeten Thread hin, das ich dem Programm sage, wer jetzt den Focus erhält?
Code: Alles auswählen
#include "q:\include\inkey.ch"
#include "Gra.ch"
#include "dcdialog.ch"
#include "Xbp.ch"
*******************************************************************************
PROCEDURE main()
LOCAL aVo
LOCAL getlist := {}
LOCAL oThread := Thread():new()
LOCAL oVostamm
MEMVAR oBild
MEMVAR oMa
MEMVAR oMessage
MEMVAR oPruefen
MEMVAR oSysPara
oBild := bildschirm():new()
oMessage := nachricht():new()
oPruefen := pruefen():new()
oMa := mitarbeiter():new():initvaria()
oVostamm := fstamm():new():initvaria()
oBild:cPrgArt := "Info-Terminal"
oBild:cVersion += "09/14.01.2009"
oMa:name := "Info"
oSysPara:cProgrammName := "Info-Terminal"
oBild:hauptmenue(.T.,.T.)
oVostamm:db_oeffnen()
SETCANCEL(.F.) // ALT+C abschalten
DO WHILE .T.
aVo := {}
oVostamm:felderleeren()
@ 1, 1 SAY "Darst/Interpr: Titel: "
@ 1,15 GET oVostamm:v_darstell PICTURE "@K !XXXXXXXXXXXXXXXXXXX";
WHEN EMPTY(oVostamm:v_titel);
VALID oThread:start("interpret", aVo, oThread, oVostamm)
@ 1,42 GET oVostamm:v_titel PICTURE "@K !XXXXXXXXXXXXXXXXXXX";
WHEN EMPTY(oVostamm:v_darstell);
VALID oThread:start("titel", aVo, oThread, oVostamm)
READ
IF oVostamm:v_titel = "LOGOUT" .OR. oVostamm:v_darstell = "LOGOUT"
EXIT
ENDIF
browser(aVo, IF(! Empty(oVostamm:v_titel),"Titel","Interpret"), IF(! Empty(oVostamm:v_titel),Trim(oVostamm:v_titel),Trim(oVostamm:v_darstell)))
ENDDO .T.
AppQuit()
RETURN
********************************************************************************
FUNCTION browser(aVo, cSuchart, cSuchsatz)
LOCAL getlist := {}
LOCAL GetOptions
LOCAL oBrowse := NIL
LOCAL oDialog := NIL
@ 70, 1 DCBROWSE oBrowse;
DATA aVo;
SIZE 1000,600;
PIXEL;
CURSORMODE XBPBRW_CURSOR_ROW;
NOSOFTTRACK;
PARENT oDialog;
AUTOREFRESH 111
DCBROWSECOL ELEMENT 1 WIDTH 300 HEADER "Interpret" PARENT oBrowse PIXEL
DCBROWSECOL ELEMENT 2 WIDTH 300 HEADER "Titel" PARENT oBrowse PIXEL
DCBROWSECOL ELEMENT 3 WIDTH 200 HEADER "Ort" PARENT oBrowse PIXEL
DCBROWSECOL ELEMENT 4 WIDTH 50 HEADER "Platz" PARENT oBrowse PIXEL ALIGN XBPALIGN_RIGHT
DCGETOPTIONS HILITEGETS GRA_CLR_CYAN;
PIXEL;
SAYOPTIONS XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT;
NOMINBUTTON;
NOMAXBUTTON;
AUTORESIZE
DCREAD GUI;
TITLE cSuchArt + " (" + cSuchSatz + ")";
OPTIONS GetOptions;
PARENT oDialog;
OWNER SetAppWindow();
FIT
RETURN(.T.)
********************************************************************************
FUNCTION titel(aVo,oThread, oVostamm)
LOCAL aDlgSize := {300,100}
LOCAL cIndexAnfang
LOCAL cIndexEnde
LOCAL oAblauf
LOCAL oDialog
LOCAL oHinweis
LOCAL oVo2 := kassette():new():initvaria()
LOCAL oVostamm2 := fstamm():new():initvaria()
MEMVAR oGenre
MEMVAR oHersteller
MEMVAR oMessage
MEMVAR oSysteme
oMessage := nachricht():new()
oGenre := genre():new():initvaria()
oHersteller := hersteller():new():initvaria()
oSysteme := systeme():new():initvaria()
IF Empty(oVostamm:v_titel)
oThread:quit()
RETURN(.T.)
ENDIF
oGenre:db_oeffnen()
oHersteller:db_oeffnen()
oSysteme:db_oeffnen()
oVostamm2:db_oeffnen("titel")
oDialog := DialogFenster():new(AppDesktop(),SetAppWindow(),,aDlgSize,,,.F.)
oHinweis := feldtexte():new(oDialog,,{5,40},{200,20})
oHinweis:caption := "Daten werden erzeugt, bitte Geduld...."
oAblauf := feldtexte():new(oDialog,,{5,10},{100,20})
oDialog:create()
oHinweis:create()
oAblauf:create()
oVo2:db_oeffnen()
oVostamm2:db_oeffnen("titel")
DO WHILE .T.
IF "*" $ oVostamm:v_titel .OR. "?" $ oVostamm:v_titel // Orwilsseek ist angesagt
oVostamm:v_titel := StrTran(Trim(oVostamm:v_titel)," ","?")
(oVostamm2:nArea)->(OrdWildSeek(Upper(oVostamm:v_titel)))
DO WHILE (oVostamm2:nArea)->(Found())
IF oVo2:satzsuchen(Str((oVostamm2:nArea)->id,8,0),,"idvostamm",,,,.T.,.F.,.F.)
oVostamm2:fuehreDbVerbindungen("titelsuchen")
AAdd(aVo,{;
(oVostamm2:nArea)->v_darstell,;
(oVostamm2:nArea)->v_titel,;
(oGenre:nArea)->bez,;
(oVo2:nArea)->lagernr;
})
oAblauf:setcaption(Transform(Len(aVo),"9999"))
ENDIF
(oVostamm2:nArea)->(OrdWildSeek())
ENDDO
EXIT
ELSE // es wurde definitiv nach einem Namen gesucht
cIndexAnfang := Upper(oVostamm:v_titel) // Anfangsbuchstaben sichern für den ScopeAnfang
cIndexEnde := Trim(cIndexAnfang) + "ZZZZZZZZZZ" // für Scopende
oVostamm2:satzsuchen(oVostamm2:indexOhneArtikel(Upper(oVostamm:v_titel)),.T.,"titel",,,,.T.,,.F.)
(oVostamm2:nArea)->(Dbsetscope(SCOPE_TOP,cIndexAnfang))
(oVostamm2:nArea)->(Dbsetscope(SCOPE_BOTTOM,cIndexEnde))
IF (oVostamm2:nArea)->(Eof())
IF oMessage:anzeigen("Es wurde kein passender Eintrag gefunden. Soll eine ungefähre Suche probiert werden?",.T.,"J")
(oVostamm2:nArea)->(DbClearScope())
oVostamm:v_titel := "*" + Trim(oVostamm:v_titel) + "*"
LOOP
ENDIF
EXIT
ENDIF
DO WHILE ! (oVostamm2:nArea)->(Eof())
IF oVo2:satzsuchen(Str((oVostamm2:nArea)->id,8,0),,"idvostamm",,,,.T.,,.F.)
oVostamm2:fuehreDbVerbindungen("titelsuchen")
AAdd(aVo,{;
(oVostamm2:nArea)->v_darstell,;
(oVostamm2:nArea)->v_titel,;
(oGenre:nArea)->bez,;
(oVo2:nArea)->lagernr;
})
oAblauf:setcaption(Transform(Len(aVo),"9999"))
ENDIF
(oVostamm2:nArea)->(DbSkip())
ENDDO
(oVostamm2:nArea)->(DbClearScope())
ENDIF
EXIT
ENDDO .T.
oGenre:schliesse_datenbank()
oHersteller:schliesse_datenbank()
oSysteme:schliesse_datenbank()
oVostamm2:schliesse_datenbank()
oDialog:destroy()
oMessage:anzeigen("Suchvorgang beendet")
oThread:quit()
RETURN .T.