;-------- Tages-Timer mit Anzeige der verbleibenden Restzeit (Stunden und Minuten) im Systray ;-------- "Helle" K.Helbing, 01.05.2006 ;-------- PureBasic V4.00 Beta 11 Global *MEMDATA.l = 0 Global IDATA.b = 0 Global MINUTE.l = 0 Global OLDMINUTE.l = 60 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$) For x = 0 To 6 ;Werte für Einer-Minute 0-9 PokeB(*MEMDATA + 135 + (x * 4) , PeekB(*MEMDATA + 198 + (Z * 7) + x)) Next x If Len(MINUTE$) <> 1 ZM$ = Left(MINUTE$,1) Z = Val(ZM$) For x = 0 To 6 ;Werte für Zehner-Minute 1-5 PokeB(*MEMDATA + 134 + (x * 4) , PeekB(*MEMDATA + 198 + (Z * 7) + x)) Next x Else For x = 0 To 6 ;Werte für Zehner-Minute 0 PokeB(*MEMDATA + 134 + (x * 4) , PeekB(*MEMDATA + 198 + x)) Next x EndIf STUNDE$ = Str(STUNDE) EH$ = Right(STUNDE$,1) Z = Val(EH$) For x = 0 To 6 ;Werte für Einer-Stunde 0-9 PokeB(*MEMDATA + 171 + (x * 4) , PeekB(*MEMDATA + 198 + (Z * 7) + x)) Next x If Len(STUNDE$) <> 1 ZH$ = Left(STUNDE$,1) Z = Val(ZH$) For x = 0 To 6 ;Werte für Zehner-Stunde 1-2 PokeB(*MEMDATA + 170 + (x * 4) , PeekB(*MEMDATA + 198 + (Z * 7) + x)) Next x Else For x = 0 To 6 ;Werte für Zehner-Stunde 0 PokeB(*MEMDATA + 170 + (x * 4) , PeekB(*MEMDATA + 198 + x)) Next x EndIf Icon = CatchImage(0, *MEMDATA) ChangeSysTrayIcon(0, Icon) 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 ;----------------------------------------------------------------------- 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 ; IDE Options = PureBasic v4.00 - Beta 11 (Windows - x86) ; CursorPosition = 8 ; Folding = - ; EnableAsm ; Executable = Systraytimer.exe ; DisableDebugger