Do While Schleife über Pushbutton abbrechen

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

sofort

Code: Alles auswählen

METHOD gedrueckt:execute()
       LOCAL nEvent := 0
       LOCAL mp1    := 0
       LOCAL mp2    := 0

       LOCAL oDialog := XbpDialog():new(,,,{150,150})
       LOCAL oPb
       LOCAL oXbp   := NIL

       MEMVAR lAbbruch

       oDialog:title := "Suche..."
       oDialog:create()
       CenterControl(oDialog)
       oPb := XbpPushButton():new(oDialog,,,{120,30})
       oPb:activate := {|| lAbbruch := .T.}
       oPb:caption  := "Abbruch mit Leertaste"
       oPb:create()
       CenterControl(oPb)
       SetAppFocus(oPb)
       DO WHILE ! ::terminated
          nEvent := AppEvent( @mp1, @mp2, @oXbp,1)
          oXbp:handleEvent( nEvent, mp1, mp2 )               <---- hier passiert das
          ::checkTermination()
       ENDDO
       oDialog:destroy()
RETURN self
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Hmm - dann mach doch mal ein

Code: Alles auswählen

if eXbp <> NIL
  oXbp:handleEvent( nEvent, mp1, mp2 )
endif
drum herum...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

nur mal so am Rande gefragt,

warum klappt das ohne Timoutangabe denn ?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Na wenn es ohne Tmieoutangabe klappt, dann ist doch OK!
Dann lass es so.
Mit timeoutangabe könnte ich mir vorstellen, dass er beim Anfang (das Objekt ist noch nicht erzeugt) bereits in der Schleife auf einen Event wartet.
Da Du aber den timeout relativ gering gestzt hast, existiert das Objekt beim Erreichen der Zeit noch nicht komplett.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

also es klappt ohne Timeout. Bei Deinem Vorschlag mit der Abfrage auf NIL, bleibt der Button stehen am Ende. Aber egal, ich bin zufrieden. Danke
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

:?:

Naja, Hauptsache es klappt.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Manfred,
entweder machst Du die Zeile

Code: Alles auswählen

oDialog:destroy()
mit in die :checkTermination (vor das ::quit) oder das ::quit in der :execute() hinter das oDialog:destroy()!!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen [ERLEDIGT]

Beitrag von Manfred »

ist doch noch nicht ganz erledigt.

Was müßte gemacht werden, wenn ich den PushButton NICHT im Thread habe, sondern vor dem Thread, aber Public. Wenn ich den dann enable() beim Start des Threads und nach dem Thread wieder disable(). Wie müßte der PushButton eingebunden werden, dass er während des Threads gedrückt werden kann um dann den Abbruch einzuleiten?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen [ERLEDIGT]

Beitrag von Martin Altmann »

Hallo Manfred,
dann müsstest Du alles tauschen - Deine Schleife zum Auswerten der Daten müsste dann im Thread laufen und das klicken auf den Pushbutton() müsste dann die :terminate()-Methode Deines Threads aufrufen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen [ERLEDIGT]

Beitrag von Manfred »

Ah, dachte ich mir schon sowas ähnliches.

Das ist mir aber für dieses Programm zu viel Aufwand. Dann muß ich die ganzen DB usw. übergeben, oder zusätzlich öffnen und was weiß ich.

Danke.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von AUGE_OHR »

Manfred hat geschrieben:

Code: Alles auswählen

METHOD gedrueckt:execute()
...
          nEvent := AppEvent( @mp1, @mp2, @oXbp,1)
          oXbp:handleEvent( nEvent, mp1, mp2 )               <---- hier passiert das
wenn du als 4th Parameter Timeout benutzt MUSST du

Code: Alles auswählen

nEvent := AppEvent( @mp1, @mp2, @oXbp,1)
DO CASE
    CASE nEvent = xbe_None // dies ist der Timeout Event !!!
OTHERWISE
    oXbp:handleEvent( nEvent, mp1, mp2 )
ENDCASE
verwenden !!!
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen [ERLEDIGT]

Beitrag von Manfred »

Prima,

da muß man aber studiert haben um das aus der Anleitung so herauszulesen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen [ERLEDIGT]

Beitrag von brandelh »

Hi,

sicherlich sind 2 Threads die eleganteste Lösung ... aber aus genau diesen Problemstellungen habe ich
meine Eventschleife am Ende des MAIN Programmes in eine Funktion ausgelagert, die ich mit einem 4.
Parameter z.B. für 1/10 Sekunde laufen lassen kann.

in elend langen do while schleifen, wird dann regelmäßig für 1/10 bzw. 1/100 Sekunde Events verarbeitet.
Die Grundidee stammt noch aus der Windows 3.1 Zeit, aber bis ich das mit den Threads drauf hatte war das ein
gangbarer Weg ;-)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Watt´n Mist,

jetzt habe ich das Teil hier in reinem GUI programmiert und da klappt alles so, wie es soll.

Nun muß ich es in einem Hybridmodus einbauen. Hier klappt es nicht. Irgendwie scheint der Thread wohl nicht die Sache beenden zu wollen. Muß irgendwas grundlegendes beachtet werden im Zusammenhang mit CRT Fenstern?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von brandelh »

Hi,

ja, du mußt die Abbruchbedingung mit Inkey() oder im READ ermitteln ;-)

Im Ernst, dem Thread als solches ist egal worin er läuft, vermutlich
setzt du die Abbruchbedingung nicht richtig.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von AUGE_OHR »

Manfred hat geschrieben:Muß irgendwas grundlegendes beachtet werden im Zusammenhang mit CRT Fenstern?
setAppWindow(oGUI) ?
wenn du GUI und CRT hast reicht ein setAppFocus(oPart) nicht aus, du brauchst auch setAppWindow(oFenster)

wenn ich nun "Abbruch" = "o:close := {||}" setzte würde ich das nun in den Codeblock machen.
Hubert hat geschrieben:ja, du mußt die Abbruchbedingung mit Inkey() oder im READ ermitteln
... und da sind wir bei der Frage ob SetMouse(.T.) für die CRT gesetzt wurde
den dann geht das durch GETsys.PRG UND GETsysX.PRG und man kann Events verarbeiten ...
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

manohman,

das war aber jetzt ein verzwickte Sache. Die Abbruchvar, die über den Button auf .T. gesetzt wurde habe ich in der Hektik nicht PUBLIC gesetzt, so war sie im Thread nicht bekannt. (ne Fehlermeldung gab es aber trotzdem nicht. ) Die Hauptursache, die den Dialog mit dem Button nicht verschwinden ließ, war, dass ich den Thread gekillt habe, bevor Dialog:destroy() gemacht wurde. Das ist mir aber bei dem GUI Programm nicht aufgefallen, weil der Dialog nicht in der Taskliste steht und nach dem Beenden sowieso weg ist. Aber über die Taskliste hätte ich gemerkt, dass immer mehr Tabs aufgehen.

Beim Hybridmodus ist es aufgefallen, weil das Hauptguifenster destroyed wird, aber der Dialog aus dem Thread nicht und den sieht man dann. Tja, dumm gelaufen, aber drauf gekommen. Das ist doch auch schon mal was.

Jetzt gab es noch mehr Futtsäcke, bzgl. Startposition und :setFrameState(). Das Guifenster hat sich diagonal nach oben rechts verschoben, als der Dialog vom Thread angezeigt wurde. ist aber jetzt anscheinend alles wieder im Lot.

Watt´n Mist.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Danke Jimmy, für den Tipp mit SetAppWindow() das fehlte mir auch noch.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

also irgendwas klappt mit dem Thread nicht so, wie es soll. (im Hybridmodus)

Der beendet sich nicht. Ich habe auch überhaupt noch nicht verstanden, wie das überhaupt klappen soll. :angry4: :angry5: :banghead:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von brandelh »

Hi,

zunächst muss man unterscheiden, ob dein Thread gestartet wird, einmal durchläuft (Schleife ?) und sich dann beendet (Option 1) oder ob du einen Thread hast, der sich selbst mit einem Intervall dauernd neu startet !

Ich habe z.B. Auswertungs und Druckroutinen in Threads ausgelagert.
Hier zunächst der function Code ohne Threads:

Code: Alles auswählen

public lAbbruch
... 
lAbbruch := .f.
...
DoAuswertung(...)

function DoAuswertung(...)
    do while ! eof()
        VerarbeiteEreignisse() // Eventloop etc... sonst blockiert die GUI. oder INKEY(.1)
        if lAbbuch
           exit
        endif
        If Suchbedingung
           ? " Ergebnis"
        endif
        skip
    enddo
return
Wichtig bei dieser Schleife war die Eventloop bzw. Tastatureingaben mittels INKEY(.1) zu bedienen, sonst steht das Programm in der Schleife ...
Die "Umstellung" war wirklich einfach ...

Code: Alles auswählen

public lAbbruch
... 
lAbbruch := .f.
...
oThread := Thread():New()
oThread:start("DoAuswertung",self,...)  // self bezieht sich hier auf das Fenster
...

function DoAuswertung(oWin,...) // über oWin habe ich Zugriff auf die GUI Elemente
    do while ! eof()
        if lAbbuch
           exit
        endif
        If Suchbedingung
           ? " Ergebnis"
        endif
    enddo
return
Die neue Funktion läuft in einem eigenen Thread, somit entfällt diese Zeile (und viel Mühe ;-) ) :
VerarbeiteEreignisse() // Eventloop etc... sonst blockiert die GUI. oder INKEY(.1)
Wenn man Inkey() abfragt, könnte man eventuell auch auf lAbbruch verzichten, da ja
die Tastatur bei CRT immer aktuell ist.
Die Abbruchbedingung wird in GUI per Tastatur oder Buttonclick ausgelöst und muss lAbbruch := .t. setzen.
Bei CRT kommt es halt darauf an, ob man aus GET / READ oder einer DO WHILE ... INKEY() Schleife steht.
Auf jeden Fall muss im Programm lAbbruch := .t. oder im Thread z.B. mit

Code: Alles auswählen

IF INKEY()=K_ESC 
    exit // oder lAbbruch := .t.
die Abbruchbedingung erkannt und an den Thread über die PublicVariable angezeigt werden.

Du könntest natürlich auch auf die SIGNAL() Klasse zurückgreifen (wie im COFFEE Beispiel) oder
aber eine Instanz-/lokal Variable als Parameter übergeben und somit zugänglich machen ...
das war Option 1, wenn du Option 2 nutzt, musst du oThread:setInterval(NIL) aufrufen.

Du solltest übrigens immer prüfen, ob der Thread noch aktiv ist:

Code: Alles auswählen

if oThread:active
   ... er läuft noch
else
   ... er ist zu ende (oder noch nicht gestartet) ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Hi Hubert,

hier mal das Teil

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
********************************************************************************
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von brandelh »

Hallo Manfred,

schau dir nochmal mein Beispiel an. Ich habe in meiner Auswertungsroutine die Tastaturabfragen rausgenommen und rufe diese Auswertungsroutine (die sich ihre Dateien selbst öffnet !!!) als getrennten Thread aus dem Fenster heraus auf !

Du hast eine Auswertungroutine die einen Thread generiert, der wieder erkennen soll ob eine Abbruchbedingung erfasst wird ... oder sehe ich das falsch ? Die ARBEIT muss in den Thread, die Oberflächenbedienung bleibt im Hauptprogramm (bzw. im GUI Thread).
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Hi Hubert,

nur noch mal zur Info. Unter GUI klappt es alles richtig (wie ich es so sehe.)

Unter Hybrid klappt es eigentlich auch, nur der Thread beendet sich nicht von selbst, bzw. wenn der Durchlauf beendet ist. Mit Tastendruck klappt es, da hört der auf und der Dialog verschwindet. Wenn man auf das "normale" Ende wartet, dann bleibt der Dialog, bis ich irgendwas rundherum bewege, oder anklicke.

So, jetzt schaue ich mir aber Dein Beispiel nochmal an.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21248
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 211 Mal
Danksagung erhalten: 71 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Übel,

ich stelle gerade fest, es ist noch ganz anders. Das was jetzt oben als Beispiel von mir steht klappt so, ich habe nur das Problem, dass beim 1.Start der Suche alles klappt. Wenn die Suche beendet ist und der Dialog mit dem Abbruchbutton verschindet, ich aber wieder ins SLE gehe und einen 2. Durchlauf starte, der Dialog mit dem Abbruchbuttun unter dem browse zu liegen kommt und somit vom user nicht mehr erkannt wird. Ab dann jedesmal.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von brandelh »

Hi,

bei Threads mit @say get Oberfläche hat man das Problem, dass die sich gegenseitig beinflussen.
Im Beispiel von Alaska mit COFFEE ... verwenden die deshalb NIE @SAY etc. sondern nur
DISPOUTAT() da diese Funktion den internen Cursor nicht bewegt, vielleicht ist es das was dich ärgert ;-)

Andererseits verwendest du doch GUI Elemente ... ist das eine "gemischte Anzeige" ?
Gruß
Hubert
Antworten