Template diverser Eventschleifen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Template diverser Eventschleifen

Beitrag 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. :)
Zuletzt geändert von Rudi am 06.08.2016 18:01, insgesamt 9-mal geändert.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Template einer Eventschleife

Beitrag 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 ...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Template einer Eventschleife

Beitrag 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.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Template einer Eventschleife

Beitrag 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! <)
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Template einer Eventschleife

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Template einer Eventschleife

Beitrag von Rudi »

Code überarbeitet und erweitert um: DropTypes, DropActions und CustomEvents.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Template einer Eventschleife

Beitrag von Rudi »

NetworkServerEvent() erweitert.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Template einer Eventschleife

Beitrag 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.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Template einer Eventschleife

Beitrag 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.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Template einer Eventschleife

Beitrag von Rudi »

Server und Client bekommen natürlich je eine eigene Schleife.
Code durch Zusammenfassung einiger Konstanten verkürzt und dadurch übersichtlicher gestaltet.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Antworten