Seite 1 von 2

Template diverser Eventschleifen

Verfasst: 31.07.2016 11:07
von Rudi
Da es immer wieder gebraucht und nachgefragt wird, präsentiere ich hiermit ein Template einer Eventschleife. Gadgets ohne EventTyp-Unterstützung sind nicht mit aufgeführt:

Code: Alles auswählen

CompilerError "Es handelt sich hierbei um keinen ausführbaren Code! .."

;##### Enumerations #####
Enumeration ;Windows
	#Window_0
EndEnumeration
Enumeration ;Gadgets
	#ComboBoxGadget_0
	#DateGadget_0
	#EditorGadget_0
	#ExplorerListGadget_0
	#ExplorerTreeGadget_0
	#ImageGadget_0
	#ListViewGadget_0
	#ListIconGadget_0
	#OpenGLGadget_0
	#MDIGadget_0
	#SpinGadget_0
	#StringGadget_0
	#TreeGadget_0
	#WebGadget_0
EndEnumeration
Enumeration ;Images
	#Image_0
EndEnumeration
Enumeration ;Menus, ToolBars
	#Menu_0
	#ToolBar_0
EndEnumeration
Enumeration ;StatusBars
	#StatusBar_0
EndEnumeration
Enumeration ;SystemTrayIcons
	#SysTrayIcon_0
EndEnumeration
Enumeration ;Timers
	#Timer_0
EndEnumeration
Enumeration ;Servers
	#Server_0
EndEnumeration
Enumeration #PB_Event_FirstCustomValue ;CustomEvents
	#CustomEvent_0
EndEnumeration

;##### WindowEvents #####
Repeat
	wEvent = WaitWindowEvent() ;WindowEvent zwecks späterer Verwendung speichern
	Select wEvent
		Case #PB_Event_Gadget
			Gadget = EventGadget() ;Gadgetnummer zwecks späterer Verwendung speichern
			Select Gadget
				Case #ComboBoxGadget_0
					Select EventType()
						Case #PB_EventType_Change ;wenn ein anderer Eintrag aus der DropDown-Liste gewählt wurde
						Case #PB_EventType_Focus	;nur wenn editierbar
						Case #PB_EventType_LostFocus ;nur wenn editierbar
					EndSelect
					
				Case #CanvasGadget_0
					Select EventType()
						Case #PB_EventType_MouseEnter
						Case #PB_EventType_MouseLeave
						Case #PB_EventType_MouseMove
						Case #PB_EventType_MouseWheel
						Case #PB_EventType_LeftButtonDown
						Case #PB_EventType_LeftButtonUp
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightButtonDown
						Case #PB_EventType_RightButtonUp
						Case #PB_EventType_RightClick
						Case #PB_EventType_RightDoubleClick
						Case #PB_EventType_MiddleButtonDown
						Case #PB_EventType_MiddleButtonUp
						Case #PB_EventType_Focus
						Case #PB_EventType_LostFocus
						Case #PB_EventType_KeyDown
						Case #PB_EventType_KeyUp
						Case #PB_EventType_Input
					EndSelect
					
				Case #DateGadget_0
					Select EventType()
						Case #PB_EventType_Change
					EndSelect
					
				Case #EditorGadget_0
					Select EventType()
						Case #PB_EventType_Change
						Case #PB_EventType_Focus
						Case #PB_EventType_LostFocus
					EndSelect
					
				Case #ExplorerListGadget_0
					Select EventType()
						Case #PB_EventType_Change
						Case #PB_EventType_DragStart
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightClick
						Case #PB_EventType_RightDoubleClick
					EndSelect
					
				Case #ExplorerTreeGadget_0
					Select EventType()
						Case #PB_EventType_Change
						Case #PB_EventType_DragStart
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightClick
						Case #PB_EventType_RightDoubleClick
					EndSelect
					
				Case #ImageGadget_0
					Select EventType()
						Case #PB_EventType_DragStart
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightClick
						Case #PB_EventType_RightDoubleClick
					EndSelect
					
				Case #ListIconGadget_0
					Select EventType()
						Case #PB_EventType_Change
						Case #PB_EventType_DragStart
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightClick
						Case #PB_EventType_RightDoubleClick
					EndSelect
					
				Case #ListViewGadget_0
					Select EventType()
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightClick
					EndSelect
					
				Case #MDIGadget_0
					;Das MDIGadget gibt keine Ereignisse zurück.
					;Ereignisse, welche die Child-Fenster betreffen, werden stattdessen als normale Fenster-Ereignisse empfangen.
					
				Case #OpenGLGadget_0
					Select EventType()
						Case #PB_EventType_MouseEnter
						Case #PB_EventType_MouseLeave
						Case #PB_EventType_MouseMove
						Case #PB_EventType_MouseWheel
						Case #PB_EventType_LeftButtonDown
						Case #PB_EventType_LeftButtonUp
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightButtonDown
						Case #PB_EventType_RightButtonUp
						Case #PB_EventType_RightClick
						Case #PB_EventType_RightDoubleClick
						Case #PB_EventType_MiddleButtonDown
						Case #PB_EventType_MiddleButtonUp
						Case #PB_EventType_Focus
						Case #PB_EventType_LostFocus
						Case #PB_EventType_KeyDown
						Case #PB_EventType_KeyUp
						Case #PB_EventType_Input
					EndSelect
					
				Case #Panel_0
					Select EventType()
						Case #PB_EventType_Change
					EndSelect
					
				Case #SpinGadget_0
					Select EventType()
						Case #PB_EventType_Change
						Case #PB_EventType_Up
						Case #PB_EventType_Down
					EndSelect
					
				Case #StringGadget_0
					Select EventType()
						Case #PB_EventType_Change
						Case #PB_EventType_Focus
						Case #PB_EventType_LostFocus
					EndSelect
					
				Case #TreeGadget_0
					Select EventType()
						Case #PB_EventType_Change
						Case #PB_EventType_DragStart
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightClick
						Case #PB_EventType_RightDoubleClick
					EndSelect
					
				Case #WebGadget_0
					Select EventType()
						Case #PB_EventType_DownloadEnd
						Case #PB_EventType_DownloadProgress
						Case #PB_EventType_DownloadStart
						Case #PB_EventType_PopupMenu
						Case #PB_EventType_PopupWindow
						Case #PB_EventType_StatusChange
						Case #PB_EventType_TitleChange
					EndSelect
			EndSelect
			
		Case #PB_Event_GadgetDrop
			Select EventGadget()
				Case #ExplorerListGadget_0, #ExplorerTreeGadget_0, #ImageGadget_0, #ListIconGadget_0, #TreeGadget_0 ;Nativ unterstützte Gadgettypen.
					Select EventDropType()
						Case #PB_Drop_Files
							Files$ = EventDropFiles()
						Case #PB_Drop_Image
							Image = EventDropImage()
						Case #PB_Drop_Private
							Priv = EventDropPrivate()
						Case #PB_Drop_Text
							Text$ = EventDropText()
					EndSelect
					
					Select EventDropAction()
						Case #PB_Drag_Copy
							;Die Daten sollten kopiert werden
						Case #PB_Drag_Link
							;Die Daten sollten verlinkt werden
						Case #PB_Drag_Move
							;Die Daten sollten verschoben werden
					EndSelect
			EndSelect ;weitere Gadgettypen können mittels "DragAcceptFiles_()" drop-fähig gemacht werden (Windows-API)
			
		Case #PB_Event_DeactivateWindow, #PB_Event_ActivateWindow, #PB_Event_MaximizeWindow, #PB_Event_MinimizeWindow,
		     #PB_Event_RestoreWindow, #PB_Event_MoveWindow, #PB_Event_Repaint, #PB_Event_SizeWindow, #PB_Event_CloseWindow,
		     #PB_Event_LeftClick, #PB_Event_LeftDoubleClick, #PB_Event_RightClick ;Nativ unterstützte Fensterereignisse. Nicht benötigte löschen!
			Select EventWindow()
				Case #Window_0
			EndSelect
			
		Case #PB_Event_WindowDrop
			Select EventWindow()
				Case #Window_0
					Select EventDropType()
						Case #PB_Drop_Files
							Files$ = EventDropFiles()
						Case #PB_Drop_Image
							Image = EventDropImage()
						Case #PB_Drop_Private
							Priv = EventDropPrivate()
						Case #PB_Drop_Text
							Text$ = EventDropText()
					EndSelect
					
					Select EventDropAction()
						Case #PB_Drag_Copy
							;Die Daten sollten kopiert werden
						Case #PB_Drag_Link
							;Die Daten sollten verlinkt werden
						Case #PB_Drag_Move
							;Die Daten sollten verschoben werden
					EndSelect
			EndSelect
			
		Case #PB_Event_Menu
			Select EventMenu()
				Case #Menu_0
				Case #ToolBar_0
			EndSelect
			
		Case #PB_Event_SysTray
			Select EventGadget()
				Case #SysTray_0
					Select EventType() ;Laut Hilfe sollen noch mehr gehen. Es funktionieren aber nur diese:
						Case #PB_EventType_LeftClick
						Case #PB_EventType_LeftDoubleClick
						Case #PB_EventType_RightClick
						Case #PB_EventType_RightDoubleClick
					EndSelect
			EndSelect
			
		Case #PB_Event_Timer
			Select EventTimer()
				Case #Timer_0
			EndSelect
			
		Case #CustomEvent_0 ;siehe Enumerationen
			CustomData = EventData() ;wird per "PostEvent(#CustomEvent_0, 0, 0, 0, CustomData)" aus einem Thread gesendet
			
		Case #WM_KEYDOWN ;(Windows-API)
			Select EventwParam()
				Case #VK_ESCAPE ;ESC-Taste gedrückt
			EndSelect
			;weiterhin: #WM_LBUTTONDOWN, #WM_LBUTTONUP, #WM_RBUTTONDOWN, #WM_RBUTTONUP, #WM_MOUSEMOVE, #WM_CONTEXTMENU, #WM_DROPFILES - usw.
			;Diese Windows-API-Konstanten gehören aber besser in eine Callback-Procedure!
	EndSelect
ForEver

;##### NetworkServerEvents #####
Repeat
	Select NetworkServerEvent()
		Case #PB_Event_None ;(#PB_NetworkEvent_None)
			Select EventServer()
				Case #Server_0
			EndSelect
		Case #PB_Event_ClientConnected ;(#PB_NetworkEvent_Connect)
			Select EventServer()
				Case #Server_0
			EndSelect
		Case #PB_Event_DataReceived ;(#PB_NetworkEvent_Data)
			Select EventServer()
				Case #Server_0
			EndSelect
		Case #PB_Event_ClientDisconnected ;(#PB_NetworkEvent_Disconnect)
			Select EventServer()
				Case #Server_0
			EndSelect
	EndSelect
ForEver

;##### NetworkClientEvents ######
Repeat
	Select NetworkClientEvent()
		Case #PB_Event_None ;(#PB_NetworkEvent_None)
		Case #PB_Event_DataReceived ;(#PB_NetworkEvent_Data)
		Case #PB_Event_ClientDisconnected ;(#PB_NetworkEvent_Disconnect)
	EndSelect
ForEver
Das Beispiel erhebt keinen Anspruch auf 100%ige Richtig- oder Vollständigkeit!
Hinweise, Kritik und Anregungen sind immer willkommen. :)

Re: Template einer Eventschleife

Verfasst: 31.07.2016 12:21
von Bisonte
zwar etwas überladen.... aber zum nachschauen gut.

Allerdings sind die #WM_ Abfragen für Windows only fehl am Platz.

Es wurde schon sehr oft gepredigt, solche Abfragen nur in einem WindowCallback zu machen, wegen
der Unterstützung seitens PB. Mal wird es unterstützt... mal nicht ...

Re: Template einer Eventschleife

Verfasst: 31.07.2016 14:09
von Kurzer
Hallo Rudi,
ist das Template zum Rauskopieren der selbst benötigten Teile/Gadgets gedacht, damit man wegen der EventTypes nicht die Hilfe bemühen muss oder was ist der genaue Gedanke dahinter?

Allerdings ist die Eventschleife in meinen aktuellen Programmen seit Einführung von BindEvent...() nur noch ein Zweizeiler. Alles andere bilde ich über BindEvent() ab, das finde ich übersichtlicher. Aus dem Grund hatte ich mir vor Einführung von BindEvent() in PB auch schon selbst einen EventHandler geschrieben.

Re: Template einer Eventschleife

Verfasst: 31.07.2016 19:31
von Rudi
Kurzer hat geschrieben:Hallo Rudi,
ist das Template zum Rauskopieren der selbst benötigten Teile/Gadgets gedacht, damit man wegen der EventTypes nicht die Hilfe bemühen muss oder was ist der genaue Gedanke dahinter?
Ja, genau das ist mein Anliegen! Es ist meist sehr umständlich, die relevanten bzw. unterstützten Teile aus der Hilfe herauszusuchen.
Die API-Konstanten habe ich nur dafür dargestellt, dass sich niemand beklagt, dass ich nicht auf die Möglichkeit hingewiesen habe, dass diese auch so verwendet werden können, Bisonte. :mrgreen:
Anregung: Vielleicht findet sich jemand, der die Callback-Procedure mit einer brauchbaren Anzahl an API-Konstanten usw. anschaulich darstellt. Da bin ich aber nicht so firm. :|
Kurzer hat geschrieben:Allerdings ist die Eventschleife in meinen aktuellen Programmen seit Einführung von BindEvent...() nur noch ein Zweizeiler. Alles andere bilde ich über BindEvent() ab, das finde ich übersichtlicher. Aus dem Grund hatte ich mir vor Einführung von BindEvent() in PB auch schon selbst einen EventHandler geschrieben.
Ich fange ein Projekt meistens erst mit der Eventschleife an. Später kommt dann - ja nach Bedarf - BindEvent mit dazu. Aber auch für größere Projekte gibt es Möglichkeiten, die Eventschleife übersichtlich zu gestalten. Für kleine Projekte ist die Eventschleife einfacher zu handhaben - insbesondere für Anfänger. An die sollte man ja auch denken! <)

Re: Template einer Eventschleife

Verfasst: 31.07.2016 22:47
von mk-soft
Bei kleine Test-Apps schreibe ich die Event-Funktionen noch selber. Sonst lasse ich mir alles automatisch an erforderlichen Main- und Event-Funktionen erstellen...
Habe mir dafür extra ein Tools geschrieben womit ich auch mehrere Fenster verwalten kann. In der aktuellen Version verwende ich auch BindEvent um alle Events zu verwalten.

Achtung Werbung - EventDesigner

Sonst finde ich es gut das man mal alle Event auf einen Blick mal sieht.

Re: Template einer Eventschleife

Verfasst: 02.08.2016 10:51
von Rudi
Code überarbeitet und erweitert um: DropTypes, DropActions und CustomEvents.

Re: Template einer Eventschleife

Verfasst: 04.08.2016 17:01
von Rudi
NetworkServerEvent() erweitert.

Re: Template einer Eventschleife

Verfasst: 04.08.2016 17:08
von NicTheQuick
'NetworkServerEvent()' in Verbindung mit 'WaitWindowEvent()' ist eine schlechte Idee. Was ist, wenn kein Window-Event kommt, aber ein Network-Event? Dann hängt das Programm bei 'WaitWindowEvent()' und es geht nichts weiter bis jemand die Maus bewegt oder sowas. ;) Da musst du dir was anderes überlegen.

Re: Template einer Eventschleife

Verfasst: 04.08.2016 17:25
von Rudi
Stimmt, Nic. Habe dem NetworkServerEvent() eine eigene Schleife spendiert. Auch wenn es nur als Vorlage zum Herauskopieren gedacht ist, können sich so Verständnisprobleme ergeben.

Re: Template einer Eventschleife

Verfasst: 06.08.2016 09:35
von Rudi
Server und Client bekommen natürlich je eine eigene Schleife.
Code durch Zusammenfassung einiger Konstanten verkürzt und dadurch übersichtlicher gestaltet.