Starkes flackern bei SetGadgetState auf ImageGadget

Für allgemeine Fragen zur Programmierung mit PureBasic.
Renovatio

Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von Renovatio »

Sollte da nicht der Befehl SetGadgetState() auf ein ImageGadget NICHT ruckeln?
Hier mal mein Code:

Code: Alles auswählen

Repeat
Event = WaitWindowEvent()
If Event
 X = WindowMouseX(#WinMain)
 Y = WindowMouseY(#WinMain)
  If (oldx<>X) Or (oldy<>Y)
  If gadgetcheck(X,Y,#GadgetBtnAreaStart)
   SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaStart))
   SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStartHover))
  Else
   SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaNoHelp))
   SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStart))
  EndIf
  EndIf
EndIf
Bei Bedarf lade ich auch mal die exe zum testen ins Internet.

Gruß
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
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: Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von NicTheQuick »

Wieso hast du nicht den kompletten Code gepostet, der das unerwünschte Verhalten zeigt. Mit einer EXE kann ich als Linux-User auch nichts anfangen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von ts-soft »

In einem EventLoop nicht auf ein Ereignis zu reagieren ist schon mal ungünstig.
oldx und oldy wird auch nicht gesetzt. Wenn das nicht flackert, ist die Maus kaputt :mrgreen:

PS: Durch SetGadgetState sorgst Du selber dafür, das ein Event ausgelöst wird. Da wird also
nur noch Bild ausgetauscht :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Renovatio

Re: Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von Renovatio »

Na bitte, wer es so will, bekommt von mir aus tausende Zeilen Programmcode. xD

Code: Alles auswählen

Repeat
		Event = WaitWindowEvent()
		
		Debug test-ElapsedMilliseconds() : test = ElapsedMilliseconds() : Delay(10)
		
		;{##### DEVELOPER MODE #####
		;--------------------------------------------------
		; DevModeArea
		;--------------------------------------------------
		If Page = #PageStart
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaStart$)
		ElseIf Page = #PageVideos
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaVideos$)
		ElseIf Page = #PageMusic
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaMusic$)
		ElseIf Page = #PagePictures
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaPictures$)
		ElseIf Page = #PageGames
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaGames$)
		ElseIf Page = #PageSettings
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaSettings$)
		ElseIf Page = #PageInformations
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaInformations$)
		ElseIf Page = #PageInformationsMediaDatabase
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaMediaDatabase$)
		ElseIf Page = #PageInformationsUpdate
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaUpdate$)
		ElseIf Page = #PageInformationsChangelog
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaChangelog$)
		ElseIf Page = #PageInformationsAbout
			SetGadgetText(#DevModeArea," "+TextDevModeArea$+" : "+TextAreaAbout$)
		EndIf
		;--------------------------------------------------
		; DevModeMouse
		;--------------------------------------------------
		MX = WindowMouseX(#WinMain)
		MY = WindowMouseY(#WinMain)
		SetGadgetText(#DevModeMouse," "+TextDevModeMouse$+" : "+Str(MX)+"x"+Str(MY))
		;}##### DEVELOPER MODE #####
		
		;{ ===== OnMouseOver =====
		If Event
			X = WindowMouseX(#WinMain)
			Y = WindowMouseY(#WinMain)
			If (oldx<>X) Or (oldy<>Y)
				
				;{ ===== Navi =====
				
				;{ ===== Start =====
				If gadgetcheck(X,Y,#GadgetBtnAreaStart) Or gadgetcheck(X,Y,#GadgetBtnAreaVideos) Or gadgetcheck(X,Y,#GadgetBtnAreaMusic) Or gadgetcheck(X,Y,#GadgetBtnAreaPictures) Or gadgetcheck(X,Y,#GadgetBtnAreaGames) Or gadgetcheck(X,Y,#GadgetBtnAreaSettings) Or gadgetcheck(X,Y,#GadgetBtnAreaInformations) Or gadgetcheck(X,Y,#GadgetBtnAreaQuit)
					c_start_resize(1)
					If Page = #PageInformations Or Page = #PageInformationsMediaDatabase Or Page = #PageInformationsUpdate Or Page = #PageInformationsChangelog Or Page = #PageInformationsAbout
						c_informations_resize(0,0)
					EndIf
				Else
					c_start_resize(0)
					If Page = #PageInformations Or Page = #PageInformationsMediaDatabase Or Page = #PageInformationsUpdate Or Page = #PageInformationsChangelog Or Page = #PageInformationsAbout
						If gadgetcheck(X,Y,#GadgetBtnAreaInformationsMediaDatabase) Or gadgetcheck(X,Y,#GadgetBtnAreaInformationsUpdate) Or gadgetcheck(X,Y,#GadgetBtnAreaInformationsChangelog) Or gadgetcheck(X,Y,#GadgetBtnAreaInformationsAbout)
							c_informations_resize(1,1)
						Else
							c_informations_resize(1,0)
						EndIf
					EndIf
				EndIf
					
				If gadgetcheck(X,Y,#GadgetBtnAreaStart)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaStart))
					SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStartHover))
				Else
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaNoHelp))
					If GadgetY(#GadgetBtnAreaQuit) = -55
						If Page = #PageStart : SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStart)) : EndIf
						If Page = #PageVideos : SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaVideos)) : EndIf
						If Page = #PageMusic : SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaMusic)) : EndIf
						If Page = #PagePictures : SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaPictures)) : EndIf
						If Page = #PageGames : SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaGames)) : EndIf
						If Page = #PageSettings : SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaSettings)) : EndIf
						If Page = #PageInformations : SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaInformations)) : EndIf
					Else
						SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStart))
					EndIf
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaVideos)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaVideos))
					SetGadgetState(#GadgetBtnAreaVideos,ImageID(#GFXBtnAreaVideosHover))
				Else
					SetGadgetState(#GadgetBtnAreaVideos,ImageID(#GFXBtnAreaVideos))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaMusic)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaMusic))
					SetGadgetState(#GadgetBtnAreaMusic,ImageID(#GFXBtnAreaMusicHover))
				Else
					SetGadgetState(#GadgetBtnAreaMusic,ImageID(#GFXBtnAreaMusic))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaPictures)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaPictures))
					SetGadgetState(#GadgetBtnAreaPictures,ImageID(#GFXBtnAreaPicturesHover))
				Else
					SetGadgetState(#GadgetBtnAreaPictures,ImageID(#GFXBtnAreaPictures))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaGames)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaGames))
					SetGadgetState(#GadgetBtnAreaGames,ImageID(#GFXBtnAreaGamesHover))
				Else
					SetGadgetState(#GadgetBtnAreaGames,ImageID(#GFXBtnAreaGames))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaSettings)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaSettings))
					SetGadgetState(#GadgetBtnAreaSettings,ImageID(#GFXBtnAreaSettingsHover))
				Else
					SetGadgetState(#GadgetBtnAreaSettings,ImageID(#GFXBtnAreaSettings))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaInformations)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaInformations))
					SetGadgetState(#GadgetBtnAreaInformations,ImageID(#GFXBtnAreaInformationsHover))
				Else
					SetGadgetState(#GadgetBtnAreaInformations,ImageID(#GFXBtnAreaInformations))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaQuit)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaQuit))
					SetGadgetState(#GadgetBtnAreaQuit,ImageID(#GFXBtnAreaQuitHover))
				Else
					SetGadgetState(#GadgetBtnAreaQuit,ImageID(#GFXBtnAreaQuit))
				EndIf
				;} =================
				
				;{ ===== Informations =====
				If gadgetcheck(X,Y,#GadgetBtnAreaInformationsMediaDatabase)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaInformationsMediaDatabase))
					SetGadgetState(#GadgetBtnAreaInformationsMediaDatabase,ImageID(#GFXBtnAreaInformationsMediaDatabaseHover))
				Else
					SetGadgetState(#GadgetBtnAreaInformationsMediaDatabase,ImageID(#GFXBtnAreaInformationsMediaDatabase))
					If GadgetY(#GadgetBtnAreaInformationsAbout) = -55
						If Page = #PageInformations : SetGadgetState(#GadgetBtnAreaInformationsMediaDatabase,ImageID(#GFXBtnAreaInformationsMediaDatabase)) : EndIf
						If Page = #PageInformationsMediaDatabase : SetGadgetState(#GadgetBtnAreaInformationsMediaDatabase,ImageID(#GFXBtnAreaInformationsMediaDatabase)) : EndIf
						If Page = #PageInformationsUpdate : SetGadgetState(#GadgetBtnAreaInformationsMediaDatabase,ImageID(#GFXBtnAreaInformationsUpdate)) : EndIf
						If Page = #PageInformationsChangelog : SetGadgetState(#GadgetBtnAreaInformationsMediaDatabase,ImageID(#GFXBtnAreaInformationsChangelog)) : EndIf
						If Page = #PageInformationsAbout : SetGadgetState(#GadgetBtnAreaInformationsMediaDatabase,ImageID(#GFXBtnAreaInformationsAbout)) : EndIf
					Else
						SetGadgetState(#GadgetBtnAreaInformationsMediaDatabase,ImageID(#GFXBtnAreaInformationsMediaDatabase))
					EndIf
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaInformationsUpdate)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaInformationsUpdate))
					SetGadgetState(#GadgetBtnAreaInformationsUpdate,ImageID(#GFXBtnAreaInformationsUpdateHover))
				Else
					SetGadgetState(#GadgetBtnAreaInformationsUpdate,ImageID(#GFXBtnAreaInformationsUpdate))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaInformationsChangelog)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaInformationsChangelog))
					SetGadgetState(#GadgetBtnAreaInformationsChangelog,ImageID(#GFXBtnAreaInformationsChangelogHover))
				Else
					SetGadgetState(#GadgetBtnAreaInformationsChangelog,ImageID(#GFXBtnAreaInformationsChangelog))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnAreaInformationsAbout)
					SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaInformationsAbout))
					SetGadgetState(#GadgetBtnAreaInformationsAbout,ImageID(#GFXBtnAreaInformationsAboutHover))
				Else
					SetGadgetState(#GadgetBtnAreaInformationsAbout,ImageID(#GFXBtnAreaInformationsAbout))
				EndIf
				;} ========================
				
				;} ================
				
				;{ ===== Changelog =====
				If gadgetcheck(X,Y,#GadgetBtnUp)
					SetGadgetState(#GadgetBtnUp,ImageID(#GFXBtnUpHover))
				Else
					SetGadgetState(#GadgetBtnUp,ImageID(#GFXBtnUp))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnRight)
					SetGadgetState(#GadgetBtnRight,ImageID(#GFXBtnRightHover))
				Else
					SetGadgetState(#GadgetBtnRight,ImageID(#GFXBtnRight))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnDown)
					SetGadgetState(#GadgetBtnDown,ImageID(#GFXBtnDownHover))
				Else
					SetGadgetState(#GadgetBtnDown,ImageID(#GFXBtnDown))
				EndIf
				
				If gadgetcheck(X,Y,#GadgetBtnLeft)
					SetGadgetState(#GadgetBtnLeft,ImageID(#GFXBtnLeftHover))
				Else
					SetGadgetState(#GadgetBtnLeft,ImageID(#GFXBtnLeft))
				EndIf
				;} =====================
				
			EndIf
		EndIf
		;} =======================
Until AppQuit = 1 Or Event = #PB_Event_CloseWindow
In Version, PB 4.3 hat es noch funktioniert. -.-
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von ts-soft »

Renovatio hat geschrieben:Na bitte, wer es so will, bekommt von mir aus tausende Zeilen Programmcode. xD
Der Code ist immer noch nicht direkt ausführbar!
Also: Kürzen, soweit das das Problem nachvollziehbar ist, aber der Code nicht länger als 20 Zeilen.
Nach auftreten eines Events erstmal ein Delay von 10 zu machen ist doch wohl nicht Dein Ernst :freak:
Ansonsten gilt das bereits oben von mir gesagte. das kann so nicht funktionieren.

Achso, zu wer es so will: Ich will jetzt nicht mehr.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Renovatio

Re: Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von Renovatio »

Nein das Delay war nur so um zu sehen wie lage ein Durchlauf ist.
Kann und werde ich wieder rausnehmen.

Das zweite ist, Du willst einen ausführbaren Code?
Wird so leicht nicht funktionieren da mit daran DLLs verknüpft sind und ohne diese ist ein ausführen nicht mehr möglich, führt sonst zu Fehlern.

Denke aber ich habe die Lösung bereits.
Alles löschen und neu programmieren.
Sind ja bisher nur ~3000. :D

Die Lösung ist die Events nochmal prüfen da mir von einem Mitprogrammier gesagt wurde, das wenn ich ein IF ELSE nutze wird in jedem Fall ein Event ausgelöst und daher mal alles in ein IF packen und mit GetGadgetState checken.

Danke dennoch für die schnellen Antworten. ;)
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von TomS »

If/Else löst ein Event aus?
Ja schon. Goto jmp_N oder so, aber was hat das mit den Fenster zu tun?

Lösch mal deine ganzen DLL-Aufrufe und die ganzen Funktionen raus und vor allem dein Delay.
Und dann schauste dir die verbliebenen 20 Zeilen an und vergleichst sie mit dem, was in der Hilfe steht.
Dann solltest du den Fehler wohl finden.
Renovatio

Re: Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von Renovatio »

Das war ja nicht böse gemeint von mir mit dem "Wer es so will", mehr ein Spaß!

Dann zum eigentlichen Thema:
Mir wurde von einem PB-Programmierer gesagt das wenn ich folgendes benutze...

Repeat

If Bla
Führe Code A aus...
Else
Führe Code B aus...
EndIf

Until

...so wird selbst bei einem Else ein Event ausgelöst.
Ich meinte keinesfalls das ein einfach leeres IF etwas auslöst.

Nun zu meinen Anfänger-/Logikfehler.
Ich wüsste nicht einen, alles was ich benutze, geschrieben habe und versuche neues zu erlernen verwende ich durch Euch (Eure Codeänderungen, Eure Erklärungen) sowie durch PureArea.


Gruß

Renovatio
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Starkes flackern bei SetGadgetState auf ImageGadget

Beitrag von ts-soft »

vergiß den Quatsch mit If usw. bzw. es ist wesentlich übersichtlicher mit Case, aber das ist ein anderes Thema.

Den Pseudocode aus erstem Posting mal nachgearbeitet:

Code: Alles auswählen

AddWindowTimer(#window, 1, 50)
Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_Timer And EventTimer() = 1
    X = WindowMouseX(#WinMain)
    Y = WindowMouseY(#WinMain)
    If (oldx<>X) Or (oldy<>Y)
      If gadgetcheck(X,Y,#GadgetBtnAreaStart)
        SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaStart))
        SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStartHover))
      Else
        SetGadgetState(#GadgetHelpArea,ImageID(#GFXHelpAreaNoHelp))
        SetGadgetState(#GadgetBtnAreaStart,ImageID(#GFXBtnAreaStart))
      EndIf
    EndIf
    oldx = X : oldy = Y
  EndIf
So in etwa sollte es funktionieren.

PS: Die DLLs usw. haben doch mit dem Problem des Flackerns nichts zu tun, wenn Du nicht in der
Lage bist, den Code auf ein Minimum zu reduzieren, das das Problem aufzeigt, dann poste bitte im
Anfängerforum, weil hier gehört das dann nicht hin.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten