Menue Problem

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

Xeres

Moderator

BeitragMo, Apr 23, 2018 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Includes kommen mir etwas willkürlich vor.

WaveView.bb inkludiert Calculations.bb, Menue.bb und nochmal Calculations.bb
Funktionen werden definiert, aber nichts aufgerufen

Calculations.bb
Definiert nur, ist kurz - super!

Menue.bb
Definiert mehrere Types, Lädt Fonts, erstellt einen Mauspointer... Das sollte alles in die Hauptdatei

Sinus Effekte.bb inkludiert Menue.bb und WaveView.bb (und durch WaveView dann nochmal Menue.bb und Calculations.bb)
Hier wird läuft dann tatsächlich die Hauptschleife.

Das ist schwer zu durchsehen, weil es total verwirrend aufgebaut ist. Die Hauptdatei sollte deutlich als solche zu erkennen sein. Die Includes sollten in einem Unterordner sein und Funktionen systematisch sortiert enthalten. Alles Laden, generieren usw. gehört da eher nicht rein.

Aufrufe:
Sinus Effekte.bb
CreateMainMenue() - in der selben Datei
>SetButton() - in Menue.bb
>ButtonNum = ButtonNum + 1 - wird weiter oben mit 0 initalisiert
>dButton (ButtonNum) = New tCommandButton

Also ist dButton(Menu) mit Menu = 0 niemals befüllt.
Simpel zu sehen, wenn man dem Code logisch folgt. Da die Variablen und Funktionen weit verstreut sind, geht das nicht auf einen Blick.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragDi, Apr 24, 2018 9:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Flush,

wenn Du möchtest, werde ich dich ein wenig an die Hand nehmen und Dir Fehler-Findungsstrategien zeigen. Dein Code ist schon sehr umfangreich, aber kein bißchen für das Eintreten von Fehlern vorbereitet. So tappst Du im Dunklen.

Es gibt den Befehl DEBUGLOG, den Du während der gesamten Entwicklung nutzen solltest. Hiermit kannst Du am Debugger anzeigen lassen, wo sich Dein Programm befindet und was es gerade tut.

Ich habe deinem Code einen einzigen DEBUGLOG hinzugefügt und sehe schon das Problem:

BlitzBasic: [AUSKLAPPEN]
Function MouseOver()
Local XPosMouse = MouseX()
Local YPosMouse = MouseY()
Menu = 0

For ObjektIndex = 1 To ButtonNum
If ImageRectOverlap (maus, XPosMouse, YPosMouse, dButton(ObjektIndex)\cmdXPos, dButton(ObjektIndex)\cmdYPos, dButton(ObjektIndex)\cmdWidth, dButton(ObjektIndex)\cmdHeight) Then
DrawMenueGraphics("enabled")
Menu = ObjektIndex
Else
DrawMenueGraphics("disabled")
EndIf
Next
Flip
Cls
DebugLog "MENU=" + menu
End Function



Die Variable MENU sollte wahrscheinlich immer Werte zwischen 1 und 16 enthalten. Macht sie aber nicht. Ganz oft ist sie 0 und klickst Du nun ins Leere (Schwarze), wird tatsächlich dButton(0) verwendet. Den gibt es aber nicht!

Eigentlich gehört ins Hauptprogramm eine Sicherheitsabfrage, dass MENU wirklich einen Wert enthält:

BlitzBasic: [AUSKLAPPEN]
Menu = 0
Repeat
MouseOver ()

If MouseHit(1) Then
If Menu>0 ;*****ÄNDERUNG*****************
If dButton(Menu)\cmdCaption = "Image Sine Waves" Then DeleteMenueGraphics() : MainWave()
If dButton(Menu)\cmdCaption = ">>>> END <<<<" Then Quit()
EndIf
EndIf
Until KeyHit(1)


Seltsamerweise löst dies nur die Probleme mit Klicks auf die schwarzen Flächen. Klickt man nun auf den richtigen Button zu weit rechts kommt trotzdem eine Fehlermeldung. Also gibt es einen zweiten Fehler. Der tritt in der Funktion MainWave() auf.

Hierzu füge ich nun einen neuen DEBUGLOG in die Hauptschleife ein und gleichzeitig entwirre ich deine 2 Befehle auf einer Zeile. Jeder Befehl bekommt immer eine Zeile (aus Fehlerfindungsgründen). Vergiß den Quatsch mit dem Doppelpunkt (für immmer!)

BlitzBasic: [AUSKLAPPEN]
...	If MouseHit(1) Then 
If Menu>0
If dButton(Menu)\cmdCaption = "Image Sine Waves" Then
DeleteMenueGraphics()
DebugLog "hier Menu=" + Menu
MainWave()
EndIf
If dButton(Menu)\cmdCaption = ">>>> END <<<<" Then Quit()
EndIf
EndIf

Startest Du nun das Programm, zeigt sich das der Debuglog "MENU=" korrekt auf 1 geht, dann das DEBUGLOG "hier " korrekt gerufen wird und nun im MainWave() der Wert Menu wieder auf 0 springen kann. Also wird irgendwo MouseOver() illegal ein zweites Mal gerufen?

Mal sehen...

Weil Du am Anfang von MainWave() auf die WaveMenu-Buttons umschaltest wird bereits jetzt ein erstes Mal das neue Menü gecheckt und der Mausklick ins erste Menü führt im zweiten Menü bereits wieder zu einem Klick ins Leere. Also muss auch dort eine Sicherheitsabfrage rein:

BlitzBasic: [AUSKLAPPEN]
Function MainWave()	
CreateWaveMenue()
Menu = ButtonNum
Repeat
MouseOver ()
If Menu>0
If MouseHit(1) Then
If dButton(Menu)\cmdCaption = "X-Wave" Then
CalcSin(18, 2 )
ViewWave("horizontal")
EndIf
ElseIf MouseDown(1)Then
If dButton(Menu)\cmdCaption = "Periode +" Then
HilfsVar = 1
If HilfsVar = 1 Then
Periode = Periode + 1
CalcSin(18, Periode )
ViewWave("horizontal")
EndIf
EndIf
EndIf
EndIf
Until MouseHit(1)
End Function

Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Midimaster

BeitragDi, Apr 24, 2018 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
noch was grundsätzlichen zu deinem Programm-Flow:

Verändere Deinen code so, dass das FLIP in der (einzigen) Hauptschleife steht. In der Hauptschleife wird entschieden, verzweigt und gemalt. Und zwar für alle Screens und Levels Deines Programms.

Nun wirst Du fragen: "Wie komme ich dann in verschiedene Screens?".

Das geschieht mit einer Variablen Screen=0 bis Screen=16. Die Abfrage der Maus erfolgt einmalig zentral. Danach verzweigt die Hauptschleife in die Screens.

Nur bei einem Wechsel des Screens wird auch das Menu und die Buttons neu erstellt. Dafür sorgt die Variable ScreenDone

Das Menü wird ebenfalls einmal zentral gemalt.

Beispiel symbolisch:

BlitzBasic: [AUSKLAPPEN]
Graphics  1280, 720
;....hier alles zum starten hin

Global Screen%=0
Global ScreenDone%=0
Global MausHit%=0

;******** H A U P T S C H L E I F E ********
Repeat
Cls
MouseOver ()
MausHit=0
If Menu>0
MausHit=MouseHit(1)
EndIf

If (MausHit>0) Or (ScreenDone=0)
Select Screen
Case 0
MainMenue()
Case 1
WaveMenue()
Case ....

End Select
EndIf

DrawMenu()
DrawResults()

Flip
Until KeyHit(1)
;******** E N D E ********




Function MouseOver()
Local XPosMouse = MouseX()
Local YPosMouse = MouseY()
Menu = 0
For ObjektIndex = 1 To ButtonNum
If ImageRectOverlap (.;bla...)
Menu = ObjektIndex
Return
EndIf
Next
End Function




Function MainMenu()
If ScreenDone=0
CreateMainMenue()
ScreenDone=1
Else
Select dButton(Menu)\cmdCaption
Case "Image Sine Waves"
Screen=1
ScreenDone=0
Case ">>>> END <<<<"
Quit
End Select
EndIf
End Function




Function WaveMenu()
If ScreenDone=0
CreateWaveMenue()
ScreenDone=1
Else
Select dButton(Menu)\cmdCaption
Case "X-Wave"
CalcSin(18, 2 )
Case "Periode +"
Periode = Periode + 1
CalcSin(18, Periode )
End Select
EndIf
End Function




Function DrawMenu()
For ObjektIndex = 1 To ButtonNum
If Menu=ObjectIndex
DrawMenueGraphics("enabled")
Else
DrawMenueGraphics("disabled")
EndIf
Next
End Function



Function DrawResults
ViewWave("horizontal")
End Function
l
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Flush

BeitragDi, Apr 24, 2018 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

vielen Dank für die unglaubliche Hilfe Very Happy .

@Xeres
Includes habe ich bereinigt und in einen eigenen Ordner (Includes) verpackt.
Auch das Bild hat jetzt seinen eigenen Ordner (Media).

@Midimaster
Und ob Du mich an die Hand nehmen kannst und mir Fehler-Findungsstrategien zeigen kannst Wink Very Happy
Ich bin noch bei den Änderungen die Du in Deiner 1. Mail geschrieben hast.
Das Hauptmenue funktioniert tadellos Very Happy .
Es wird mir mit den DEBUGLOGS allerdings nur "MENU" in MouseOver() angezeigt zu "hier Menu" in der Hauptschleife kommt es gar nicht.
Die Buttons im WaveMenu funktionieren super, klicke ich ins schwarze dann kommt wieder eine MAV!

Ich hab den gesäuberten Code nochmal hochgeladen:
https://www.blitzforum.de/upload/file.php?id=13350


Ich habe einen DEBUGLOG in WaveView eingefügt:
BlitzBasic: [AUSKLAPPEN]

Repeat
MouseOver ()
If Menu>0
If MouseHit(1) Then
If dButton(Menu)\cmdCaption = "X-Wave" Then
CalcSin(18, 2 )
ViewWave("horizontal")
EndIf
ElseIf MouseDown(1)Then
If dButton(Menu)\cmdCaption = "Periode +" Then
HilfsVar = 1
If HilfsVar = 1 Then
Periode = Periode + 1
CalcSin(18, Periode )
ViewWave("horizontal")
EndIf
EndIf
EndIf
DebugLog "Menu in WaveView: " + Menu
EndIf
Until MouseHit(1)


Die Variable Menu ist richtig gefüllt und trotz der Sicherheitsabfrage wird eine "MAV" geworfen bzw eine
"Object does not exist" in der Hauptschleife:

BlitzBasic: [AUSKLAPPEN]

If MouseHit(MouseButton) Then
If Menu>0
If dButton(Menu)\cmdCaption = "Image Sine Waves" Then
DeleteMenueGraphics()
DebugLog "hier Menu=" + Menu
MainWave()
EndIf
If dButton(Menu)\cmdCaption = ">>>> END <<<<" Then Quit();<<< HIER BLEIBT ER HÄNGEN
EndIf
EndIf


Vielen Dank für Eure Hilfe und Mühe,
Flush

Flush

BeitragDi, Apr 24, 2018 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Um die Verwirrung zu vollenden Confused :
Wenn ich im WaveMenue zuerst auf einen Button klicke dann kann ich auch einmal ins Schwarze klicken. Wieder auf einen Button, wieder ins schwarze use..
Aber wenn ich 2X ins Schwarze klicke oder 1X ohne vorher auf einen Button dann knallts!

@MidiMaster
Deine 1. Mail klang so als würde Sie beide Probleme (HauptMenu, WaveMenu) beheben und die 2. eine gründliche Optimierung. Ist das so. Ich habe, da das Programm noch nicht anstandslos läuft noch nichts gemacht was in der 2. Mail steht!



Viele Grüße und Danke für Eure Mühe,
Flush

Midimaster

BeitragDi, Apr 24, 2018 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Du machst es genau richtig. Zuerst das Problem beheben. Dann Mail 2 ansehen.


Bei mir läuft der Code einwandfrei....


Die DEBUGLOGs allein bringen nix. Sie dienen nur der Fehlerfindung. Wenn ein Fehler aufgetrten ist, geht das DEBUGLOG Fenster auf und zeigt die Fehlerstelle. Dort ist aber auch ein zweiter TAB, der die geloggten Werte für menu anzeigt.

Die Abfrage "menu>0" muss 2x rein in deinen Code. Einmal schon in der MouseOver()-Funktion.

Grundsätzliches zur Verwendung von DEBUGLOG

Du startest Dein Programm und provozierst den FEhler bis es anhält. Jetzt schreibst Du in die Zeile vor der fehlerhaften Zeile einen DEBUGLOG mit einer eindeutigen Bezeichnung und der Variablen die wahrscheinlich verantwortlich ist

z.b.
BlitzBasic: [AUSKLAPPEN]
DebugLog "Fehlerstelle A=" + menu


Nun startest Du den Code erneut und provozierst den gleichen Fehler. Im Debugger sollte nun im 1.TAB deine Meldung und der Wert von menu stehen.

Wenn ja, prüfst Du den Wert von menu. Ist er 0, dann musst Du jetzt nur noch herausfinden, wie er wieder zu 0 werden konnte. Also rückwärts im Programmcode immer weitere DEBUGLOGs einfügen
z.b.
BlitzBasic: [AUSKLAPPEN]
DebugLog "Vorher A=" + menu
..... ; einige deiner Code-Zeilen
DebugLog "Vorher B=" + menu
....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Flush

BeitragDi, Apr 24, 2018 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm,

ich hab die Abfrage "menu>0" dann 3X im Code. 1. in der Hauptschleife, 2. in WaveView und in MouseOver()?????

Ich habe MouseOver so abgeändert:
BlitzBasic: [AUSKLAPPEN]

Function MouseOver()

Local XPosMouse = MouseX()
Local YPosMouse = MouseY()
Menu = ButtonNum


For ObjektIndex = 1 To ButtonNum
If Menu>0
If ImageRectOverlap (maus, XPosMouse, YPosMouse, dButton(ObjektIndex)\cmdXPos, dButton(ObjektIndex)\cmdYPos, dButton(ObjektIndex)\cmdWidth, dButton(ObjektIndex)\cmdHeight) Then
DrawMenueGraphics("enabled")
Menu = ObjektIndex
Else
DrawMenueGraphics("disabled")
EndIf
EndIf
Next
Flip
Cls
End Function


Aber jetzt schließt sich das Fenster wenn ich im Hauptmenu ins Schwarze klicke. Im Wave Menu kann ich überall hinklicken und die Periode wird ständig erhöht.
Außer wenn ich auf den Button x-Wave klicke dann nimmt die Welle wie gewünscht die Standardeinstellungen an.
Ist an der Buttonabfrage mit MouseDown(1) und MouseHit(1) auch was falsch?

Wenn Du einen 100%-tig funktionierenden Code hast könntest Du den vielleicht ins Archiv laden, sonst schaff ich's glaub ich nie Embarassed Crying or Very sad

Viele Grüße und vielen Dank,
Flush

Midimaster

BeitragDi, Apr 24, 2018 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ich kann leider erst wieder nach 21:00 antworten. melde mich dann wieder....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Flush

BeitragDi, Apr 24, 2018 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Werde da sein Cool !


Viele Grüße,
Flush

Flush

BeitragDi, Apr 24, 2018 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Es klappt Very Happy Very Happy Very Happy Very Happy Exclamation Exclamation Exclamation Exclamation
BlitzBasic: [AUSKLAPPEN]

Function MainWave()

CreateWaveMenue()
Menu = ButtonNum

Repeat
MouseOver ()


If MouseHit(1) Then
If Menu>0
If dButton(Menu)\cmdCaption = "X-Wave" Then
CalcSin(18, 2 )
ViewWave("horizontal")
EndIf
EndIf
ElseIf MouseDown(1)Then
If Menu>0
If dButton(Menu)\cmdCaption = "Periode +" Then
HilfsVar = 1
If HilfsVar = 1 Then
Periode = Periode + 1
CalcSin(18, Periode )
ViewWave("horizontal")
EndIf
EndIf
EndIf
DebugLog "Menu in WaveView: " + Menu
EndIf

Until MouseHit(1)
End Function



Viele Grüße und vielen Dank für Eure Hilfe und Mühe,
Flush

Midimaster

BeitragDi, Apr 24, 2018 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Je länger Dein Code ist, desto mehr Fehler kann er enthalten. So sollte man darauf achten, dass ähnliche Arbeitsschritte nicht mehrmals im Code stehen, sondern nur einmal in einer Funktion, die dann mehrfach aufgerufen wird.

Wäre dort ein Fehler, würde durch eine Ausbesserung danach das Programm dann an vielen Stellen stabiler laufen.

Ich rate Dir dringend nun meine zweite E-Mail durchzuarbeiten. Die dort genannten Änderungen lassen sich jetzt noch leicht verwirklichen und es wird dir bei Deinem Projekt noch viel zukünftigen Ärger ersparen.

Etwa das mehrfache Verwenden von MouseHit() bzw.MouseDown() ist so eine Fehlerquelle. Besser sollte die Maus einmal zentral erfragt werden, der Zustand in MausHit%, MausX% und MausY% gespeichert werden und dann nur noch diese Variablen im Code abgefragt werden.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Flush

BeitragMi, Apr 25, 2018 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@MidiMaster
Ich werd auf jeden Fall Deine 2.Mail durcharbeiten und optimierern was geht!.

Ich melde mich auf jeden Fall!!!!.

Exclamation Wahrscheinlich habe ich am WE wider Zeit Exclamation

Viele Grüße und vielen Dank für Eure Hilfe und Mühe,
Flush

Flush

BeitragDo, Apr 26, 2018 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo MidiMaster,

ich hab Deie 2.Mail durchgearbeitet, alles aufgeräumt und Deine Codes angewendet (klar daß der Code symbolisch ist).
Du hast mit allem Recht! Allerdings hat nach dem durcharbeiten überhauptnichts mehr funktioniert Wink
Einiges konnte ich korrigieren d.h. man sieht jetzt wieder etwas allerdings ist das auch alles.

Ich hab mit B3D noch zu wenig Erfahrung um das alles so umzusetzen daß alles wieder funktioniert Embarassed

Ich hab die Dateien hochgeladen:
https://www.blitzforum.de/upload/file.php?id=13351

Vielen Dank für Deine Mühe und Viele Grüße,
Flusher

Midimaster

BeitragDo, Apr 26, 2018 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein klassischer Tippfehler bei einer Variablen....

mal steht im Code...

ObjektIndex mit K

...manchmal aber auch...

ObjectIndex mit C

Nach dem Ausbessern läuft wenigsten schno mal wieder das MausOver()


Ebenso muss Du zunächst die Zeile DrawResults in der Hauptschleife "ausschalten", bis das Menü wieder läuft:
BlitzBasic: [AUSKLAPPEN]
Repeat
Cls
MouseOver ()
MausHit=0
If Menu>0
MausHit=MouseHit(1)
EndIf

If (MausHit>0) Or (ScreenDone=0)
Select Screen
Case 0
MainMenue()
Case 1
WaveMenue()
End Select
EndIf

DrawMenue()
;DrawResults()

Flip 1
Delay 100

Until KeyHit(1)
End
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Do, Apr 26, 2018 13:39, insgesamt einmal bearbeitet

Flush

BeitragDo, Apr 26, 2018 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi MidiMaster,

Objek(c)tindex hab ich verbessert auch andere Rechtschreibfehler sind verbessert.
Ich habe die Funktionen in den richtigen Dateien da ich keine Fehlermeldung bekomme!
Es ändert sich nichts. Man bekommt das Hauptmenue zu sehen und das Image, bei klick irgendwokin ändertz sich die Periode!

Bei mir werden die Buttons nicht neu gezeichnet wenn der Mouse Zeiger drüberfährt Sad !

DrawResults ist deaktivert, die Buttons werden auch neu gezeichnet. Egal wohin ich klicke, es wird alles gelöscht.
Hmmm, mal sehen was da noch so ist....!

Viele Grüße und vielen Dank für Eure Hilfe und Mühe,
Flush

Midimaster

BeitragDo, Apr 26, 2018 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Möglicherweise hast Du doch noch irgendwo eine OjectIndex mit C. Benutze die Suchfunktion, suche nach "object"



Zusätzlich musst Du zunächst die Zeile DrawResults in der Hauptschleife "ausschalten", bis das Menü wieder einwandfrei läuft:
BlitzBasic: [AUSKLAPPEN]
Repeat
Cls
MouseOver ()
MausHit=0
If Menu>0
MausHit=MouseHit(1)
EndIf

If (MausHit>0) Or (ScreenDone=0)
Select Screen
Case 0
MainMenue()
Case 1
WaveMenue()
End Select
EndIf

DrawMenue()
;DrawResults() ; momentan ausgeschalten

Flip 1
Delay 300

Until KeyHit(1)
End


Außerdem muss der Menü-Button-Zähler beim Wechsel der Menüs immer auf 0 gestellt werden. Bei Dir 2x nötig. z.b. hier:

BlitzBasic: [AUSKLAPPEN]


Function CreateMainMenue()
ButtonNum =0
SetButton("Image Sine Waves", 50, 50, 300, 50)
SetButton("Image Sine Motion", 50, 120, 300, 50)
.....



und hier:

BlitzBasic: [AUSKLAPPEN]


Function CreateWaveMenue()
ButtonNum =0

Viewport(10, 50, 200, 300)

SetButton("X-Wave", 50, 50, 110, 30)
; SetButton("Y-Wave", 20, 130, 110, 30)
...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Flush

BeitragDo, Apr 26, 2018 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
ButtonNum = 0 ist eingefügt. Ich habe CreateMainMenue() und CreateWaveMenue() wieder in die Datei Sinus Effekte.bb eingefügt nicht mehr in Menue.bb.

Noch keine Änderung!

Viele Grüße und vielen Dank für Eure Hilfe und Mühe,
Flush

Midimaster

BeitragDo, Apr 26, 2018 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
noch was ist mir aufgefallen:

Das WAV-Menü benötigt jetzt einen RETURN-Button, um wieder in das Hauptmenü zurückzukommen:

BlitzBasic: [AUSKLAPPEN]


Function CreateWaveMenue()
ButtonNum =0

Viewport(10, 50, 200, 300)

SetButton("X-Wave", 50, 50, 110, 30)
; SetButton("Y-Wave", 20, 130, 110, 30)
SetButton("Periode +", 20, 10, 100, 30)
; SetButton("Periode -", 160, 130, 100, 30)
SetButton("RETURN", 50, 430, 100, 30) ;*************NEU ****************

SetBorder(400, 100, 800, 413)

CreateEnableDisableImage()

End Function
....

.....


Function WaveMenue()
If ScreenDone=0
CreateWaveMenue()
ScreenDone=1
Else
Select dButton(Menu)\cmdCaption
Case "X-Wave"
CalcSin(18, 2 )
Case "Periode +"
Periode = Periode + 1
CalcSin(18, Periode )
Case "RETURN"
Screen=0
ScreenDone=0
End Select
EndIf
End Function





Abschließend noch die Geschichte mit der Image-Manipulation. Hier steht bei Dir noch immer eine Repeat/Until Schleife. Die muss jetzt natürlich raus, weil wir ja nur noch eine Hauptschleife erlauben wollen. Auch das MouseOver ist inzwischen unnötig:

BlitzBasic: [AUSKLAPPEN]


Function ViewWave(Direction$)
Local Index% = 0
;Repeat
;MouseOver()
If Direction = "horizontal" Then
If HilfsVar = 1 Then HilfsVar = 0
For Index = 0 To BildBreite
DrawImageRect Bild, 600 + SinusWerte[(Index + Zaehler)Mod 360], (200 + Index) + HilfsVar, 1, Index, BildBreite, 1
Next
Zaehler = (Zaehler + 1) Mod 360 ;Ersetzt >>> Zaehler = Zaehler+1 und If Zaehler = 360 Then Zaehler = 0 <<<
Else If Direction = "vertikal" Then
For i = 0 To BildHoehe
DrawImageRect Bild, 600 + Index, 200 + SinusWerte[(Index + Zaehler)Mod 360] ,Index ,1 , 1, BildHoehe
Next
Zaehler = (Zaehler + 1) Mod 360
EndIf
;Until MouseHit(1)
End Function



So jetzt noch die Hauptschleife anpassen. Das Image-Fenster darf natürlich nur bei den Screens 1-16 erscheinen. Bei Screen 0 willst Du ja nur das Menü sehen:

BlitzBasic: [AUSKLAPPEN]
Repeat
Cls
MouseOver ()
MausHit=0
If Menu>0
MausHit=MouseHit(1)
EndIf

If (MausHit>0) Or (ScreenDone=0)
Select Screen
Case 0
MainMenue()
Case 1
WaveMenue()
End Select
EndIf

DrawMenue()

If (Screen>0) And (ScreenDone=1)
DrawResults()
EndIf

Flip
Until KeyHit(1)
End


Kleiner Nachtrag. Fehler in der Funktion Quit(). Da Du die Variable Font nicht GLOBAL gesetzt hast, löst der FreeFont in der Funktion Quit() eine Fehlermeldung aus:

BlitzBasic: [AUSKLAPPEN]
Function Quit()
FreeFont font
FreeImage Bild
End
End Function



Noch ein kleiner Nachtrag. Dein Graphics-Befehl muss bei mir so aussehen:
BlitzBasic: [AUSKLAPPEN]
Graphics  1280, 720, 2




Damit läuft es bei mir perfekt. Sende einfach nochmal das ganze ZIP, wenn es bei Dir nicht besser wird.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Flush

BeitragDo, Apr 26, 2018 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Es läuft tatsächlich nicht Sad !

Hier der neue Upload:
https://www.blitzforum.de/upload/file.php?id=13352

Wenn gar nichts geht, könntest Du vielleicht den funktierenden Source uploaden?


Viele Grüße und vielen Dank für Deine Mühe und Hilfe,
Flusher

Midimaster

BeitragDo, Apr 26, 2018 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
folgende Fehler gefunden:

1. ENDE

in der Hauptschleife muss das UNTIL anders gelöst werden, z.b. so:
BlitzBasic: [AUSKLAPPEN]
...	
Flip
Until KeyHit(1)

sonst führt jeder Klick aufs schwarze immer zum Abbruch des Programms. Ende soll aber nur bei Ende erfolgen.


2. DrawResults

in der Hauptschleife muss das DrawResult eingeschaltet werden und darf aber nur bei Screens>0 kommen, z.b. so:
BlitzBasic: [AUSKLAPPEN]
...	
DrawMenue()
If (Screen>0) And (ScreenDone=1)
DrawResults()
EndIf
Flip




3. RETURN

du hast zwar einen Return-Knopf eingeführt, aber keine Aktion dafür festgelegt. So geht es:
BlitzBasic: [AUSKLAPPEN]
Function WaveMenue()

If ScreenDone = 0
CreateWaveMenue()
ScreenDone = 1
Else
Select dButton(Menu)\cmdCaption
Case "X-Wave"
CalcSin(18, 2 )
Case "Periode +"
Periode = Periode + 1
CalcSin(18, Periode )
Case "RETURN"
Screen=0
ScreenDone=0
End Select
EndIf

End Function





Noch ein Fehler ist mir aufgefallen. Ein MouseHit sollte in jeder Runde abgeholt und verarbeitet werden. Dafür benötigen wir hier eine Änderung in der Hauptschleife:
BlitzBasic: [AUSKLAPPEN]
	Cls
MouseOver ()
MausHit = MouseHit(1)
If ((Menu>0) And (MausHit > 0)) Or (ScreenDone = 0)
Select Screen
Case 0

Etwas kompliziert: der Select-Bereich wird nur noch erreicht, wenn entweder ein MausHit entdeckt wurde und gleichzeitig ein Menü zugeordet werden konnte, oder wenn ein gesamtes Button-Menü neu erstellt werden muss.



Also bei mir läuft es mit diesen Änderungen perfekt.
hier nochmal die ganze Sinus.bb. Ich habe diesmal nur in dieser Datei etwas geändert:
BlitzBasic: [AUSKLAPPEN]
Graphics  1280, 720, 24, 2
AppTitle ">>> Sinus Effekte <<<"
SetBuffer BackBuffer()

;------------------------------------------------------------------------------------
Include "Includes\Menue.bb"
Include "Includes\WaveView.bb"
Include "Includes\Calculations.bb"

;----------------------------------------------------------------------------------
Global BildBreite% = 0
Global BildHoehe% = 0
Global Bild% = 0
Global MouseButton% = 1

Global maus = CreateImage(1,1) ;Grafik für Maus Pointer


;--------------------------------------------------------------------------------------------
font = LoadFont("Arial", 24, 1, 0, 0) ;Font Variablen
SetFont font ;Font setzen

;--------------------------------------------------------------------------------------------
;CreateMainMenue()

;----------------------------------------------------------------------------------------
LoadGfx ()

;-------------------------------------------------------------------------------------
Global Screen%=0
Global ScreenDone%=0
Global MausHit%=0

;---------------------------------------------------------------------------------------

Menu = 0
Repeat

Cls
MouseOver ()
MausHit = MouseHit(1)

If ((Menu>0) And (MausHit > 0)) Or (ScreenDone = 0)
Select Screen
Case 0
MainMenue()
Case 1
WaveMenue()
End Select
EndIf

DrawMenue()
If (Screen>0) And (ScreenDone=1)
DrawResults()
EndIf
Flip


Until KeyHit(1)



Function LoadGfx()

Bild = LoadImage ("Media\farbrausch.jpg")
BildBreite = ImageWidth (Bild)
BildHoehe = ImageHeight (Bild)

End Function

Function MainMenue()

If ScreenDone = 0
CreateMainMenue()
ScreenDone = 1
Else
Select dButton(Menu)\cmdCaption
Case "Image Sine Waves"
Screen = 1
ScreenDone = 0
Case ">>>> END <<<<"
Quit()
End Select
EndIf
End Function

Function DrawMenue()

For ObjektIndex = 1 To ButtonNum
If Menu = ObjektIndex
DrawMenueGraphics("enabled")
Else
DrawMenueGraphics("disabled")
EndIf
Next

End Function

Function DrawResults()

ViewWave("horizontal")

End Function

Function WaveMenue()

If ScreenDone = 0
CreateWaveMenue()
ScreenDone = 1
Else
Select dButton(Menu)\cmdCaption
Case "X-Wave"
CalcSin(18, 2 )
Case "Periode +"
Periode = Periode + 1
CalcSin(18, Periode )
Case "RETURN"
Screen=0
ScreenDone=0
End Select
EndIf

End Function







Function CreateMainMenue()

ButtonNum =0

SetButton("Image Sine Waves", 50, 50, 300, 50)
SetButton("Image Sine Motion", 50, 120, 300, 50)


SetButton("Image Split X/Y" ,50, 190, 300, 50)
SetButton("Image Split in Motion" , 50, 260, 300, 50)

SetButton("Image Roll" ,50, 330, 300, 50)

SetButton("Image Double Split" , 50, 400, 300, 50)
SetButton("Image Rubber Split" , 50, 470, 300, 50)

SetButton("Copperbars" , 450, 50, 300, 50)
SetButton("Copperbars Sinepatch" , 450, 120, 300, 50)
SetButton("Copperbars Splits" , 450, 190, 300, 50)

SetButton("Circle" , 850, 50, 300, 50)
SetButton("Sins Char Scroller" , 850, 120, 300, 50)
SetButton("Sine Rubber Scroller" , 850, 190, 300, 50)
SetButton("Circle Char Scroller" , 850, 260, 300, 50)
SetButton("Circle Rubber Scroller" , 850, 330, 300, 50)

SetButton(">>>> END <<<<" , 950, 650, 300, 50)

CreateEnableDisableImage()

End Function

Function CreateWaveMenue()

ButtonNum =0

Viewport(10, 50, 200, 300)

SetButton("X-Wave", 50, 50, 110, 30)
; SetButton("Y-Wave", 20, 130, 110, 30)
SetButton("Periode +", 20, 10, 100, 30)
; SetButton("Periode -", 160, 130, 100, 30)
SetButton("RETURN", 50, 430, 100, 30)

SetBorder(400, 100, 800, 413)

CreateEnableDisableImage()

End Function


;~IDEal Editor Parameters:
;~F#40#48#58#64#6A#7B#9B
;~C#Blitz3D



Noch eine Bitte:

Nimm bitte die schrecklich langen "----------" Trennstriche aus dem Code! Die führen hier im Forum zur absoluten Unlesbarkeit des Codes. Die Scrollbalken verschwinden rechts aus dem Bildschirm. Man kann den code nicht mehr scrollen. 80 Zeichen lange Trennstriche sind lang genug!!!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group