Seite 1 von 2

Uhrzeit in der Statusbar anzeigen

Verfasst: 26.12.2008 11:18
von TheSaint
Hallo Zusammen,

könnte mir bitte jemand auf die Sprünge helfen, was ich hier falsch mache?

Ich möchte in einer Statusbar die aktuelle Zeit anzeigen lassen.

Code: Alles auswählen

Procedure Zeit()
  Repeat
    zeit$=FormatDate("%hh:%ii:%ss", Date())
    StatusBarText(#StatusBar_0, 0, zeit$, #PB_StatusBar_Center)
    Delay(1000)
  ForEver
EndProcedure

Open_Window_0()
CreateThread(@Zeit(), "")
Bei CreateThread(@Zeit(), "") kommt immer die Fehlermeldung:
Falscher Parameter Typ, Zahl anstelle eines Strings erwartet.

Habe schon in der Hilfe gesehen und im Board gesucht.
Kriegs einfach nicht hin.

Wäre toll, wenn mir jemand helfen könnte.

Vielen Dank schon mal und viele Grüße

Verfasst: 26.12.2008 11:27
von Andesdaf
Erstens solltest du ein besseres Beispiel parat haben als diesen Schnipsel,
denn daraus kann man wenig lesen. Es gibt weder Open_Window_0() oder
#StatusBar_0, aber das ist ja nicht dein Problem.

Zweitens brauchst du doch dafür keinen Thread, oder?

Verfasst: 26.12.2008 11:46
von THEEX

Code: Alles auswählen

If OpenWindow(0, 0, 0, 200, 200, "StatusBar Zeit")
  CreateStatusBar(0, WindowID(0))
    AddStatusBarField(100)

  Repeat
    StatusBarText(0, 0, FormatDate("%hh:%ii:%ss", Date()))
    
    event = WaitWindowEvent(1)
  Until Event = #PB_Event_CloseWindow
EndIf
@TheSaint
Delay(1000) laß mal besser, das hält Dein Programm immer für eine Sekunde vollständig an.

Verfasst: 26.12.2008 11:48
von TheSaint
Hallo Andesdaf,

danke für Deine Nachricht.
Sorry, dass ich anscheinend zu wenige Informationen gegeben habe.

Es ist einfach so, dass ich hiermit die laufende Uhrzeit unten
in einer StatusBar anzeigen möchte.
Leider komme ich über diese Fehlermeldung nicht hinaus weg.

Dachte man braucht dazu einen Thread...

Bin halt Anfänger. Sorry

Trotzdem vielen Dank.

Viele Grüßé

Verfasst: 26.12.2008 11:55
von TheSaint
Hallo THEEX,

vielen Dank für Deine Hilfe und Deinen Tipp.
Funktioniert super.

Schönen Tag noch und viele Grüße

Verfasst: 26.12.2008 12:38
von Kiffi
ich persönlich würde es über einen Timer machen. Dann wird
StatusBarText() nur einmal pro Sekunde aufgerufen und nicht jedes Mal,
wenn der WaitWindowEvent()-Timeout abgelaufen ist.

Code: Alles auswählen

Procedure ShowTime(hwnd, uMsg, idEvent, dwEvent)
    StatusBarText(0, 0, FormatDate("%hh:%ii:%ss", Date()))
EndProcedure

If OpenWindow(0, 0, 0, 200, 200, "StatusBar Zeit")
  
  CreateStatusBar(0, WindowID(0))
  AddStatusBarField(100)
  
  SetTimer_(WindowID(0), 0, 1000, @ShowTime()) ; und dann nur noch jede Sekunde
  
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
  
EndIf
Grüße ... Kiffi

// Edit: ShowTime() um 4 Parameter erweitert.

Verfasst: 26.12.2008 13:18
von Kaeru Gaman
der Gedanke mit dem Thread war schon mal grundsätzlich nicht schlecht.
dein problem war, dass er , wie er sagte, eine zahl will keinen string.
außerdem solltest du auch bei der Prozedurdefinition ein Dummy-Argument einsetzen.

also

Code: Alles auswählen

Procedure Zeit( dummy.l ) 
;...
CreateThread(@Zeit(), 0 )

das kannst du ruhig nochmal probieren, damit du's mal zum laufen gebracht hast,
auch wenn du's nachher anders machst. ;)


das was Kiffi hier vorgestellt hat, ist ein Callback, hier mit einem Timer.
das ist für sowas tatsächlich die günstigste vorgehensweise.
hierbei läuft der Nebenprozess nicht permanent, sondern nur bei bedarf.

beim Einrichten sagt man dem Betriebssystem gleichsam, "wenn dasundas eintritt, ruf mich zurück"
in diesem Fall ist das Ereignis ein timer, und der Zurückgerufene die Proc ShowTime()


die von EX vorgeschlagene Lösung funktioniert natürlich auch,
die hat in anderen Anwendungsbereichen ihren Vorteil.
z.B. bei permanenten Animationen, wie Aktualisierungen von Graphen,
oder aber bei Games im WindowedScreen.


... hoffe, die Backgroundinfos haben das ganze noch etwas aufgeklärt.

Verfasst: 26.12.2008 14:03
von Andesdaf
auf das einfachste kommt man nicht, einfach ein dummes Argument einsetzen
und schon kein Problem mehr...

man lernt immer dazu... :wink:

Verfasst: 26.12.2008 14:05
von ts-soft
Noch ein Hinweis zu Kiffis Beispiel: TimerCallback hat 4 parameter, diese
sollten auch vorhanden sein, egal ob genutzt oder nicht. Früher oder später
gibts nen Crash, weil die parameter ins Nirwana gesendet werden.

Verfasst: 26.12.2008 14:31
von Kiffi
ts-soft hat geschrieben:Noch ein Hinweis zu Kiffis Beispiel: TimerCallback hat 4 parameter
ja, vergesse ich immer wieder. ;-)
Habe es oben korrigiert. Danke für den Hinweis!

Grüße ... Kiffi