Unterschied zwischen Funktionen und normalem Code
Übersicht

SevenBetreff: Unterschied zwischen Funktionen und normalem Code |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Tag,
ich arbeite hin und wieder gerne mit Funktionen, da ich diese Abschnitte auch in anderen Programmen noch verwenden will, aber leider habe ich ab und an Probleme den normalen Code in eine Funktion umzuformen. Was genau muss man alles beachten? Welche Nachteile haben Funktionen? Mir geht es genauer gesagt darum: Code: RX=300
RY=500 Graphics RX,RY,16,2 SetBuffer BackBuffer() drawdrop=False words$=RX + "x" + RY While Not KeyHit(1) Cls If RectsOverlap(125,50,25,20,MouseX(),MouseY(),10,10) And MouseHit(1) If drawdrop=False drawdrop=True Else drawdrop=False End If End If anz = CountGfxModes () If drawdrop=True Rect 50,50,100,200,0 For i=1 To anz Step 2 If i Then pickedword$=GfxModeWidth (i) + "x" + GfxModeHeight(i) Text 50,60+(i*10),pickedword If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),10,10) And MouseDown(1) words=pickedword drawdrop=False Graphics words,words,16,2 End If Next End If Rect 50,50,100,20,0 Rect 125,50,25,20,0 Text 50,50,words Flip Wend End (Zu Übersichtsverbesserung bin ich bisher nicht gekommen^^) Das ganze soll einfach ein Dropdown Menu sein, dass die Auflösung ändert. In Funktion Form sieht das bisher so aus: Code: Global RX
Global RY Global pickedword$ Global drawdrop Global words$ ;-------------------------------------- RX=300 RY=500 Graphics RX,RY,16,2 SetBuffer BackBuffer() ;-------------------------------------- Function Resolution() drawdrop=False words$=RX + "x" + RY If RectsOverlap(125,50,25,20,MouseX(),MouseY(),10,10) And MouseHit(1) If drawdrop=False drawdrop=True Else drawdrop=False End If End If anz = CountGfxModes () If drawdrop=True Rect 50,50,100,200,0 For i=1 To anz Step 2 If i Then pickedword$=GfxModeWidth (i) + "x" + GfxModeHeight(i) Text 50,60+(i*10),pickedword If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),10,10) And MouseDown(1) words=pickedword drawdrop=False Graphics words,words,16,2 End If Next End If Rect 50,50,100,20,0 Rect 125,50,25,20,0 Text 50,50,words Return drawdrop And RX And RY End Function ;----------------------------------------------- While Not KeyHit(1) Resolution() Flip Wend End Und die Funktion geht natürlich in der Form nicht... Am meisten wundert mich, dass sich das Menü aufklappen, aber nicht zuklappen lässt... |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
hier ein Tutorial zu Funktionen:
https://www.blitzforum.de/foru...hp?t=33468 Das solltest Du unbedingt lesen! |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Funktionen können durchaus komplex sein, aber einfach einen längeren Codeblock mit Function/End Function umrahmen, ist nicht die beste Lösung. Eine Funktion sollte eine spezifische Aufgabe lösen oder den Code in einen Zusammenhängenden Block zusammenfassen.
Ein Menu brauchst schon mal ein paar mehr Funktionen und mit Sicherheit Type ![]() Ein paar Hinweise: Du solltest deinen Code Einrücken und alle Variablen deklarieren - dann können wir deinen Code besser lesen und verstehen. Zu "MouseHit(1)" siehe Wie kann ich Mausklicks richtig abfragen ? Zu "Return drawdrop And RX And RY" du kannst keinen Logischen Operator dazu benutzen, mehrere Werte zurück zu geben... Funktionen geben einen Wert zurück. Immer. |
||
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) |
SevenBetreff: soo... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nun gut. Ich habe eure Verlinkungen etc. durchgelesen.
MouseHit(1) hat mir weiter verholfen. Das war wohl wirklich einer der Fehler. Field ist praktisch, aber ich denke, bei einer Abfrage von Auflösungen ist das noch nicht nötig. Wenn ich ein allgemeines dropdown Menü erstelle, dann werde ich aber nicht drumherum kommen. Leider funktioniert es immer noch nicht. Es liegt meiner Meinung nach nicht mehr an MouseHit(1), sondern eher daran, dass das Programm die Funktion durchfährt und nicht abwartet, ob noch etwas passiert. (Oder etwas in der Art^^) Das ganze sieht bisher so aus: (Die Variablen werden nun alle vorher aufgerufen und ich habe die Zeilen nicht mehr gekürzt stehen. Wenn noch etwas ist -> bescheid sagen) Code: Local RX
Local RY Global mh RX=300 RY=500 Graphics RX,RY,16,2 SetBuffer BackBuffer() ;-------------------------------------- ;-------------------------------------- ;-------------------------------------- Function Resolution(RX,RY) Local drawdrop Local words$ Local anz Local pickedword$ Cls drawdrop=False words$=RX + "x" + RY If MouseHit(1) Then mh=1 If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) And mh=1 Then If drawdrop=False Then drawdrop=True Else drawdrop=False EndIf EndIf anz = CountGfxModes () If drawdrop=True Then Rect 50,50,100,200,0 For i=1 To anz Step 2 If i Then pickedword$=GfxModeWidth (i) + "x" + GfxModeHeight(i) Text 50,60+(i*10),pickedword If RectsOverlap(50,50+(i*10),75,20,MouseX(),MouseY(),3,3) And MouseDown(1) Then words=pickedword drawdrop=False Graphics words,words,16,2 mh=0 EndIf If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) And mh=1 And drawdrop=True Then drawdrop = False mh=0 EndIf Next EndIf Rect 50,50,100,20,0 Rect 125,50,25,20,0 Text 50,50,words Text 5,20, MouseX() Text 5,35, MouseY() End Function ;-------------------------------------- ;-------------------------------------- ;-------------------------------------- While Not KeyDown(1) Resolution(rx,ry) Text 5,5, mh Flip Wend End |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nur mal so nebenbei: Diesen Code
Code: If drawdrop = False Then
drawdrop = True Else drawdrop = False End If kannst du gegen Code: drawdrop = Not(drawdrop)
ersetzen. Not liefert immer das Gegenteil des in Klammern übergebenen Wertes zurück. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tipp I
Also...wenn Du zukünftig Hilfe willst (also zumindest von mir...), wirst Du Dir wohl oder übel einen anderen Schreibstil angewöhnen müssen. Zwar "fehlte Dir die Zeit die "Übersichtverbesserung" vorzunehmen". Dafür sollen nun alle Anderen, die dir helfen sollen sich jeder die Mühe machen, oder was? Denn ohne Einrücken kann kein Fremder Deinen Code durcharbeiten! Also bitte! Nicht so respektlos! Im Forums-Texteditor gibt es extra einen Button für BB-Code. Statt [ CODE ] [ /CODE ] verwende also besser [ syntax="bb" ] und [ /syntax ] Tipp II Dann rücken wir alles schön ein, und schon sieht das Ganze übersichtlicher aus: BlitzBasic: If drawdrop=True Then Eingerückt wird immer nur über die TAB-Taste! und wenn Du das gleich beim Coden machst, werden auch die nachfolgenden Zeilen in der BB-Ide automatisch eingerückt. Schön, gell! Ach und gleich noch was: 3 Befehle kommen auf 3 Zeilen. Nie hintereinander in eine Zeile. "Geht zwar..." ist aber schlechter Stil und bei der Fehlersuche echt unübersichtlich [Tipp III] Alle Funktionen schreibst Du immer nach dem END, so dass alle Zeilen, die außerhalb von Funktionen sind, ganz oben im Code bleiben! BlitzBasic: Local RX% , RY% , mh% Nebenbei siehst Du hier, dass die LOCAL-Anweisungen auch auf eine Zeile dürfen und auch ganz wichtig. Während der Testphase erst mal kein Fullscreen Graphics rx,ry,16,2 sondern bitte ins Fenster, damit man an die IDE rankommt und den Debugger sieht! Die beiden Timer-Zeilen machst du einfach immer so wie hier im Beispiel, bis Du dich mal in das Thema reingelesen hast. Sie sorgen für eine ungestreßte CPU. TIPP IV Nochmal zu dem Graphics()-Befehl... Der streßt den Computer und die Grafikkarte und sollte nur ausgeführt werden, wenn wir uns bereits 100% sicher sind, dass wir ihn korrekt ansprechen. Besser ist ein BlitzBasic: DebugLog "SET: GRAPHICS " + Words + "," + Words + ",16,2" Wenn du so deinen Code ausführst, merkst du hoffentlich, dass deine Graphics()-Anweisung nicht korrekt ist, den der DEBUGGER gibt aus: Zitat: SET: GRAPHICS 1280x1024,1280x1024,16,2
...das war ja wohl nix!!! Tipp V Funktionen sind vergesslich! Wenn du sie verlässt, habe sie auch schon alles vergessen. Deshalb gibt es nur zwei Möglichkeiten, wie sie sich was merken könnten: Entweder Vergessliches GLOBAL machen. Oder Funktion nicht verlassen! z.b. brauchst Du deine Variablen drawdrop% oder mh% um zu wissen, ob die Box aktuell angezeigt werden soll. Beim Wiedereintritt in die Funktion sind sie aber wieder 0. Ich zeige Dir hier, wie man die Funktion nicht mehr verlässt: BlitzBasic: Local RX% , RY% , mh% Der Trick ist, das die Funktion eine eigene Repeat/Until-Schleife bekommt. Unschöner Stil aber für'n Anfänger tolerierbar. Das Ganze ist dann wie ein "Programm im Programm". |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Sir Gauss der III |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mir mal deinen Code angeschaut. Dein Menü klappt immer wieder zu, da sich die Function den zustand von drawdrop nicht merkt. siehe zur übergabe mehrer Variablen weiter unten.
Aber auch aus weiteren gründen. zum einen setzt du die Variable, die deinen Mausdruck abfragt, nicht mehr auf null. so drückst du in jedem Durchgang deine Maus.also entweder BlitzBasic: mh=0 oder, eleganter: BlitzBasic: mh=MouseHit(1) dann fragst du zwei mal ab ob man das menü aus bzw. einklappt: BlitzBasic: If RectsOverlap(125,50,25,20,MouseX(),MouseY(),3,3) And mh=1 Then da mh noch nicht gelöscht wurde, schließt sich das Fenster soffort wieder. .................. Um mehr als einen wert aus einer Function auszulesen kannst du einen string (also text) zurück geben und aus diesem dann die werte auslesen. Benötigte Befehle: left, instr, Rset, Len In deinem Fall benötigst du drei informationen. 1. ist das Menüfeld aus oder eingeklappt 2. x-auflösung 3. y-auflösung innerhalb der Function sammelst du die werte in einem String. so benötigst du nur noch eine Globale Variable, die du dann mit deinen Functionen in das jeweilige Programm übernimmst. Da du beim auslesen später die anzahl der Zeichen kennen musst, ist es etwas komplizierter da die x-auflösung 3-4 zeichen haben kann. daher trennen wir die Informationen zusätzlich mit einem beliebigen symbol. nehmen wir mal ";". Der Code würde dann in etwa so aussehen: BlitzBasic: Global gebvar$ Ich hab in schrittweise kommentiert, denke das und die Hilfe sollten in verständlich machen. Nun kannst du deiner function von außen mitteilen, ob sie an oder aus ist BlitzBasic: Resolution(an) ...................... Kommentiere etwas mehr deinen Code. dies hilft dir, bei späteren verbesserungen und verwendung des Cods, der Function, dich zurecht zu finden, berechnungen zu verstehen etc... ......................... prüfe die Maus nur ganz am anfang deines Hauptcodes. Wenn du nun 10 Menüpunkte hast (grafik, Spiel, Hilfe....) rufst du die Maus auch 10 mal auf wenn sie in den Functionen ist. besser ist es, alle benötigten abfragen zu begin fest zu halten, und wenn nötig an die functionen zu übergeben BlitzBasic: Repeat so benötigst du in deiner Function nicht immer eine RectsOverlap-abfrage, sondern kannst die schnellere (und einfachere) variante nehmen: BlitzBasic: If mausx>100 And mausx<150 Then nebenbei: es ist besser, weniger Abfragen in eine If bedingung zu packen. so wird, nur wenn die erste auch zutrift, die weitere bedingungen geprüft. schreibt man alles in eine If-zeile, so wird jedes mal jeder Punkt überprüft. in eine Function verpackt wäre das dann so: BlitzBasic: ;prüft ob eine taste in einem Feld gedrückt oder gehalten wird. ............... Wenn du etwas variabel Programmierst, wie die abfrage aller möglichen Bildschirmmodis, solltest du darauf achten dass alles zusammenpasst. so ist bei mir deine feldumrahmung zu klein ........... BlitzBasic:
anstatt i mit step 2 zu erhöhen, könntest du bei der textausgabe eunfach (i*20) machen. das hätte den selben effekt, ist weniger schreibarbeit und lässt sich besser einstellen (z.B. (i*19)) So, hoffe das hilft dir weiter. |
||
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für Ratschläge. So bin ich zu einigen Erkenntnissen gekommen.
Das Words funktioniert, hat mich schon, als ich die Zeile schrieb, stutzig gemacht, aber da es mich vorerst weitergebracht hat, kümmerte ich mich nicht weiter darum. Jedenfalls sieht das ganze jetzt so aus: BlitzBasic:
Und mit Graphics sieht das dann so aus: BlitzBasic: Local RX% , RY% , mh% Und es geht trotzdem nicht^^ Zumindest funktioniert es unzuverlässig. Mir klar, dass Graphics den Speicher entfernt, aber die Funktion sollte das doch durch die Schleife wieder ins Reine bringen... PS: drawdrop = not (drawdrop) hab ich diesmal eingesetzt:) Spart doch einige Zeilen. Sieht mit dem BB Syntaxhighlighting deutlich besser aus^^ EDIT: @ Sir Gauss der III Dieser Post entstand, bevor ich deinen Post gelesen habe. Ich werde ihn mir jetzt durchlesen. ;----------------------------------------------------- So, zu deinen Ratschlägen: Vor allem die Aufteilung des Strings kommt mir sehr zu gute. (Hatte vorhin ein Problem damit und musste mir anders behelfen, aber die Stringabfrage kommt mir trotzdem sehr zu gute:) ) Die Kommentare werde ich hinzufügen. BlitzBasic: Repeat Als Verständnis Frage: z.B. maushit muss ich nicht in die Repeat Schleife packen, sondern könnte sie auch einfach als globale Variable deklarieren, um den selben Effekt zu erzielen, oder? Das nachfolgende kommt mir aber ebenfalls zugute:) Den Rahmen werde ich gleich anpassen lassen. Step 2 ist tatsächlich nötig und für mich gerade unumgänglich. Wenn ich nämlich Step 2 weg lasse, dann sieht das Ergebnis in etwa so aus: 640 x 480 640 x 480 800 x 600 800 x 600 ... Die Auflösungen werden doppelt angezeigt und mit Step 2 umgehe ich das. |
||
![]() |
Sir Gauss der III |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie gesagt, ich halte es nicht für sinnvoll, innerhalb der Func zu bleiben. hat den nachteil dass du kein anderes drobdownmenü öffnen kannst ohne es in die Func ein zu binden. dann lieber mit globalen Variablen arbeiten.
zur Maus: BlitzBasic: Variable so im groben mal der Aufbau. die Mausabfragen werden im Hauptteil vorgenommen, nicht in den Functionen. maushit=0 und mausdruck=0 sind nötig, da eine einmal getätigte Taste sonst immer an bleibt. nun hast du 2 möglichkeiten. entweder, du verwendest grundsätzlich, in allen deinen Programmen, die selben abfragevariablen und setzt sie als global ein. oder du gibst die benötigten werte an die funcs weiter: BlitzBasic: Function Resolution(maushit,mausx,mausy) damit hätte Resolution nun alle infos die sie braucht. ich arbeite lieber mit der globalen variante, das erspart mir lange übergaben. Die doppelte ausgabe der Auflösung beruht in der tiefe (16 oder 32), und sollte evtl. mit abgefragt werden. es könnte ja sein, dass ein neuer PC in der Zukunft nur noch 32 anzeigen kann. dann hat er nur die hälfte seiner möglichen Auflösungen parat. sonst geht es dir wie Microsoft, die konnten früher keine festplatten mit mehr als öhm, glaub 500mb anzeigen. Gates war er meinung, mehr wird es nie geben. entweder zeigst du die Farbtiefe mit an, oder du prüfst ob die Auflösung die selbe ist, und wenn nicht, soll er von vorne beginnen. (eine zusätzl. zählvariable um die richtige position zu erhalten ist dann notwendig) |
||
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sooo... Zu den Variablen: Du hast recht und es leuchtet mir ein, aber vorerst will ich lieber
eine allein stehende Funktion haben. Außerhalb des Codes soll nichts gravierendes vorkommen. Im Hauptprogramm und vor allem wenn ich eine Ansammlung solcher Funktionen habe, dann werde ich globale Variablen nutzten. (Speziell denke ich da an MouseX() und MouseY(). Die kommen häufig vor) Ansonsten habe ich die If Anfragen geändert, die Farbtiefe mit rein genommen und ich habe die Automatische Menu Anpassung begonnen, aber nicht beendet, da ich die Auswirkungen meiner Änderungen nicht sehen kann-.- Wie gesagt, ich bin mir ziemlich sicher, dass es an Graphics liegt und ich bin mir auch ziemlich sicher, dass diesmal die Auflösung richtig eingestellt wurde. So sieht das ganze bisher aus: BlitzBasic:
PS: Die Tiefe ist doch nicht mit drin. Sie wird nur im Menu angezeigt, aber nicht umgesetzt. Ich ändere es später... Neben der Graphics Frage noch was: Gibt es irgendwo eine Auflistung von recourcensparenderen Wegen, oder wo gezeigt wird, welche schleife wie viel verbraucht. In der Hilfe z.B. heißt es auch Rect wäre bis zu 1.500 mal schneller als Line. Sowas eben. PS: Energie sparen am PC habe ich gelesen:) *kurz lob* |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
und du bist der Meinung, dass das so jetzt funktioniert? ![]() also... I. GRAPHICS entgegen meinem Ratschlag hast Du bereits wieder den Graphics als echten Befehl und nicht also DEBUGLOG eingesetzt. Wenn du ihn als DEBUGLOG einfügst, merkst Du dass da ein SCHWERER Fehler im Code ist: Der Graphics-Befehl wird aktuell dutzende Male hintereinander ausgeführt. Arme Grafikkarte!!! Aber ist ja Deine... II. Diese Zeile ist Unsinn: BlitzBasic: If Width < (StringWidth(words) + 10) Then Width = ResW + 10Da Funktionen ja vergesslich sind, wissen sie beim Neueintritt gar nix. Alle Variablen sind also an der Stelle, an der sie zum ersten Mal im Code verwendet werden GARANTIERT leer. So auch deine words. Da an dieser Stelle word noch leer ist, macht ein StringWidth(words) keinen Sinn! Nachzuprüfen über eine DEBUGLOG-Zeile: BlitzBasic: DebugLog " String Width = " + StringWidth(words) III. MouseHit() Man kann die Zeilen-Reihenfolge von MouseHit() und Mousex() nicht einfach umdrehen. Probier mal folgendes in deinem Programm: Klicke zuerst in die rechte untere Ecke, dann bewege die Maus in das Menü ohne zu klicken... MouseHit() "merkt" sich, ob es früher mal geklickt wurde. Gelöscht wird die Information erst, wenn man MouseHit() einmal verwendet. Also sollte die Abfrage von MouseHit() ganz weit oben im der Funktion stehen. Dort wo sie vom Programm sicher erreicht werden kann. IV Graphics ... woran liegt es nun, dass dein Grafikmode dutzende Male umgeschaltet wird? Du hast den Befehl in die FOR/NEXT-Schleife reingesetzt. Und die wird auch weiter abgearbeitet, auch wenn die Maus gedrückt wurde. Eine mögliche Abhilfe wäre ein RETURN: BlitzBasic: For i=1 To anz V. Ausblick Vorsicht! Jetzt wirds kompliziert... Schon mal mit TYPEN gearbeitet? Die wären die Lösung vieler Deiner Probleme. Ein TYPE ist eine Art Spezialvariable: Sie kann weitere Unter-Variable enthalten. Sie kann in einer Funktion erstellt werden und ist dennoch beim nächsten Wiedereintritt noch gültig. Harmloses Beispiel (bitte sofort ausprobieren): BlitzBasic: Type ResoBoxTyp Zur Erklärung: Ein Type wird zwischen TYPE und END TYPE definiert. Dazwischen kommen die Untervariablen hinter das Wort FIELD: BlitzBasic: Type ResoBoxTyp Dann muss diese gewöhnungsbedürftige Zeile rein: BlitzBasic: Local ResoBox.ResoBoxTyp=First ResoBoxTyp Bedeutet: Ab jetzt gibt es eine solche Spezial-Variable. Ihr Name ist ResoBox Ihre Untervariablen werden mit dem Schrägstrich angesprochen: BlitzBasic: ResoBox\Breite=100
Nun kannst du so viele Untervariablen in die Fields setzen wie du Lust hast. Und alle sind beim Wiedereintritt in die Funktion noch voller Inhhalt. |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Sir Gauss der III |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, es gibt eine möglichkeit um zu sehen wie schnell eine Function etc. ist.
dazu benötigst du den Befehl MilliSecs. Der gibt dir aus, wie viel zeit (100stel Secunden) seit dem PC start vergangen sind. wenn du die zeit vor einer Aktion und direkt danach abfragst, kannst du sehen wie lange sie benötigt: BlitzBasic: n=MilliSecs() beim ausführen des codes waren 1000 linien mit line ca 3mal langsamer als mit rect. ........... [Edit] hatte was falsch verstanden, den Abschnitt nur bei interresse beachten, ansonsten ignorieren ^^ BlitzBasic: ... mousex() und mousey() machen dein Programm unnötig langsamer. zwar kaum merklich, aber denoch. Beide sind im grunde Functionen, enthalten also mehr code als nur eine Variable. Bei jedem aufruf wird erneut geprüft, wo sich die Maus nun befindet. das gleiche gilt für mousehit(). hier kommt noch dazu, dass mousehit(1) nach dem erstn abfragen gelöscht und auf null gesetzt wird. es kann (in deinem code zwar nicht) vorkommen, dass du mehrmal hintereinander mousehit aufrufen musst. frag die Mausvariablen alle zu beginn deiner Hauptschleife einmal ab und speichere sie. dann übergibst du die benötigten an deine Function. BlitzBasic:
deine function blaibt so immer noch unabhängig von den Variablen die du im HP nutzt, verliert aber keine resourcen mit dem prüfen der Mauszustände. zudem verlierst du keiner informationen durch doppeltes abfragen. ....... BlitzBasic: If Width < (StringWidth(words) + 10) Then Width = ResW + 10 Midimaster hat es ja schon angesprochen, diese Zeile sorgt dafür, das Width immer 100 hat. zumindest solange bis ResW einen wert bekommt. Ich geh mal davon aus, dass es noch nicht fertig ist. wenn ich es richtig interpretiere, soll hier die Breite des menüs angepasst werden. wie gesagt, geht mindestens so lange nicht bis ResW einen wert erhält. (selbes bei Words) ..... BlitzBasic:
wenn du das Menü variabel gestaltest, also dem nutzer der Function überlässt wo es eingezeichnet wird, sollte auch die Ausgabe variabel sein. also Text, PX,PY,words du willst hier, so wie ich es rauslese, in das Menü die momentane Auflösung schreiben. Da du jedoch das Menü (die Function) mit der Wahl des Graphicmodus verlässt, werden alle Variablen auf null gesetzt. daher hat Words, das erst bei der Wahl eines Modus wieder einen Wert erhält, dauerhaft nichts. dann aber verlässt du die Function und löscht den wert gleich wieder. Lösung: Entweder die Funktion anders verlassen, die Werte global setzen oder (was ich rate) über einen String wie gestern beschrieben ans HP zurück und wieder an die Function übergeben. ...... BlitzBasic: Rect PX,PY,Width,PY + 10 * anz,0 ;Auswahl Rechteck An sich nicht Falsch. nur solltest du "PY + 10 * anz" mit einem Wert mal nehmen, den du als abstand für deinen Text nimmst (derzeit 15). dann noch etwas feinjustierung, und die Tiefe passt schon mal. Die breite aus den oben genannten gründen leider noch nicht. Zum testen: setze einfach die Anzahl mauel fest, und die Variable pickedword, PickedHeight, PickedWidth auf null. so kannst du eine beliebige menge simulieren und erkennst, ob sich dein Feld anpasst oder nicht. .... BlitzBasic: If MouseX() < (PX + 100) And MouseX() > PX Then ;...und wenn etwas innerhalb Das hier muss nochmal überarbeitet werden. derzeit kann es sein, dass man eine größere Auflösung bekommt als man möchte. denn jeder schritt prüft, ob man zwischen ganz oben und der momentanen auflösung drückt. wie weit oben ist dabei egal. |
||
- Zuletzt bearbeitet von Sir Gauss der III am Fr, Okt 14, 2011 17:40, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sir Gauss der III hat Folgendes geschrieben: 100stel Secunden Milli! Tausendstel! ![]() Aber viel wichtiger: Was schneller ist, hängt auch davon ab, in welcher Reihenfolge man zeichnen kann. Wenn man ein paar Linien hintereinander zeichnen kann, lohnt es sich, den Buffer zu sperren: BlitzBasic: Local n,x |
||
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) |
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sry, für die Abwesenheit und danke für die Hilfe.
Types haben mich bisher immer abgeschreckt, aber nun habe ich mich damit ein wenig befasst. Ich habe nur ein schlechtes Gewissen wegen den vielen Types die ich benutzt habe. Ist das schlimm? Würde man es beim Aufruf überhaupt merken, selbst mit einem Blick auf den Taskmanager? Man kann die Types ja wieder entfernen und damit wären sie für den Rest des Programms nicht mehr hinderlich, oder? Naja, nun zum eigentlich Code: BlitzBasic:
Ahja, danke für das aufzeigen von "DebugLog". Wirklich äußerst praktisch. Hier sei erwähnt; Ich habe von vorne begonnen und dem alten Code sehr wenig Beachtung geschenkt. Die "Features" sind im Grunde drinnen und scheinen zu funktionieren und gerade fällt mir zur späten Stunde nicht mehr ein, was ich noch brauchen werde. Mein Problem ist bloß; Es geht nicht xD Laut Debuglog sollte es eigentlich funktionieren, oder sehe ich es einfach nicht? Dann noch zu letzt; @ Sir Gauss Sowohl der erste, als auch der zweite Teil deines Beitrags helfen mir weiter:) Ich grad gerade aber ein müde, deswegen werde ich mir das morgen genauer ansehen und die Fragen in dem Bereich folgen auch morgen. @Xeres LockBuffer sehe ich hier zum ersten mal in praktischer Benutzung und gerade fallen mir ein paar Dinge ein, die man damit verbessern könnte^^ Wird das beim laden benutzt? |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich konnte auf die schnelle zwei fehler finden:
1. diese 3 Befehlszeilen gehören innerhalb der MausDown: BlitzBasic: If MouseDown(1) Then 2. Du hast die Parameter bei Graphics versehentlich vertauscht: BlitzBasic: Graphics Menu\Width, Menu\Height , Menu\depth , 2 erst Depth, dann Mode! Außerdem Gratulation bei den TYPES. Den Einstieg ins Thema hast du geschafft. Und nein! Es sind nicht zu viele. Überhaupt, wie meinst Du das? Du benutzt genau ein einziges Type! nämlich DropDown. Und du benutzt nur ein einziges Objekt von Type Dropdown, nämlich Menu . Der Rest sind nur die Fields aus diesem Objekt. Zeitlich macht es keinen Unterschied, ob du mit oder ohne TYPES arbeitetest, oder ob du 10 oder 1.000 benutzt. Und nein, man kann davon nichts im Taskmanager sehen. Vielleicht mal mein TYPES-Tutorial lesen: https://www.blitzforum.de/foru...hp?t=33551 STRING ist übrigens im Grunde auch ein TYPE und INTEGER auch eines. Und alle deine Variablen wie RX sind nix anderes als Objekte von Type INTEGER |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Seven hat Folgendes geschrieben: Ich habe nur ein schlechtes Gewissen wegen den vielen Types die ich benutzt habe.
Viele? Ich sehe nur einen. Wenn du ~10000 Objekte eines Types erstellst oder 5 verschiedene Types für die gleiche Sache benutzt, könnte man Anfangen sich zu wundern. Bis hier hin ist alles Super-duper. Du passt sogar auf, nicht ständig neue Objekte zu generieren!
Ist das schlimm? BlitzBasic: Local Menu.Dropdown = First Dropdown Astrein gelöst. LockBuffer ![]() ![]() ![]() 2 Kleine Hinweise: - Du benutzt Waittimer 2x - Streich den einen aus der Funktion. - Du vertauschst Modus und Bittiefe ![]() |
||
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) |
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah, ich meinte Field und danke^^
Aber wenns ok ist... Depth vertauscht... doch so was einfaches. Ich dachte schon ![]() Jedenfalls sieht es jetzt so aus: BlitzBasic: Type Dropdown Das Tutorial werde ich mir gleich mal durchlesen. Ich hatte bei meiner Suche ein anderes gefunden und dann sind mir noch robs tutorials eingefallen. Zu dem Code; Es funktioniert etwas unzuverlässig. Sobald Graphics aktiv wird, zerstört er mir die ganze Function. Zum einen Funktioniert das ein und ausklappen nicht mehr Zuverlässig und zum anderen muss ich immer irgendwie rumtippen, damit er den Bildschirminhalt wieder vernünftig ran zeichnet. Bei der Gelegenheit noch eine Frage; Kann man sich irgendwo ansehen, wie die gegebenen Funktionen, wie z.B Rect, aussehen? |
||
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zum 1.: Du musst nach einem Aufruf von Graphics Blitz wieder anweisen, den Backbuffer zu verwenden (wusste ich selbst nicht, man lernt nie aus ![]() Und 2.: Ich weiß zwar nicht genau, was du meinst, daher rate ich mal: Es gibt hier im Forum die Onlinehilfe, welche du auch runterladen kannst. Da hast du einen Überblick über alle Standardbefehle (sowie die der Befehlsbibliotheken, die eingepflegt wurden): Die Parameter, den eventuellen Rückgabewert, Hinweise zur Benutzung sowie ein Beispiel. Die Befehle kannst du auch hier direkt verlinken, mit "[ [ Befehlsname ] ]" (ohne Leerzeichen) wirst du dann direkt auf die Seite des Befehls geführt. Beipsiel: CountGfxModes ![]() |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Verdammt, mit Backbuffer funktioniert es wirklich:D
Danke ![]() Somit ist das erstmal fertig. Zu 2. : MouseX ![]() ![]() ist und als Standartbibliothek beigelegt wird. Ich habe mir die Online Hilfe durchgeguckt und auch gedownloadet, nur dass ich bei der gedownloadeten Version die Befehle nicht richtig aufrufen kann. (Chrome hat scheinbar ein Problem damit) Es wird nicht gezeigt, wie die Function selbst aussieht. (Ich will nicht sehen, wie ich sie benutze) |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der C++ Quellcode von BlitzBasic ist nicht einsehbar und würde dir vermutlich auch nichts bringen. | ||
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group