Code: Alles auswählen
;-------- Tages-Timer mit Anzeige der verbleibenden Restzeit (Stunden und Minuten) im Systray
;-------- "Helle" K.Helbing, 30.04.2006
;-------- PureBasic V4.00 Beta 11
Global *MEMDATA.l = 0
Global IDATA.b = 0
Global ZIFFER.b = 0
Global ZIFFERWO.l = 0
Global ZIFFERART.l = 0
Global ZIFFER0.l = 198
Global ZIFFER1.l = 205
Global ZIFFER2.l = 212
Global ZIFFER3.l = 219
Global ZIFFER4.l = 226
Global ZIFFER5.l = 233
Global ZIFFER6.l = 240
Global ZIFFER7.l = 247
Global ZIFFER8.l = 254
Global ZIFFER9.l = 261
Global ZIFFERLO.l = 170 ;1.Ziffer links oben: 170, 174, 178, 182, 186, 190, 194
Global ZIFFERRO.l = 171 ;2.Ziffer rechts oben: 171, 175, 179, 183, 187, 191, 195
Global ZIFFERLU.l = 134 ;3.Ziffer links unten: 134, 138, 142, 146, 150, 154, 158
Global ZIFFERRU.l = 135 ;4.Ziffer rechts unten: 135, 139, 143, 147, 151, 155, 159
Global MINUTE.l = 0
Global OLDMINUTE.l = 0
Global STUNDE.l = 0
Global AUSM.l = 00 ;<======== Timer-Ende Minute, frei einstellbar z.B. über ein Menü
Global AUSH.l = 20 ;<======== Timer-Ende Stunde, Timer-Ereignis hier also 20:00 Uhr
Global TIME1.l = 0
Global TIME2.l = 0
Global TIME3.l = 0
Global FILEL.l = 0
;-------- TIME1 berechnen, evtl. Plausibilitätsprüfung
TIME1 = AUSH
TIME1 * 60
TIME1 + AUSM
;-------- Wird nur benötigt, wenn Shutdown des Systems das Ziel sein soll
SystemDir$ = Space(255)
FILEL = GetSystemDirectory_(SystemDir$, 255)
SystemDir$ = Left(SystemDir$, FILEL)
ShutDown$ = SystemDir$ + "\Shutdown.exe"
;--------
OpenWindow(0, 0, 2000,0, 0, "Countdown läuft...") ;Window ab ins Nirwana
*MEMDATA = AllocateMemory(268) ;198 Bytes komplettes Icon plus 10x7 Bytes für die 10 Ziffern
;-------- Alle Daten einlesen
Restore ICONDATA
For x = 0 To 267
Read IDATA
PokeB(*MEMDATA + x , IDATA)
Next x
;--------
;-------- Erstmal ein Icon anzeigen
Icon = CatchImage(0, *MEMDATA) ;Art und Grösse des Images werden aus den Header-Daten ermittelt
AddSysTrayIcon(0, WindowID(0), Icon)
;--------
IMMERWIEDER:
Delay(1000) ;belastet das System praktisch nicht
;---------------- Countdown-Anzeige
MINUTE = Minute(Date())
If MINUTE <> OLDMINUTE
OLDMINUTE = MINUTE
TIME2 = Hour(Date())
TIME2 * 60
TIME2 + Minute
TIME3 = TIME1 - TIME2
If TIME3 < 0
TIME3 + 1440 ;24*60
EndIf
STUNDE = TIME3 / 60
MINUTE = TIME3 - (STUNDE * 60)
MINUTE$ = Str(MINUTE)
EM$ = Right(MINUTE$,1)
Z = Val(EM$)
Gosub ZIFFERIS ;liefert ZIFFERART
ZIFFERWO = ZIFFERRU
Gosub ZIFFERSETZ
Icon = CatchImage(0, *MEMDATA)
ChangeSysTrayIcon(0, Icon)
If Len(MINUTE$) <> 1
ZM$ = Left(MINUTE$,1)
Z = Val(ZM$)
Gosub ZIFFERIS
ZIFFERWO = ZIFFERLU
Gosub ZIFFERSETZ
Icon = CatchImage(0, *MEMDATA)
ChangeSysTrayIcon(0, Icon)
Else
ZIFFERART = ZIFFER0
ZIFFERWO = ZIFFERLU
Gosub ZIFFERSETZ
Icon = CatchImage(0, *MEMDATA)
ChangeSysTrayIcon(0, Icon)
EndIf
STUNDE$ = Str(STUNDE)
EH$ = Right(STUNDE$,1)
Z = Val(EH$)
Gosub ZIFFERIS
ZIFFERWO = ZIFFERRO
Gosub ZIFFERSETZ
Icon = CatchImage(0, *MEMDATA)
ChangeSysTrayIcon(0, Icon)
If Len(STUNDE$) <> 1
ZH$ = Left(STUNDE$,1)
Z = Val(ZH$)
Gosub ZIFFERIS
ZIFFERWO = ZIFFERLO
Gosub ZIFFERSETZ
Icon = CatchImage(0, *MEMDATA)
ChangeSysTrayIcon(0, Icon)
Else
ZIFFERART = ZIFFER0
ZIFFERWO = ZIFFERLO
Gosub ZIFFERSETZ
Icon = CatchImage(0, *MEMDATA)
ChangeSysTrayIcon(0, Icon)
EndIf
EndIf
;-------- Test, ob Ausschalt-Zeit erreicht
If TIME3 = 0
;RunProgram(Shutdown$, " -s -f -t 0", "", 2) ;bei Bedarf "scharfschalten"
EndIf
Goto IMMERWIEDER ;tuts für diesen Demo-Zweck
;-------- Unterprogramm in MEMDATA die richtige Ziffer an die richtige Stelle setzen
ZIFFERSETZ:
For x = 0 To 6
ZIFFER = PeekB(*MEMDATA + ZIFFERART + x)
PokeB(*MEMDATA + ZIFFERWO + (x * 4) , ZIFFER)
Next x
Return
;--------
;-------- Unterprogramm Ziffern-Zuordnung
ZIFFERIS:
If Z = 0 : ZIFFERART = ZIFFER0 : Return : EndIf
If Z = 1 : ZIFFERART = ZIFFER1 : Return : EndIf
If Z = 2 : ZIFFERART = ZIFFER2 : Return : EndIf
If Z = 3 : ZIFFERART = ZIFFER3 : Return : EndIf
If Z = 4 : ZIFFERART = ZIFFER4 : Return : EndIf
If Z = 5 : ZIFFERART = ZIFFER5 : Return : EndIf
If Z = 6 : ZIFFERART = ZIFFER6 : Return : EndIf
If Z = 7 : ZIFFERART = ZIFFER7 : Return : EndIf
If Z = 8 : ZIFFERART = ZIFFER8 : Return : EndIf
If Z = 9 : ZIFFERART = ZIFFER9 : Return : EndIf
;-----------------------------------------------------------------------
DataSection
;-------- Header eines 16x16-Icons mit 2 "Farben", bleibt konstant
ICONDATA:
Data.b 0, 0, 1, 0, 1, 0, 16, 16, 2, 0 ,0 ,0, 0, 0, 176, 0
Data.b 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 16, 0, 0, 0, 32, 0
Data.b 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0
Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 0, 0, 0, 0
;-------- Ab hier den "Rest" der Icon-Datei mit Null auffüllen, nimmt dann die Bit-Muster
;-------- der Ziffern auf bzw. füllt den Abstand zwischen obere und untere Ziffern (255) aus
;-------- Auffüllen mit Null, weil die Ziffern-Werte durch Null-Words getrennt werden
Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data.b 0, 0, 0, 0, 0, 0
;-------- Bit-Muster der Ziffern 0 bis 9, beginnt ab Offset 134 des Icons.
;-------- Hier kann sich jeder künstlerisch betätigen
Data.b 195, 189, 189, 189, 189, 189, 195 ;Ziffer 0 ab Adresse 198 im Speicher
Data.b 247, 247, 247, 247 ,247, 247, 231 ;Ziffer 1
Data.b 129, 191, 191, 129, 253, 253, 129 ;Ziffer 2
Data.b 131, 253, 253, 193, 253, 253, 131 ;Ziffer 3
Data.b 247, 247, 247, 129, 183, 183, 191 ;Ziffer 4
Data.b 129, 253, 253, 129, 191, 191, 129 ;Ziffer 5
Data.b 195, 189, 189, 131, 191, 191, 193 ;Ziffer 6
Data.b 239, 247, 247, 251, 253, 189, 129 ;Ziffer 7
Data.b 195, 189, 189, 129, 189, 189, 195 ;Ziffer 8
Data.b 195, 253, 253, 193, 189, 189, 195 ;Ziffer 9
EndDataSection

Und bitte nicht das GOTO anmeckern!
Gruss
Helle