UserGuide - Verwalten mehrerer Fenster mit unterschiedlichem Inhalt
Im vorangegangenen Artikel haben wir einen Weg untersucht, wie ein Programm mehrere Ausgaben eines einzelnen Fenster-Typs unterstützen kann. In diesem Artikel möchten wir dieses Konzept weiter ausbauen - indem wir ein Programm entwickeln, welches mehrere Instanzen unterschiedlicher Fenster unterstützt, in diesem Fall drei:- Das Schalter (Button) Fenster – beinhaltet ein ListView und zwei Schalter (Buttons) genannt 'Add' und 'Remove'. Wenn der Schalter 'Add' (Hinzufügen) angeklickt wird, dann wird eine Zufallszahl zum ListView hinzugefügt. Wenn der Schalter 'Remove' (Entfernen) angeklickt wird, dann wird der gerade im ListView ausgewählte Eintrag entfernt.Jedes Fenster besitzt eine Menüleiste mit Einträgen zum Erstellen einer neuen Instanz jedes der drei unterstützten Fenstertypen oder zum Schließen des aktuellen Fensters.
- Das Datums (Date) Fenster – beinhaltet ein ListView und zwei Schalter der gleichen Art wie beim Schalter-Fenster, besitzt jedoch auch ein CalendarGadget, das Fenster-Layout wird wegen dieses zusätzlichen Gadgets angepasst. Wenn der Schalter 'Add' angeklickt wird, dann wird das aktuell ausgewählte Datum zum ListView hinzugefügt. - Das Schieberegler (Track) Fenster - beinhaltet zwei TrackBars, mit einem Wert zwischen 0 und 100, und ein StringGadget. Wenn die Schieberegler bewegt werden, dann wird das StringGadget aktualisiert - mit dem Wert des zweiten Schiebereglers subtrahiert vom ersten.
*ThisData = ActiveWindows(ThisKey) *ThisData\ListView ...Jeder Prozedur weiß nur, wie ein Typ von Fenster verwaltet werden kann - daher überprüfen wir vor den weiteren Schritten den WindowClass Wert, um sicherzugehen, dass ein Fenster mit einem korrekten Typ als Argument übermittelt wurde, etwa so hier:
If *ThisData\WindowClass <> #WindowClassButtonDie Ereignis-Schleife ist ebenfalls etwas anders. Für jeden Ereignis-Typ gibt es eine Bestimmung wie folgt:
; Verwende *EventGadgets\WindowClass, um die korrekte Prozedur zur Größenänderung des Fensters aufzurufen. Select *EventtGadgets\WindowClass ...Obwohl die Speicherreservierungen letztlich von den CreateWindow Prozeduren des Typs BUTTONWINDOW, DATEWINDOW bzw. TRACKWINDOW durchgeführt werden, können wir hier trotzdem *EventGadgets verwenden, da dies im BASEWINDOW Typ definiert wurde, und BASEWINDOW die "Vorgänger-Struktur" (welche vererbt wird) für die anderen Strukturen ist.
;- Konstanten
#DateFormat = "%dd/%mm/%yyyy"
;- Enumerations
Enumeration
#WindowClassButton = 1
#WindowClassDate
#WindowClassTrack
EndEnumeration
; Die Menü-Befehle sind die gleichen bei allen Fenstern.
Enumeration
#MenuNewButton
#MenuNewDate
#MenuNewTrack
#MenuClose
EndEnumeration
;- Strukturen
Structure BASEWINDOW
WindowClass.i
Menu.i
EndStructure
Structure BUTTONWINDOW Extends BASEWINDOW
ListView.i
AddButton.i
RemoveButton.i
EndStructure
Structure DATEWINDOW Extends BASEWINDOW
Calendar.i
AddButton.i
RemoveButton.i
ListView.i
EndStructure
Structure TRACKWINDOW Extends BASEWINDOW
TrackBar1.i
TrackBar2.i
Label.i
Difference.i
EndStructure
;- Variablen
; Diese Map wird alle aktiven Fenster (wie zuvor) verwalten, da sich jedoch die Strukture für jede
; Fenster-Klasse unterscheidet, werden wir Zeiger auf die Strukturen (und nicht direkt die
; Gadget-Referenzen) in der Map speichern.
NewMap ActiveWindows.i()
; Diese Werte werden verwenden, um neuen Fenstern ein eindeutige Kennzeichnung zu geben.
Define.i Buttons, Dates, Tracks
; Ereignis-Variablen.
; Beachte den Typ von *EventGadgets.
Define.i Event, EventWindow, EventGadget, EventType, EventMenu, EventQuit
Define.s EventWindowKey
Define *EventGadgets.BASEWINDOW
;- Button (Schalter) Fenster
Procedure.i CreateButtonWindow()
; Erstellt ein neues Button Fenster und fügt es zur überwachenden Map hinzu,
; reserviert Speicher für die Gadget-Referenzen, erstellt die Gadgets
; und speichert deren Referenzen in der Speicher-Struktur.
Shared Buttons, ActiveWindows()
Protected *ThisData.BUTTONWINDOW
Protected.i ThisWindow
Protected.s ThisKey, ThisTitle
; Festlegen des Fenstertitels.
Buttons + 1
ThisTitle = "Button Window " + StrU(Buttons)
; Öffnen des Fensters.
ThisWindow = OpenWindow(#PB_Any, 30, 30, 225, 300, ThisTitle, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
; Überprüfen, dass der OpenWindow Befehl erfolgreich funktioniert hat.
If ThisWindow
; Minimale Fenstergröße festlegen.
WindowBounds(ThisWindow, 220, 100, #PB_Ignore, #PB_Ignore)
; Umwandeln der Fenster-Referenz in einen String, um diesen als Schlüssel für die Map zu verwenden.
ThisKey = StrU(ThisWindow)
; Reserviert Speicher, um darin die Gadget-Referenzen zu speichern.
*ThisData = AllocateMemory(SizeOf(BUTTONWINDOW))
EndIf
; Überprüfen, dass die Speicherreservierung erfolgreich war.
If *ThisData
; Speichern der Fenster-Referenz und der Speicherzeiger-Werte in der Map.
ActiveWindows(ThisKey) = *ThisData
; Festlegen der Fenster-Klasse.
*ThisData\WindowClass = #WindowClassButton
; Erstellen der Menüleiste.
*ThisData\Menu = CreateMenu(#PB_Any, WindowID(ThisWindow))
; Wenn die Menü-Erstellung erfolgreich war, die Menü-Einträge erstellen.
If *ThisData\Menu
MenuTitle("Window")
MenuItem(#MenuNewButton, "New Button Window")
MenuItem(#MenuNewDate, "New Date Window")
MenuItem(#MenuNewTrack, "New Track Window")
MenuItem(#MenuClose, "Close Window")
EndIf
; Erstellen der Fenster-Gadgets.
*ThisData\ListView = ListViewGadget(#PB_Any, 10, 10, 200, 225)
*ThisData\AddButton = ButtonGadget(#PB_Any, 15, 245, 90, 30, "Add")
*ThisData\RemoveButton = ButtonGadget(#PB_Any, 115, 245, 90, 30, "Remove")
Else
; Speicherreservierung fehlgeschlagen.
CloseWindow(ThisWindow)
EndIf
; Festlegen des Rückgabewerts.
If ThisWindow > 0 And *ThisData > 0
; Referenz auf das neue Fenster zurückgeben.
ProcedureReturn ThisWindow
Else
; 0 zurückgeben
ProcedureReturn 0
EndIf
EndProcedure
Procedure.i DestroyButtonWindow(Window.i)
; Entfernt das Fenster aus der ActiveWindows Map, gibt den reservierten Speicher frei,
; schließt das Fenster und setzt das 'Beenden' (Quit) Flag, wenn nötig.
Shared EventQuit, ActiveWindows()
Protected *ThisData.BUTTONWINDOW
Protected.s ThisKey
; Umwandeln des Fenster-Werts in einen String.
ThisKey = StrU(Window)
; Referenz-Strukturenzeiger ermitteln.
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen.
If *ThisData\WindowClass <> #WindowClassButton
ProcedureReturn #False
EndIf
; Die Speicherreservierung freigeben.
FreeMemory(*ThisData)
; Den Map-Eintrag löschen.
DeleteMapElement(ActiveWindows(), ThisKey)
; Das Fenster schließen.
CloseWindow(Window)
; Überprüfen, ob es noch offene Fenster gibt.
If MapSize(ActiveWindows()) = 0
EventQuit = #True
EndIf
; Setzen des 'Erfolgreich' Rückgabewerts.
ProcedureReturn #True
EndProcedure
Procedure.i ResizeButtonWindow(Window.i)
; Die Gadgets des Fensters in der Größe anpassen.
Shared ActiveWindows()
Protected *ThisData.BUTTONWINDOW
Protected.i X, Y, W, H
Protected.s ThisKey
; Referenz-Strukturenzeiger ermitteln.
ThisKey = StrU(Window)
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen.
If *ThisData\WindowClass <> #WindowClassButton
ProcedureReturn #False
EndIf
; Listview in der Größe verändern.
W = WindowWidth(Window) - 25
H = WindowHeight(Window) - 85
ResizeGadget(*ThisData\ListView, #PB_Ignore, #PB_Ignore, W, H)
; Schalter neu zentrieren.
X = WindowWidth(Window)/2 - 95
Y = WindowHeight(Window) - 65
ResizeGadget(*ThisData\AddButton, X, Y, #PB_Ignore, #PB_Ignore)
X = WindowWidth(Window)/2 + 5
ResizeGadget(*ThisData\RemoveButton, X, Y, #PB_Ignore, #PB_Ignore)
ProcedureReturn #True
EndProcedure
Procedure.i EventsButtonWindow(Window, Gadget, Type)
; Ereignisse für ein Button Fenster verarbeiten.
Shared Buttons, ActiveWindows()
Protected *ThisData.BUTTONWINDOW
Protected.i NewValue, Index
Protected.s ThisKey
; Umwandeln des Fenster-Werts in einen String.
ThisKey = StrU(Window)
; Referenz-Strukturenzeiger ermitteln.
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen.
If *ThisData\WindowClass <> #WindowClassButton
ProcedureReturn #False
EndIf
Select Gadget
Case *ThisData\AddButton
NewValue = Random(2147483647)
AddGadgetItem(*ThisData\ListView, -1, StrU(NewValue))
Case *ThisData\RemoveButton
Index = GetGadgetState(*ThisData\ListView)
If Index >= 0 And Index <= CountGadgetItems(*ThisData\ListView)
RemoveGadgetItem(*ThisData\ListView, Index)
EndIf
Case *ThisData\ListView
; Tue nichts.
EndSelect
EndProcedure
;- Date Window
Procedure.i CreateDateWindow()
; Erstellt ein neues Date Fenster und fügt es zur überwachenden Map hinzu,
; reserviert Speicher für die Gadget-Referenzen, erstellt die Gadgets
; und speichert deren Referenzen in der Speicher-Struktur.
Shared Dates, ActiveWindows()
Protected *ThisData.DATEWINDOW
Protected.i ThisWindow
Protected.s ThisKey, ThisTitle
Dates + 1
ThisTitle = "Date Window " + StrU(Dates)
ThisWindow = OpenWindow(#PB_Any, 30, 30, 310, 420, ThisTitle , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
; Überprüfen, dass der OpenWindow Befehl erfolgreich funktioniert hat.
If ThisWindow
; Minimale Fenstergröße festlegen.
WindowBounds(ThisWindow, 310, 245, #PB_Ignore, #PB_Ignore)
; Umwandeln der Fenster-Referenz in einen String, um diesen als Schlüssel für die Map zu verwenden.
ThisKey = StrU(ThisWindow)
; Reserviert Speicher, um darin die Gadget-Referenzen zu speichern.
*ThisData = AllocateMemory(SizeOf(DATEWINDOW))
EndIf
; Überprüfen, dass die Speicherreservierung erfolgreich war.
If *ThisData
; Speichern der Fenster-Referenz und der Speicherzeiger-Werte in der Map.
ActiveWindows(ThisKey) = *ThisData
; Festlegen der Fenster-Klasse.
*ThisData\WindowClass = #WindowClassDate
; Erstellen der Menüleiste.
*ThisData\Menu = CreateMenu(#PB_Any, WindowID(ThisWindow))
; Wenn die Menü-Erstellung erfolgreich war, die Menü-Einträge erstellen.
If *ThisData\Menu
MenuTitle("Window")
MenuItem(#MenuNewButton, "New Button Window")
MenuItem(#MenuNewDate, "New Date Window")
MenuItem(#MenuNewTrack, "New Track Window")
MenuItem(#MenuClose, "Close Window")
EndIf
; Erstellen der Fenster-Gadgets.
*ThisData\Calendar = CalendarGadget(#PB_Any, 10, 10, 182, 162)
*ThisData\AddButton = ButtonGadget(#PB_Any, 210, 10, 90, 30, "Add")
*ThisData\RemoveButton = ButtonGadget(#PB_Any, 210, 45, 90, 30, "Remove")
*ThisData\ListView = ListViewGadget(#PB_Any, 10, 187, 290, 200)
Else
; Speicherreservierung fehlgeschlagen.
CloseWindow(ThisWindow)
EndIf
; Festlegen des Rückgabewerts.
If ThisWindow > 0 And *ThisData > 0
; Referenz auf das neue Fenster zurückgeben.
ProcedureReturn ThisWindow
Else
; 0 zurückgeben
ProcedureReturn 0
EndIf
EndProcedure
Procedure.i DestroyDateWindow(Window.i)
; Entfernt das Fenster aus der ActiveWindows Map, gibt den reservierten Speicher frei,
; schließt das Fenster und setzt das 'Beenden' (Quit) Flag, wenn nötig.
Shared EventQuit, ActiveWindows()
Protected *ThisData.DATEWINDOW
Protected.s ThisKey
; Umwandeln des Fenster-Werts in einen String.
ThisKey = StrU(Window)
; Referenz-Strukturenzeiger ermitteln.
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen,
; da diese Prozedur dieses Fenster nicht schließen kann.
If *ThisData\WindowClass <> #WindowClassDate
ProcedureReturn #False
EndIf
; Die Speicherreservierung freigeben.
FreeMemory(*ThisData)
; Den Map-Eintrag löschen.
DeleteMapElement(ActiveWindows(), ThisKey)
; Das Fenster schließen.
CloseWindow(Window)
; Überprüfen, ob es noch offene Fenster gibt.
If MapSize(ActiveWindows()) = 0
EventQuit = #True
EndIf
; Setzen des 'Erfolgreich' Rückgabewerts.
ProcedureReturn #True
EndProcedure
Procedure.i ResizeDateWindow(Window.i)
; Die Gadgets des Fensters in der Größe anpassen.
Shared ActiveWindows()
Protected *ThisData.DATEWINDOW
Protected.i X, Y, W, H
Protected.s ThisKey
; Referenz-Strukturenzeiger ermitteln.
ThisKey = StrU(Window)
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen.
If *ThisData\WindowClass <> #WindowClassDate
ProcedureReturn #False
EndIf
; Listview in der Größe anpassen.
W = WindowWidth(Window) - 20
H = WindowHeight(Window) - 220
ResizeGadget(*ThisData\ListView, #PB_Ignore, #PB_Ignore, W, H)
ProcedureReturn #True
EndProcedure
Procedure.i EventsDateWindow(Window, Gadget, Type)
; Ereignisse für ein Date Fenster verarbeiten.
Shared Buttons, ActiveWindows()
Protected *ThisData.DATEWINDOW
Protected.i NewValue, Index
Protected.s ThisKey
; Umwandeln des Fenster-Werts in einen String.
ThisKey = StrU(Window)
; Referenz-Strukturenzeiger ermitteln.
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen.
If *ThisData\WindowClass <> #WindowClassDate
ProcedureReturn #False
EndIf
Select Gadget
Case *ThisData\AddButton
NewValue = GetGadgetState(*ThisData\Calendar)
AddGadgetItem(*ThisData\ListView, -1, FormatDate(#DateFormat, NewValue))
Case *ThisData\RemoveButton
Index = GetGadgetState(*ThisData\ListView)
If Index >= 0 And Index <= CountGadgetItems(*ThisData\ListView)
RemoveGadgetItem(*ThisData\ListView, Index)
EndIf
Case *ThisData\Calendar, *ThisData\ListView
; Tue nichts.
EndSelect
EndProcedure
;- Track Window
Procedure.i CreateTrackWindow()
; Erstellt ein neues Track Fenster und fügt es zur überwachenden Map hinzu,
; reserviert Speicher für die Gadget-Referenzen, erstellt die Gadgets
; und speichert deren Referenzen in der Speicher-Struktur.
Shared Tracks, ActiveWindows()
Protected *ThisData.TRACKWINDOW
Protected.i ThisWindow, ThisSum
Protected.s ThisKey, ThisTitle
Tracks + 1
ThisTitle = "Track Bar Window " + StrU(Tracks)
ThisWindow = OpenWindow(#PB_Any, 30, 30, 398, 130, ThisTitle, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_TitleBar)
; Überprüfen, dass der OpenWindow Befehl erfolgreich funktioniert hat.
If ThisWindow
; Minimale Fenstergröße festlegen.
WindowBounds(ThisWindow, 135, 130, #PB_Ignore, 130)
; Umwandeln der Fenster-Referenz in einen String, um diesen als Schlüssel für die Map zu verwenden.
ThisKey = StrU(ThisWindow)
; Reserviert Speicher, um darin die Gadget-Referenzen zu speichern.
*ThisData = AllocateMemory(SizeOf(TRACKWINDOW))
EndIf
; Überprüfen, dass die Speicherreservierung erfolgreich war.
If *ThisData
; Speichern der Fenster-Referenz und der Speicherzeiger-Werte in der Map.
ActiveWindows(ThisKey) = *ThisData
; Festlegen der Fenster-Klasse.
*ThisData\WindowClass = #WindowClassTrack
; Erstellen der Menüleiste.
*ThisData\Menu = CreateMenu(#PB_Any, WindowID(ThisWindow))
; Wenn die Menü-Erstellung erfolgreich war, die Menü-Einträge erstellen.
If *ThisData\Menu
MenuTitle("Window")
MenuItem(#MenuNewButton, "New Button Window")
MenuItem(#MenuNewDate, "New Date Window")
MenuItem(#MenuNewTrack, "New Track Window")
MenuItem(#MenuClose, "Close Window")
EndIf
; Erstellen der Fenster-Gadgets.
*ThisData\TrackBar1 = TrackBarGadget(#PB_Any, 10, 10, 375, 25, 0, 100, #PB_TrackBar_Ticks)
*ThisData\TrackBar2 = TrackBarGadget(#PB_Any, 10, 40, 375, 25, 0, 100, #PB_TrackBar_Ticks)
*ThisData\Label = TextGadget(#PB_Any, 10, 75, 80, 25, "Difference:")
*ThisData\Difference = StringGadget(#PB_Any, 90, 75, 290, 25, "0", #PB_String_ReadOnly)
Else
; Speicherreservierung fehlgeschlagen.
CloseWindow(ThisWindow)
EndIf
; Festlegen des Rückgabewerts.
If ThisWindow > 0 And *ThisData > 0
; Referenz auf das neue Fenster zurückgeben.
ProcedureReturn ThisWindow
Else
; 0 zurückgeben
ProcedureReturn 0
EndIf
EndProcedure
Procedure.i DestroyTrackWindow(Window.i)
; Entfernt das Fenster aus der ActiveWindows Map, gibt den reservierten Speicher frei,
; schließt das Fenster und setzt das 'Beenden' (Quit) Flag, wenn nötig.
Shared EventQuit, ActiveWindows()
Protected *ThisData.DATEWINDOW
Protected.s ThisKey
; Umwandeln des Fenster-Werts in einen String.
ThisKey = StrU(Window)
; Referenz-Strukturenzeiger ermitteln.
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen,
; da diese Prozedur dieses Fenster nicht schließen kann.
If *ThisData\WindowClass <> #WindowClassTrack
ProcedureReturn #False
EndIf
; Die Speicherreservierung freigeben.
FreeMemory(*ThisData)
; Den Map-Eintrag löschen.
DeleteMapElement(ActiveWindows(), ThisKey)
; Das Fenster schließen.
CloseWindow(Window)
; Überprüfen, ob es noch offene Fenster gibt.
If MapSize(ActiveWindows()) = 0
EventQuit = #True
EndIf
; Setzen des 'Erfolgreich' Rückgabewerts.
ProcedureReturn #True
EndProcedure
Procedure.i ResizeTrackWindow(Window.i)
; Die Gadgets des Fensters in der Größe anpassen.
Shared ActiveWindows()
Protected *ThisData.TRACKWINDOW
Protected.i X, Y, W, H
Protected.s ThisKey
; Referenz-Strukturenzeiger ermitteln.
ThisKey = StrU(Window)
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen.
If *ThisData\WindowClass <> #WindowClassTrack
ProcedureReturn #False
EndIf
; Trackbars (Schieberegler) in der Größe anpassen.
W = WindowWidth(Window) - 20
ResizeGadget(*ThisData\TrackBar1, #PB_Ignore, #PB_Ignore, W, #PB_Ignore)
ResizeGadget(*ThisData\TrackBar2, #PB_Ignore, #PB_Ignore, W, #PB_Ignore)
; StringGadget anpassen.
W = WindowWidth(Window) - 110
ResizeGadget(*ThisData\Difference, #PB_Ignore, #PB_Ignore, W, #PB_Ignore)
ProcedureReturn #True
EndProcedure
Procedure.i EventsTrackWindow(Window, Gadget, Type)
; Ereignisse für ein Track Fenster verarbeiten.
Shared Buttons, ActiveWindows()
Protected *ThisData.TRACKWINDOW
Protected.i NewValue
Protected.s ThisKey
; Umwandeln des Fenster-Werts in einen String.
ThisKey = StrU(Window)
; Referenz-Strukturenzeiger ermitteln.
*ThisData = ActiveWindows(ThisKey)
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde, sonst stoppen.
If *ThisData = 0
ProcedureReturn #False
EndIf
; Überprüfen, dass es sich um den korrekten Fenstertyp handelt, sonst stoppen.
If *ThisData\WindowClass <> #WindowClassTrack
ProcedureReturn #False
EndIf
Select Gadget
Case *ThisData\TrackBar1, *ThisData\TrackBar2
NewValue = GetGadgetState(*ThisData\TrackBar1) - GetGadgetState(*ThisData\TrackBar2)
SetGadgetText(*ThisData\Difference, Str(NewValue))
Case *ThisData\Label, *ThisData\Difference
; Tue nichts.
EndSelect
EndProcedure
;- Main
; Erstellen des ersten Fensters.
EventWindow = CreateButtonWindow()
ResizeButtonWindow(EventWindow)
;- Ereignis-Schleife
Repeat
Event = WaitWindowEvent()
EventWindow = EventWindow()
EventWindowKey = StrU(EventWindow)
EventGadget = EventGadget()
EventType = EventType()
EventMenu = EventMenu()
*EventGadgets = ActiveWindows(EventWindowKey)
Select Event
Case #PB_Event_Gadget
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde.
If *EventGadgets > 0
; Verwenden von *EventGadgets\WindowClass, um Ereignisse an die richtige Ereignis-Prozedur zu übermitteln.
Select *EventGadgets\WindowClass
Case #WindowClassButton
EventsButtonWindow(EventWindow, EventGadget, EventType)
Case #WindowClassDate
EventsDateWindow(EventWindow, EventGadget, EventType)
Case #WindowClassTrack
EventsTrackWindow(EventWindow, EventGadget, EventType)
Default
; Tue nichts.
EndSelect
EndIf
Case #PB_Event_Menu
Select EventMenu
Case #MenuNewButton
EventWindow = CreateButtonWindow()
If EventWindow > 0
ResizeButtonWindow(EventWindow)
EndIf
Case #MenuNewDate
EventWindow = CreateDateWindow()
If EventWindow > 0
ResizeDateWindow(EventWindow)
EndIf
Case #MenuNewTrack
EventWindow = CreateTrackWindow()
If EventWindow > 0
ResizeTrackWindow(EventWindow)
EndIf
Case #MenuClose
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde.
If *EventGadgets > 0
; Verwenden von *EventGadgets\WindowClass, um die richtige Prozedur zum Löschen des Fensters aufzurufen.
Select *EventGadgets\WindowClass
Case #WindowClassButton
DestroyButtonWindow(EventWindow)
Case #WindowClassDate
DestroyDateWindow(EventWindow)
Case #WindowClassTrack
DestroyTrackWindow(EventWindow)
Default
; Tue nichts.
EndSelect
EndIf
EndSelect
Case #PB_Event_CloseWindow
; Überprüfen, dass ein gültiger Zeiger ermittelt wurde.
If *EventGadgets > 0
; Verwenden von *EventGadgets\WindowClass, um die richtige Prozedur zum Löschen des Fensters aufzurufen.
Select *EventGadgets\WindowClass
Case #WindowClassButton
DestroyButtonWindow(EventWindow)
Case #WindowClassDate
DestroyDateWindow(EventWindow)
Case #WindowClassTrack
DestroyTrackWindow(EventWindow)
Default
; Tue nichts.
EndSelect
EndIf
Case #PB_Event_SizeWindow
If *EventGadgets > 0
; Verwende *EventGadgets\WindowClass, um die korrekte Prozedur zur Größenänderung des Fensters aufzurufen.
Select *EventGadgets\WindowClass
Case #WindowClassButton
ResizeButtonWindow(EventWindow)
Case #WindowClassDate
ResizeDateWindow(EventWindow)
Case #WindowClassTrack
ResizeTrackWindow(EventWindow)
Default
; Tue nichts.
EndSelect
EndIf
EndSelect
Until EventQuit = #True
Einsteiger-Kapitel Navigation
< Vorheriges: Dynamische Nummerierung von Fenstern und Gadgets | Überblick | Nächstes: Andere Compiler-Schlüsselworte >