http://www.folker-linstedt.de/pureforum/ICONS.zip

Hallo Fans,
da ich nie richtig verstanden habe, wie die CreateGadget() Lib funktioniert hat und die so weit ich das mitbekommen hatte, nur mit Windows läuft ...
hatte ich mir mal was überlegt ... wie ich eigene Gadgets erstellen kann und noch Zugriff auf deren Funktion habe, ohne es unnötig kompliziert bzw. komplex zu gestalten.
HINWEIS: Es ist nur ein Test, deshalb auch nicht bei Tipps und Tricks, sondern hier. Ich bin mir nämlich nicht sicher, ob ich eine ideale Lösung gefunden habe. Würde mich freuen, wenn jemand sich den Code mal anschauen kann und ihn so ändert, dass er das gleiche macht, aber die Lösung weit eleganter ist. Vielen Dank im Voraus.
Code: Alles auswählen
;/ Autor : Folker Linstedt
; Anfang: 2008-06-18
; Stand : 2008-06-18
EnableExplicit
Global PreferenceFile.s=GetHomeDirectory()+"FL_ZEIT.INI"
Procedure.s GetUserName()
; Methode nur auf Windows-Systemen
ProcedureReturn StringField(GetHomeDirectory(),3,"\")
EndProcedure
Global PfadDB.s="C:\F\PureBasic\Icons\Symbole\Lampen\"
Global XX, YY
Structure GType
GN.l
VGad.l
Regel.l
EndStructure
Global NewList MyGad.GType()
Procedure AddMyGad(F,VGad=-1,Regel=0)
AddElement(MyGad())
MyGad()\GN=F
MyGad()\VGad=VGad ; Nachteil: Es kann ein Gadget nur ein anderes beeinflussen
MyGad()\Regel=Regel
ProcedureReturn F
EndProcedure
If OpenPreferences(PreferenceFile)
XX=ReadPreferenceLong("X_POS", 100)
YY=ReadPreferenceLong("Y_POS", 100)
ClosePreferences()
EndIf
Procedure TimeGadegt(x,y,S$="Zeit:",I$="ICON",C=$FFE0F0)
Protected F, T, H=-30,K=-10, GG, SP
F=AddMyGad(ContainerGadget(#PB_Any, x,y,150+K,50,#PB_Container_Flat))
SetGadgetColor(F,#PB_Gadget_BackColor,C)
AddMyGad(ImageGadget(#PB_Any,3,5,32,32,ImageID(LoadImage(#PB_Any,PfadDB+I$+".ICO"))))
If S$="Zeit:"
Else
S$=S$+"zeit:"
EndIf
F=AddMyGad(TextGadget(#PB_Any,40,3,60,18,S$))
SetGadgetColor(F,#PB_Gadget_BackColor,C)
F=AddMyGad(TextGadget(#PB_Any,70+H,23,20,18,"sec"))
SetGadgetColor(F,#PB_Gadget_BackColor,C)
F=AddMyGad(TextGadget(#PB_Any,117+K,3,40,18,"1:00"))
SetGadgetColor(F,#PB_Gadget_BackColor,C)
GG=F
F=AddMyGad(SpinGadget(#PB_Any,90+H,22,50,23,0,3600,#PB_Spin_Numeric),GG,1) ; Einheit Minuten
SetGadgetState(F,60)
CloseGadgetList()
EndProcedure
Procedure GadHandling(GadgetNr)
ForEach MyGad()
If GadgetNr=MyGad()\GN
If MyGad()\Regel ;/ Gibt ja nur eine Regel bis jetzt
SetGadgetText(MyGad()\VGad, Str(GetGadgetState(MyGad()\GN)/60)+":"+RSet(Str(GetGadgetState(MyGad()\GN)%60),2,"0"))
;/ Regel könnte von GadgetType abhängig gemacht werden
EndIf
EndIf
Next
EndProcedure
Procedure CreateGadgets()
Protected S$, i, J=5
;If ExamineDirectory(0,PfadDB+"Zeit\","*.ICO")
If ExamineDirectory(0,PfadDB,"*.ICO")
i=0
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
S$=Left(DirectoryEntryName(0),Len(DirectoryEntryName(0))-Len(GetExtensionPart(DirectoryEntryName(0)))-1)
;Debug S$
If S$<>"ICON"
; Diese Formel funktioniert nur, wegen der Rundung ;-)
TimeGadegt(30+142*(i/J),10+52*(i-(i/J)*J),S$,S$,RGB(Random(55)+200,Random(100)+155,Random(25)+230))
i+1
EndIf
Else
EndIf
Wend
FinishDirectory(0)
EndIf
EndProcedure
If OpenWindow(0,XX,YY,640,480,"FL-ZEIT - User: "+GetUserName(),#PB_Window_SystemMenu|#PB_Window_MinimizeGadget) And CreateGadgetList(WindowID(0))
CreateGadgets()
Define Event, GadgetNr, Quit=0, i
ForEach MyGad()
; Debug Str(MyGad()\GN)+" "+Str(GadgetType(MyGad()\GN))
Next
Repeat
Event=WaitWindowEvent(50)
If Event=#PB_Event_Gadget
GadgetNr=EventGadget()
GadHandling(GadgetNr)
ElseIf Event=#PB_Event_CloseWindow
Quit=1
EndIf
Until Quit
CreatePreferences(PreferenceFile)
WritePreferenceLong("X_POS",WindowX(0))
WritePreferenceLong("Y_POS",WindowY(0))
ClosePreferences()
CloseWindow(0)
EndIf
Im QuellCode wird ein Pfad benutzt, dieser beinhaltet bei mir
ein paar Symbole mit folgenden Bezeichnungen:
Back.ICO
Wasch.ICO
Warte.ICO
Zyklus.ICO
Trocken.ICO
Kühl.ICO
... etc.
Die Icons sind 32 x 32
Der Name wird dann gleich zur Angabe der jeweiligen Zeit.
Aus Back.ICO wird Backzeit:
