;-------- 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 = 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$) 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 ; IDE Options = PureBasic v4.00 - Beta 11 (Windows - x86) ; CursorPosition = 27 ; Folding = - ; EnableAsm ; Executable = Systraytimer.exe ; DisableDebugger