XbpBrowse refreshen [Erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpBrowse refreshen [Erledigt]

Beitrag von AUGE_OHR »

brandelh hat geschrieben:
AUGE_OHR hat geschrieben:

Code: Alles auswählen

xbe_None
IST ein Event der NUR durch den 4th Parameter von AppEvent ausgelöst wird.
das stimmt nicht.
xbe_None ist der Wert, der von AppEvent zurückgegeben wird, wenn KEIN EVENT sondern ein TIMEOUT (4. Parameter) die Funktion beendet hat :!:
hm ... KEIN EVENT heist NIL und was einen Wert hat, auch wenn er 0 ist, IST ein EVENT.

... aber egal es geht ja darum das xbe_None NUR beim 4th Parameter von AppEvent() auftritt.
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: XbpBrowse refreshen [Erledigt]

Beitrag von Tom »

Jimmy hat völlig recht. AppEvent() wartet standardmäßig auf ein Event - irgendeines. Wenn dann ein solches Eintritt, ist der Rückgabewert entsprechend. Ist aber der Timeout-Parameter gesetzt und wird bis dahin kein Event erzeugt, entsteht das Event "xbe_None". Eine andere Möglichkeit, aus AppEvent() diesen Wert zu erhalten, gibt es nicht.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpBrowse refreshen [Erledigt]

Beitrag von brandelh »

Also TOM, normalerweise setzt du dich so auf die sprachliche Genauigkeit.

AppEvent() wartet bis ein Event auftritt, also ohne 4. TimeOut Parameter kommt das nicht vor, dass "xbe_None" auftritt.
Ein EVENT ist ein Ereignis, dass vom Betriebssystem an die EXE gemeldet wird. Xbase filtert ordentlich ab und wartet auf die uns bekannten Events.
Außer wir legen einen TIMEOUT fest. Die Rückgabe ist aber nicht der Event selbst (also das Ereignis Maus bewegt sich), sondern einen numerische Wert, den wir als Konstante angeben.
Und wenn bis zum TimeOut eben KEIN EVENT aufgetreten ist, wird "#define xbe_None 0" zurückgeliefert.
Eben die Kennzeichnung dass in der gewünschten Zeit ist KEIN Event aufgetreten, daher wird auch nichts ausgeführt.

Aber da ich ja nicht die letzte Instanz bin, hilft ein Blick in die sehr gute Hilfe zu AppEvent():
Der Rückgabewert von AppEvent() ist ein numerischer Code, der das Ereignis kennzeichnet, das aus der Warteschlange entfernt wurde.
In der Regel sind das Ereignisse, die von der Tastatur oder von der Maus ausgelöst wurden.
Die #include-Datei APPEVENT.CH enthält #define-Konstanten für die numerischen Ereigniscodes.
Wird für <nTimeOut> ein Wert größer als 0 angegeben, gibt die Funktion spätestens nach Ablauf dieses Zeitintervalls einen Ereigniscode zurück.
Falls innerhalb dieser Zeitspanne kein Ereignis eingetreten ist, wird xbe_None zurückgegeben und alle per Referenz übergebenen Parameter haben den Wert NIL.
Im Prinzip ist das so wie bei den Filefunktionen, die Fehlercodes zurückmelden, wenn 0 kommt bedeutet das KEIN FEHLER ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpBrowse refreshen [Erledigt]

Beitrag von AUGE_OHR »

hi,

du siehst AppEvent() nur im Zusammenhang mit Xbase++ wo ja alles mögliche "ausgefiltert" wird.
tatsächlich hat aber jedes Windows Control eine Event Schleife.

nun gibt es xbe_None = 0 NICHT in der Windows API sondern ist ein Zusatz von Xbase++
der auf den 4th Parameter ausgelegt ist den es ebenfalls NICHT in der Windows API gibt.

auch lautet die Abfrage

Code: Alles auswählen

CASE nEvent = xbe_None
wie bei jedem anderen Xbase++ (!) Event auf den man reagieren kann.
ich würde also xbe_None wie auch "User Define Events" als Xbase++ (!) Event ansehen.

der Vergleich mit Datei Funktionen hinkt denn ein "richtiger" Event ist entweder ein WM_* ( Windows Message ) oder eine "Notify Message"
welches exakt durch die Windows API definiert ist und nichts mit einem Fehlercode als "Rückgabe" zu tun hat.

***

es ging mir nur darum hinzuweisen das sich in einer Xbase++ Event Loop NICHT automatisch was "bewegt" und man zu den Abfragen ( IF / CASE ) kommt.
Nur wenn ein "auswertbarer" Xbase++ Event von AppEvent() aus der Windows Queue entfernt werden kann findet eine Reaktion statt.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpBrowse refreshen [Erledigt]

Beitrag von brandelh »

wenn du es so sehen willst :roll:
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: XbpBrowse refreshen

Beitrag von satmax »

Verstehe ich hier etwas falsch oder hört dieser "Timer" um Mitternacht auf? Dann ist doch nNextRefresh den ganzen Tag kleiner wie seconds().
Tom hat geschrieben:Huberts Vorschlag müsste mit einer kleinen Änderung eigentlich gut funktionieren:

Code: Alles auswählen

nNextRefresh := 0
cFile := pfadExe() + pfadDaten() + "knx.dbf" // bleibt gleich, also auslagern
DO WHILE .T.
   nEvent := AppEvent(@mp1, @mp2, @oXbp, 100 )  // spätestens 1 Sekunde beenden
   if nEvent # xbe_None
      oXbp:handleEvent(nEvent, mp1, mp2)
   endif // weil das Refresh sonst bei keinem Event - xbe_None - nie ausgelöst würde
   if nNextRefresh < seconds()
       nNextRefresh := seconds() + 5 // alle 5 Sekunden
       aDirectory := Directory(cFile)
       // wenn das mal gut geht, bei den aktuellen Metadaten ... und bei SQL ?
       IF .NOT. aDirectory[1][F_WRITE_TIME]== cAktuelleZeit
          oBrowse:refreshAll()
          cAktuelleZeit := aDirectory[1][F_WRITE_TIME]
       ENDIF
   endif
ENDDO
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: XbpBrowse refreshen [Erledigt]

Beitrag von brandelh »

stimmt, den Tageswechsel muss man berücksichtigen und die Variable zurücksetzen
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: XbpBrowse refreshen [Erledigt]

Beitrag von satmax »

OK, ich mach das in etwa so:

Code: Alles auswählen

nTimeStamp:= DateToNum(dtos(date())+ Str(INT(TimeToSec())- pub_oIniSetting:nCheckTime ))  
Nehme also Datum und Zeit, mache einen gemeinsamen String daraus, entferne alle nicht numerischen Zeichen und wandel es in eine Zahl, sollte IMHO (fast) ewig laufen. :)
Gruß
Markus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpBrowse refreshen [Erledigt]

Beitrag von AUGE_OHR »

brandelh hat geschrieben:stimmt, den Tageswechsel muss man berücksichtigen und die Variable zurücksetzen
bei einem Tageswechsel fängt Seconds() wieder bei 0 an ( max 14400 )
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2121
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 72 Mal

Re: XbpBrowse refreshen [Erledigt]

Beitrag von Werner_Bayern »

AUGE_OHR hat geschrieben:bei einem Tageswechsel fängt Seconds() wieder bei 0 an ( max 14400 )
86400 :!:
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpBrowse refreshen [Erledigt]

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:
AUGE_OHR hat geschrieben:bei einem Tageswechsel fängt Seconds() wieder bei 0 an ( max 14400 )
86400 :!:
uups ... ja 1440 Minuten -> 86400 Sekunden.
gruss by OHR
Jimmy
Antworten