[GELÖST] Eine MenuButton Erstell Funktion erstellen?
Übersicht

CO2ehemals "SirMO"Betreff: [GELÖST] Eine MenuButton Erstell Funktion erstellen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
Ich möchte eine Funktion schreiben, welche einen MenüButton erstellt, und diesen dann auch updated, d.h die Funktion muss in der Hauptschleife stehen, was verhindert, das ich ein externes Bild Laden könnte (Und dafür war die Funktion eigentlich Gedacht), Da es dann jeden schleifendurchlauf geladen wird. Da ich die Funktion allerdings so "mobil" wie möglich halten will (Also das ich sie auch ohne weiteres in anderen Codes verwenden kann), schließt sich die Globale Variable aus, zumal die Funktion hinterher in eine externen Datei stehen wird. Meine Frage: Kann man das auch anders lösen und wenn ja, wie? mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
- Zuletzt bearbeitet von CO2 am Mi, Aug 24, 2011 23:30, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine Button-Funktion habe ich in jedem BCC Beitrag in dem einer benötigt und erlaubt ist.
Ich verstehe nicht ganz, was das Problem mit dem Bild oder Globalen sein sollte. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok,
![]() Function CreateAndUpdateButton(ButtonFileNormal:String, ButtonFileMouseOn:String, Posx:Int, Posy:Int, Sizex:Int, Sizey:Int, MousexPos:Int, MouseyPos:Int) Diese Funktion müsste nun in der Hauptschleife Stehen, heißt: BlitzMax: [AUSKLAPPEN] Repeat So, Und da alles, was in der Hauptschleife steht, 60 mal oder mehr pro sekunde ausgeführt wird, werden auch die Bilder in den beiden markierten (;MARKIERT) Zeilen 60 mal pro sekunde geladen, was nicht nur den Prozessor, sondern auch den RAM hoffnungslos überlastet. ![]() mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum lädst du die Bilder nicht vor der Hauptschleife?! | ||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ohne viel nachzudenken, lege ich dir Types ans herz.
Dein Problem wie du es beschreibt, würde ich über ein Type und eine dort eingebundene Global machen. BlitzMax: [AUSKLAPPEN]
Hier mal eine grundversion. Durch die abstract klasse kannst du nun beliebig viele buttontypen adden und in TButtons.buttonlist einfügen. Die funktion TButtons.DrawAll() kommt in deine hauptschleife. So würde ich das beheben ![]() Allerdings gibt es auch eine andere möglichkeit, eine simplere ![]() Das ganze sieht dann etwa so aus: (ich bin mir nicht ganz sicher, ob ich den Funktionspointer nun richtig eingelesen hab, bin ein wenig müde!) BlitzMax: [AUSKLAPPEN]
Wie gesagt, 2 lösungen. Achja, noch was einfacheres ![]() 1) Zitat: Arrow Und hier das Problem mit der Globalen Variable: Da die Funktion später in einer externen .bmx-Datei steht, und sie nur via "Include" Ins Programm includiert wird, kann ich keine Globale variable benutzen.
Include ungleich Import. Stell dir ein Include so vor, als würde der Compiler rumrennen und jegliche per Include eingebundenen bmxdateien öffnen, die sourcecodes zusammenkopieren und dann als eine große datei Compilen. 2) Den 2ten punkt hab ich vergessen <.< Aber es spricht absolut nichts gegen eine globale variable. Egal wo die datei herkommt, sie wäre da. Wenn ich mich nicht irre ![]() Schöner sind allerdings sammlungen in einem Type, da so der Endbenutzer nicht das problem hat, das Variablen-namen belegt sind. Hierzu solltest du aber nicht unnötig viele instanzen eines objektes erstellen, nutz einfach nur ein Dummyobjekt mit passendem, ersichtlichen Namen, und trage dort beliebig viele Global-felder ein. Na vielleicht hast du dein problem schon gelöst. Vielleich auch nicht ^^ Ich hoffe jedenfalls, ich konnte ein wenig helfen und hab nicht zuviel bockmist geschrieben. Kaffe, ich komme ![]() Mit freundlichen Grüßen - PhillipK! ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es spricht bei BMax auch nichts gegen eine Globale innerhalb der Funktion, da ja die Daten dennoch gekapselt vorliegen.
BlitzMax: [AUSKLAPPEN] Function bla() EDit: argh, das ist natürlich nur für einmal verwendete Ressourcen brauchbar. Ansonsten lager das ganze in einen eigenen Type aus wie vorgeschlagen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mal grade so, weils angeschnitten wurde:
Ich hab noch nie eine Globale innerhalb einer funktion benutzt. Wie genau funktioniert das? Speicher, der reserveriert wird und nicht neu initialisiert wird? Aber ständig im Scope der Funktion aufrufbar ist? BlitzMax: [AUSKLAPPEN]
Gibt das unterschiedliche werte? ![]() |
||
![]() |
DaysShadow |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja gibt unterschiedliche Werte.
Globale Variablen in Funktionen sind gleich mit z.B. mit "static" definierten Variablen in C/C++/C#/Java usw. "static" triffts auch irgendwie vom Keyword her, die Variable ist statisch in der Funktion vorhanden, sie wird nicht jedesmal neu erstellt oder der Wert zurückgesetzt und behält damit z.B. auch den Wert. Nur darauf zugreifen kann man von außerhalb nicht, sie ist also nur in der Funktion aufrufbar oder über Pointer. Daher ist Global halt ein wenig irreführend von der Bezeichnung her bei Funktionen, da Global Variablen ja sonst wirklich global sind und von überall aus aufgerufen werden können, nur halt hier nicht. |
||
Blessed is the mind too small for doubt |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ist das wirklich reines BlitzMax??? Du hast da einige typische BB-Codestellen drin, die unter BlitzMax Fehler sind:
BlitzBasic: [AUSKLAPPEN] Local ButtonBild1 = LoadImage(ButtonFileNormal) ;MARKIERTin BlitzMax: [AUSKLAPPEN] Local ButtonBild1 = LoadImage(ButtonFileNormal) 'MARKIERT BlitzBasic: [AUSKLAPPEN] Until KeyHit(1)in BlitzMax: [AUSKLAPPEN] Until KeyHit(Key_Escape) Hier mal mein Vorschlag zur Button-Verwaltung: BlitzMax: [AUSKLAPPEN] Type ButtonTyp |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
BladeRunner hat Folgendes geschrieben: BlitzMax: [AUSKLAPPEN]
Function bla() EDit: argh, das ist natürlich nur für einmal verwendete Ressourcen brauchbar. Ansonsten lager das ganze in einen eigenen Type aus wie vorgeschlagen. Mh, wieso macht mans nicht direkt so? Hier die funktion, die CO2 gepostet hat, erweitert um 2 felder für file-namenspeicherung, sowie 2 globals für die TImages. BlitzMax: [AUSKLAPPEN] Function CreateAndUpdateButton(ButtonFileNormal:String, ButtonFileMouseOn:String, Posx:Int, Posy:Int, Sizex:Int, Sizey:Int, MousexPos:Int, MouseyPos:Int) Wenn das mit den globals innerhalb einer funktion stimmt, so müsste das funktionieren. Somit hast du lediglich 2 IF abfragen die je einen String vergleichen. Das nachladen der bilder passiert nur, wenn die angegebenen parametern nicht mit denen des letzten aufrufes übereinstimmen. Eventuell sollten die alten bilder vor dem laden der neuen noch gelöscht werden (wenn sie irgendwo anders Referenziert sind, gibts ein memleak!) Die funktion ist in soweit auch portierbar, da die Globalen innerhalb der funktion liegen -> Der Restliche teil des programms hat keinerlei zugriff darauf. Für mich klingt das so nach dem einfachsten weg - dies ist allerdings abzuwägen, denn je komplexer eine Programmstruktur sein soll, desto sauberer sollte man auch arbeiten. Das heißt, das ganze als Type könnte dennoch sinnvoll sein. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@PhillipK
das hatte ich auch erst gedacht....und wollte ihm einen Tipp schreiben, der sehr nah an seinem Ausgangscode orientiert war. Der Haken ist aber, das man die Funktion alleine so nur für einen Button brauchen kann. Höchstens in der Kombination mit Bladerunners "TYPE und ABSTRACT" ist es verwendbar. Aber dies erschien mir nun sehr "abgehoben" und angesicht der Beginners-Corner unangebracht. Ich denke, die beste Lösung ist ein konsequent durchgezogener TYPE mit Fields, Funktionen und Methoden. In meinem Beispiel habe ich sogar die TList noch weggelassen. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das macht keinen großen Sinn, weil die Funktion für exakt ein Bild gut ist, und man müsste für andere Bilder neue Funktionen schreiben - und Wiederverwendbarkeit ist der eigentliche Sinn von Funktionen.
Deine Version hier ist auch nicht unbedingt besser als die weiter oben, wo jeden Schleifendurchlauf die Bilder neu geladen werden - jedenfalls wenn man 2 verschiedene Bilder hintereinander verwenden will. Wenn man keine Types verwenden will, muss man bloss ein Bild laden und dieses an die Funktion übergeben. Ich verwende immer Bilder mit mehreren Frames; Normal/Hover nebeneinander und gebe den Normal-Frame an, Hover = Normal-Frame+1. Mauskoordinaten & Klicks sind sowieso Global zugänglich - mit 3 bis 4 Parametern hat man hübsche, funktionelle Buttons. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, erstmal danke für die zahlreichen Antworten. Soo,
@ Xeres: Und wie soll ich die dann mithilfe der Funktion anzeigen lassen? Es geht ja darum, das ich eine separate Funktion(/Type) habe, die sich um das Button zeichnen, das Button updaten, etc. kümmert. @ PhillipK: Kann ich denn die Types in externen dateien speichern und diese dann im hauptprogramm "laden"? (P.S.: Zitat: Stell dir ein Include so vor, als würde der Compiler rumrennen und jegliche per Include eingebundenen bmxdateien öffnen, die sourcecodes zusammenkopieren und dann als eine große datei Compilen. @ Midimaster: Den code hatte ich auf die schnelle dahingeschrieben... Deshalb die Fehler (hab immernoch syntax, etc. von BB im Kopf ![]() In meinem Beispiel habe ich sogar die TList noch weggelassen. mal ne allgemeine Frage: Was ist eine List, und was macht die?)
Soo, hoffe habe alles beantwortet, mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
CO2 hat Folgendes geschrieben: Und wie soll ich die dann mithilfe der Funktion anzeigen lassen? ...DrawImage? Kann sein, das ich kein Gefühl mehr für die Schwierigkeit dabei habe - möchtest du ein Beispiel?
Wie man Listen verwendet, solltest du dir in jedem Fall aneignen. Darin speichert man die Referenzen zu seinen Objekten (das was in BlitzBasic automatisch passiert). |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, hier mal ein schnell dahingeschriebener Code, wie ich mir das vorstelle:
BlitzMax: [AUSKLAPPEN] 'VARIABLEN Oder wie meinst du das? "List" werde ich mir anschauen ![]() mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du kein SuperStrict / Strict am Anfang des Codes zu stehen hast, ist der Code kaum zu gebrauchen. Bilder sind Timage Objekte und sollten als solche verwendet werden. Int handel sind langsam und du kannst keine Methoden darauf anwenden (glaub ich - kam mir nie in den Sinn das aus zu probieren).
Ansonsten: Ja, außer das ich die Funktion einfach "Button" und direkt in die If-Abfrage schreiben würde. If Button(...) then... und die Maus-Daten sind bestimmt auch Global gut aufgehoben, die als Parameter zu übergeben würde ich sparen. |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
also ich würde folgendes ändern:
1. SizeX und SizeY können direkt aus dem Bild gelesen werden. Also mach es nicht selbst! 2. Es macht keinen Sinn, bei gedrückter Maus zunächst das Bild1 zeichnen zu lassen, um es dan mit Bild2 zu übermalen. Also IF...ELSE...ENDIF 3. Die Bilder die du übergibst sind vom Typ TIMAGE und nicht vom Typ INT 4. Wenn die Funktion etwas zurückgibt, dann ist sie selbst vom Typ INT 5. Die Zwischenspeicherung in beendenbuttonueberpruefen ist unnötig 6. Die Mouse() muss nicht übergeben werden. Sie steht auch in der Funktion zur Verfügung. BlitzMax: [AUSKLAPPEN] 'VARIABLEN |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
@ Xeres: Bin es noch aus BB gewohnt, dort waren Bilder immer Ints ![]() @ Midimaster: 1. Da wusste ich den Befehl nicht ![]() 2. Der Code war schnell hingeschrieben ![]() 3. siehe Xeres 4. Verstehe ich nicht... Die Funktion soll doch einen Int zurückgeben, deshalb ja auch return 0 oder return 1 ![]() 5. Siehe 2. 6. Ok, das war dann ein Folgefehler: Also, eigentlich werden MouseX() und MouseY() in einer Globalen Variable gespeichert, der schnelligkeit halber habe ich dies im obigen Code ausgelassen und die Werte direkt als Parameter der Funktion übergeben. Deshalb benutze ich die Mouse() befehle auch nicht in der Funktion... Besten dank euch beiden, denke das Thema hat sich geklärt ![]() mfG, CO2 |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist das nun ein Fall von "Einsicht" oder "Beratungsresistenz"???
Klingt so, als hätte er nichts geändert....oder nichts ändern wollen... zu 1.) Und? weißt du ihn jetzt? zu 2.) also hast du es gelassen, oder was? zu 3.) heißt das nun, du hast es eingesehen und bist Xeres Weg gefolgt, oder heißt es, ich soll mir das Fett, das Xeres abgekriegt hat, mit ihm teilen? zu 4.) Ja!!! dann schreib auch INT hinter die Funktion! BlitzMax: [AUSKLAPPEN] Function CreateAndUpdateButton:Int( .... zu 5.) da isses mir wurscht, wie du es machst.... zu 6.) Ich glaub, du hast es immer noch nicht gerafft! Glaub ich's noch? Also Junge, du sollst dich nicht für Deine Fehler entschuldigen! du sollst Sie ausbessern... velleicht gehört das alles in den Fu-Thread verschoben? ![]() |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was hast du denn?! Komm mal wieder runter, ich habe dir nichts getan! ![]() Es ist ein Fall von Einsicht (sonst hätte ich wohl kaum nach ner besseren Lösung gefragt, oder?) 1.) Jo, kann man so sagen... 2.) Den Code habe ich noch nirgendswo stehen, er war lediglich als Muster gedacht... Und weil ich wusste, das es bessere Arten gibt, das umzusetzten, habe ich ihn so hier stehen lassen... 3.) Was soll ich darauf noch sagen?! Da fällt mir echt nix mehr zu ein!!! Denk mal bitte über die Antwort von dir nach und sag mir was ich darauf hätte antworten sollen! 4.) WIESO? BMax kann das auch ohne das es dahinter steht! EDIT: Ich lasse mich belehren: Das kann BMax doch nicht... 5.) Ja dann. 6.) Zitat: Ich glaub, du hast es immer noch nicht gerafft! Glaub ich's noch? Also ohne Witz... was soll das denn bitte?!
Zitat: Also Junge, du sollst dich nicht für Deine Fehler entschuldigen! du sollst Sie ausbessern... Ich habe mich nicht dafür entschuldigt, ich habe sie gerechtfertigt! Und wieso in Gottes Namen sollte ich die Fehler in dem Code der in diesem Threat steht ausbessern?! Das hat doch keinen sinn, in einer woche wird sich jmd diesen Threat anschauen und fragen was der denn soll, der Code wäre doch von anfang an richtig gewesen. Außerdem hilft die Fertige lösung keinem Anfänger, da sie wahrscheinlich nicht wissen werden, was der Code macht, und das läuft auf ein stupides Copy'n'Paste hinaus.
mfG, CO2 P.S.: Wenn die Antwort etwas pampig klang, schaut warum ich sie geschrieben habe! Bei dem Jungen fällt mir echt nix mehr ein. |
||
mfG, CO²
Sprachen: BlitzMax, C, C++, C#, Java Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti |
- Zuletzt bearbeitet von CO2 am Do, Aug 25, 2011 3:25, insgesamt einmal bearbeitet
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group