Arraydeklaration in Hauptprogramm <-> Function

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Reborn

Betreff: Arraydeklaration in Hauptprogramm <-> Function

BeitragDi, Jul 03, 2007 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Nach 3 Jahren hab ich BB mal wieder rausgekramt und mein damaliges Projekt überarbeitet und fortgesetzt. Leider stehe ich jetzt vor einem nervigen Problem. Ich arbeite an einem Mapeditor, welcher eigentlich so weit fertig war. Die Funktionen "Neue Map", "Speichern" und "Laden" wurden einfach mit Input() und Print abgehandelt. Zur Verschönerung wollte ich jetzt noch Popupfenster mit Buttons, sowie eine eigene Eingaberoutine einbauen. Eigentlich sollte das ja nicht schwer sein, da ich ja nur die Grafiken erstellen muss und beim Drücken der Buttons teilweise den selben Code wie in den alten Functions (speichern etc.) benutzen muss. Fürs Speichern, Laden und Beenden klappt das soweit auch, selbst mit der neuen Eingabe Function. Aber bei "Neue Map" hapert's noch. Dabei hab ich eine Möglichkeit gefunden, es hinzukriegen, doch interessiert mich, wieso meine eigentlich geplante Variante nicht klappt. Ich versuche mal den Code auf's Wesentliche zu beschränken:

Code: [AUSKLAPPEN]
Select windowtype
      Case 1
         Fenster(250, 100, "Neue Map?")
      Case 2
         Fenster(250, 100, "Öffnen, Mapname eingeben:")
      Case 3
         Fenster(250, 100, "Speichern, Mapname eingeben:")
      Case 4
         Fenster(250, 100, "Beenden?")
      Case 5
         Fenster(250, 100, "Mapgröße eingeben (in Tiles):")
;         la$ = eingabe(400, 300)
;         If MouseDown(28) Then windowtype = 6
      Case 6
         Fenster(250, 100, "Mapgröße eingeben (in Tiles):")
;         br$ = eingabe(450, 300)
;         If MouseDown(1) Then windowtype = 7
;      Case 7
;         mapx = Int(la$) - 1 : mapy = Int(br$) - 1
;         Dim map(mapx, mapy, 2)
;         windowtype = 0
   End Select

Diese Stelle des Hauptcodes prüft, welchen Wert "windowtype" hat. Jener wird beim Klicken auf die Icons, bzw. Drücken der Knöpfe entsprechend verändert und mit der Function fenster() ein anderes Fenster gezeichnet. Die Kommentare bei Case 6 und 7 erstmal nicht beachten...

Die Funktion fenster() sieht aufs Wichtige gekürzt so aus:

Code: [AUSKLAPPEN]
Function Fenster(laenge, breite, nachricht$)

   Select windowtype
      Case 1
         DrawBlock ok, gfx_x/2 - ImageWidth(ok) - 10, fy + breite - ImageHeight(ok) - 15
      Case 5
         DrawBlock ok, gfx_x/2 - ImageWidth(ok) - 10, fy + breite - ImageHeight(ok) - 15
         Text(gfx_x/2 - ImageWidth(ok) - 25, fy + breite - ImageHeight(ok) - 35, "X: ")
         la$ = eingabe$(gfx_x/2 - ImageWidth(ok) - 10, fy + breite - ImageHeight(ok) - 35)
      Case 6
         DrawBlock ok, gfx_x/2 - ImageWidth(ok) - 10, fy + breite - ImageHeight(ok) - 15
         Text(gfx_x/2 - ImageWidth(ok) - 25, fy + breite - ImageHeight(ok) - 35, "Y: ")
         br$ = eingabe$(gfx_x/2 - ImageWidth(ok) - 10, fy + breite - ImageHeight(ok) - 35)
   End Select
   DrawBlock abbrechen, gfx_x/2 + 10, fy + breite - ImageHeight(abbrechen) - 15
   
   If BildKollision(maus, mx, my, ok, gfx_x/2 - ImageWidth(ok) - 10, fy + breite - ImageHeight(ok) - 15) Then
      If MouseDown(1) Then
         Select windowtype
            Case 1
               windowtype = 5
               Delay 100
            Case 4
               End
            Case 5
               windowtype = 6
               Delay 100
            Case 6
               ; - 1, weil ein Array bei 0 beginnt
;               mapx = Int(la$) - 1
;               mapy = Int(br$) - 1            
;               
;               Dim map(mapx, mapy, 2)
;               
;               ; neue Map zentrieren
;               scrollx = 0
;               scrolly = -(((mapy + 1) - 15) * tile_gr)
;               windowtype = 0
         End Select
      EndIf
   EndIf
      
End Function


In der Function fenster() wird also jenachdem, welchen Wert windowtype hat, ein anderer Button gezeichnet, und gegebenenfalls eine Eingabe gestartet. Bis "Case 6" funktioniert auch alles, die Map wird dann auch erstellt, nur hat sie nicht die angegebene Größe, sondern immer die gleiche (1 Tile in X-Richtung, 6 in Y-Richtung). Benutze ich fenster() jedoch nicht und nehme stattdessen den kommentierten Code aus der ersten Codebox (oben), funktioniert es.

Die Frage ist jetzt, woran das liegt, denn es wird ja der gleiche Code ausgeführt. Ich dachte, dass der Array vielleicht nicht in der Function deklariert werden kann, aber das wurde er bei der alten laden()-function auch. Es liegt auch nicht daran, dass gebrauchte Variabeln nicht global deklariert wurden (wie so oft bei mir...). Bis auf la$ (Länge) und br$ (Breite) sind alle global und erstere reichen ja lokal, da sie nur in der Function fenster() benötigt werden. Ich hab's trotzdem ausprobiert, aber auch wenn la$ und br$ global sind, funktioniert es nicht.

Ich hoffe, dass das jetzt nicht zu verwirrend war und warte erstmal die Reaktionen ab. Vielleicht ist es wieder ein sehr simpler Fehler, ich weiß es nicht, jedoch verstehe ich nicht, warum der gleiche Code im Hauptprogramm funktioniert und in der Function nicht.

Ich bitte um Hilfe! Danke im Vorraus!

Reborn

BeitragMi, Jul 04, 2007 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin schon am überlegen, ob ich die Buttons nicht lieber sein lassen sollte... Die haben mein ganzes Projekt versaut! Ich hab noch ein wenig weiter probiert und irgendwie geht nichts mehr so richtig.

Eine Map zu öffnen scheint so weit zu funktionieren, aber beim Speichern hab ich ein Problem entdeckt: Wenn ich eine Map öffne, dann ändere und unter dem selben Namen speichere, sind nach dem Speichern die Änderungen nicht übernommen.

Ich frag mich, wie zum Teufel das sein kann? Ich benutze doch haargenau den selben Code wie vorher, als alles wunderbar geklappt hat. Der einzige Unterschied ist, dass der er nicht ausgeführt wird, wenn man eine Taste drückt, sondern, wenn ein Button angeklickt wird. Die Funktion wird ja aufgerufen, aber dann kommt so ein Murks dabei raus... Ich verzweifel langsam echt. Mittlerweile schließe ich auch nicht mehr aus, dass meine Eingaberoutine irgendeine Macke hat. Hier ist sie:

Code: [AUSKLAPPEN]
Function Eingabe$(x, y)
   ; Taste abfragen
   taste = GetKey()
   ; und zum String addieren
   If taste > 31 Then txt$ = txt$ + Chr$(taste)
   ; Backspace: letztes Zeichen löschen
   If taste = 8 And Len(txt$) > 0 Then txt$ = Left$(txt$, Len(txt$) - 1)
   
   ; Blinken des Cursors. Die Cursorzeit wird immer größer und wenn durch Mod der Rest der Division
   ; 1 ist, ist der Cursor zu sehen
   cursorzeit = (MilliSecs() - windowsstart)/500
   blinken = cursorzeit Mod 2
   Select blinken
      Case 0
         cursor$ = ""
      Case 1
         cursor$ = "|"
   End Select
   
   ; der Text wird angezeigt und zurückgegeben
   Text(x, y, txt$ + cursor$)
   Return txt$
End Function


Bei der Funktion "Neue Map" (mein ursprüngliches Problem, erster Post) hab ich mal versucht "mapx" und "mapy" direkt nach den Eingaberoutinen zu definieren und mit dem Eingabestring gleichzusetzen, dann verändert sich im Hintergrund zwar scheinbar die Maplänge und -breite korrekt, aber danach wird keine neue Map erstellt. Außerdem bekomm ich die Meldung "Array index out of bounds", wenn mapx oder mapy größer als die aktuelle Maplänge bzw. -breite sind. Dabei ging das vorher auch, mapx und mapy wurden einfach mit Input() neu definiert und dann der Array redeklariert. Und jetzt geht das nicht mehr?

Ich versteh echt nicht, wieso nichts mehr wirklich klappen will, wo ich den Code im Prinzip doch gar nicht verändert hab... Das ist echt nervig!!!

Hat nicht irgendjemand eine Idee... oder so? Sad
 

Lador

BeitragMi, Jul 04, 2007 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich habe dein Problem nicht wirklich verstanden, aber eine Sache fiel mir bei deinem ersten Post im Code auf:

MouseDown(28)

MouseDown() braucht entweder eine 1 (linke Maustaste) oder eine 2 (rechte Maustaste), soweit ich informiert bin.

Eventuell sind alle Variablen nicht global definiert. Und bei deiner Eingabe-Funktion soll doch eine Zahl (br = Breite der Map bzw. la = Länge der Map) herauskommen. Also solltest du machen:

If taste >= 48 And taste <= 57 Then txt = txt + a
Return txt

Hoffe wirklich das konnte dir weiterhelfen.

MFG Lador

Reborn

BeitragDo, Jul 05, 2007 1:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke schonmal für den Post!
Lador hat Folgendes geschrieben:
MouseDown(28)

Das ist ein Tippfehler, ich hatte nämlich zwischendurch mit Keydown(28) rumprobiert und das dann nachträglich nicht richtig geändert.
Zitat:
Eventuell sind alle Variablen nicht global definiert.

Hab ich auch gedacht, aber jetzt, wo ich IDEal benutze, wird mir das sogar angezeigt.
Zitat:
Und bei deiner Eingabe-Funktion soll doch eine Zahl (br = Breite der Map bzw. la = Länge der Map) herauskommen. Also solltest du machen:

If taste >= 48 And taste <= 57 Then txt = txt + a
Return txt

Joa, man könnte noch nen Filter einbauen für diese Situation. Aber die Eingabefunktion hält auch für Nameneingaben her. Und das kann nicht die Ursache der Probleme sein, da man bei meiner Eingabefunktion ja auch Zahlen eingeben kann... Wink
Zitat:
Hi, ich habe dein Problem nicht wirklich verstanden

Das hab ich mir schon fast gedacht... war wohl etwas zu verwirrend... Ich versuch daher das ganze hier nochmal neu aufzurollen und etwas verständlicher zu erklären:

---------------------------------------------------------------------------------------------

Es geht um meinen Tilemapeditor und die Funktionen "Neue Map", "Laden" und "Speichern". Zunächst sahen die aufs Wesentliche beschränkt so aus:

Code: [AUSKLAPPEN]
Function neuemap()

mapx = Input("Kartenbreite: ")
mapy = Input("Kartenlänge: ")

If mapx < 1 Then
   RuntimeError("Die Karte ist zu eng!")
ElseIf mapy < 1 Then
   RuntimeError("Die Karte ist zu kurz!")
EndIf

 - 1, weil ein Array bei 0 beginnt
mapx = mapx - 1
mapy = mapy - 1
   
Dim map(mapx, mapy, 2)

End Function


Code: [AUSKLAPPEN]
Function speichern()

save$ = Input()

karte$ = WriteFile("map\" + save$ + ".map")
   
WriteInt(karte$, mapx)
WriteInt(karte$, mapy)
   
For x = 0 To mapx
   For y = 0 To mapy
                For z = 0 To 2
             WriteInt(karte$, map(x, y, z))
      Next
        Next
Next

CloseFile(karte$)


Code: [AUSKLAPPEN]
Function laden()

load$ = Input()
   
   karte$ = ReadFile("map\" + load$ + ".map")
   
   If karte$ <> 0 Then   

      mapx = ReadInt(karte$)
      mapy = ReadInt(karte$)

      Dim map(mapx, mapy, 2)
      
      For x = 0 To mapx
         For y = 0 To mapy
            For z = 0 To 2
                map(x, y, z) = ReadInt(karte$)
            Next
         Next
      Next
   Else
      ;Fehlermeldung
   EndIf

End Function


So, das dürfte relativ leicht verständlich sein. Es wird mit Input jeweils der Name der Map, bzw. die Mapgröße abgefragt und daraufhin werden mapx und mapy nach und nach in die *.map-Datei eingespeichert. Das funktioniert alles einwandfrei, aber ist mit Input nicht sonderlich hübsch, da bekanntlich das gesamte Programm angehalten wird und derweil keine Grafiken gezeichnet werden können.
Daher wollte ich "mal eben" eine eigene Eingaberoutine (siehe oben) und Popupfenster einbauen. Die Buttons hab ich mir schnell gepixelt und dann eine Fensterfunktion geschrieben. Ich dachte, dass das ja eigentlich kein Problem sein wird, da ich den selben Code nur ausführen muss, wenn ein Button geklickt wird und nicht wenn eine bestimmte Taste gedrückt wird.
Irgendwie war dann aber doch alles nicht so einfach. Ich bin so vorgegangen: Als erstes sollte eine globale Variabel "windowtype" dafür herhalten, welche Art von Fenster gezeichnet werden soll. Diese würde dann in jedem Hauptschleifendurchlauf per Selectkommando überprüft und dann das entsprechende Fenster gezeichnet oder eben nicht (wenn windowtype = 0). Das sieht dann so aus:

Code: [AUSKLAPPEN]
Select windowtype
      Case 1
         Fenster(250, 100, "Neue Map?")
      Case 2
         Fenster(250, 100, "Öffnen, Mapname eingeben:")
      Case 3
         Fenster(250, 100, "Speichern, Mapname eingeben:")
      Case 4
         Fenster(250, 100, "Beenden?")
      Case 5
         Fenster(250, 100, "Mapgröße eingeben (in Tiles):")
      Case 6
         Fenster(250, 100, "Mapgröße eingeben (in Tiles):")
   End Select

windowtype wird dann per Tastendruck oder Buttonklick geändert:
Code: [AUSKLAPPEN]
If Keyhit(F2) then windowtype = 1
If Keyhit(F3) then windowtype = 2
If Keyhit(F4) then windowtype = 3
If Keyhit(esc) then windowtype = 4

Das klappt auch soweit noch, die Fenster werden alle korrekt angezeigt. Die Funktion "Fenster()" sieht dann so aus:
Code: [AUSKLAPPEN]
Function Fenster(laenge, breite, nachricht$)

-zuerst werden einige Rechtecke gezeichnet, um ein zentriertes Popupfenster zu erhalten und die nachricht$ wird ausgegeben. Also nur Rect-, Color- und Text-Befehle an dieser Stelle.

-dann wird erneut windowtype per Select ausgewählt und die entsprechenden Buttons gezeichnet, direkt nach der Selectabfrage der Abbrechenbutton, der in jedem Fenster gezeichnet wird.

-danach wird jeweils abgefragt, ob sich die Maus über dem Button befindet und geklickt wird. Generell liegt hier nicht das Problem, der Abbrechenbutton funktioniert z. B. überall Fehlerfrei. Die Beendenfunktion auch, da wenn geklickt wird lediglich "End" ausgeführt wird. Für den Abbrechenbutton sieht das z. B. so aus:

If BildKollision(maus, mx, my, abbrechen, xab, yab) Then
      If MouseDown(1) Then
         windowtype = 0
         Delay 100
      EndIf
EndIf


xab und yab sind zur Vereinfachung, eigentlihc sind die Koordinaten komplexer, aber es funktioniert. Was nicht so recht funktioniert, ist "Speichern" und "Neue Map". Öffnen scheint keine Probleme zu bereiten, es wird einfach das selbe wie in der obrigen "laden()"-Funktion ausgeführt, bloß bei Bildkollision(maus, mx, my, oeffnenbutton, ofx, ofy) und MouseDown(1). Auch mit der neuen Eingabefunktion klappt das, die wird nämlich in der Selectabfrage aufgerufen, in der auch die Buttons gezeichnet werden. Das sieht dann bezogen auf "Neue Map" z. B. so aus:

Code: [AUSKLAPPEN]
Select windowtype
     Case 5
          Drawblock ok, xpos, ypos
          la$ = Eingabe(xpos, ypos - 35)
     Case 6
          Drawblock ok, xpos, ypos
          br$ = Eingabe(xpos, ypos - 35)
End Select


Danach wird abgefragt, ob der Button geklickt wird und die Länge (la$) und Breite (br$) sollen korrekt in die Berechnung mit einbezogen werden, was aber nicht wirklich geschieht. Und das ist ja das kuriose, da ja quasi der selbe Code wie in der alten "neuemap()"-Funktion benutzt wird, nur eben bei Klicken des Buttons:

Code: [AUSKLAPPEN]
If BildKollision(maus, mx, my, ok, gfx_x/2 - ImageWidth(ok) - 10, fy + breite - ImageHeight(ok) - 15) Then
      If MouseDown(1) Then
         Select windowtype

            Case 4 ;Beenden
               End
            Case 5
                      windowtype = 6
               Delay 100
            Case 6
               mapx = Int(la$) - 1
               mapy = Int(br$) - 1

               ; - 1, weil ein Array bei 0 beginnt
               Dim map(mapx, mapy, 2)
               
               windowtype = 0
         End Select
      EndIf
   EndIf

So, da wäre eigentlich das Problem. Es muss nämlich an der Stelle liegen, da die Buttons eigentlich korrekt funktionieren, wenn ich bei Case 6 beispielsweise "End" hinsetze, funktioniert es auch, der Code wird also richtig bis dahin abgearbeitet. Aber wenn die neue Map deklariert werden soll, geschieht das nicht wie erwartet, sondern die Map hat immer die selbe Größe (ich glaube 4 x 4 oder sowas). Das wundert mich doch sehr, da es wie gesagt ja derselbe Code wie ursprünglich ist.

Ein weiteres Problem habe ich mit "Speichern". Das klappt zwar soweit, dass ich Maps speichern kann, aber sobald ich eine Map öffne, ein wenig verändere und dann wieder unter dem selben Namen abspeichern will, werden die Änderungen nicht übernommen und es wird stattdessen die Map quasi erneut geladen, bevor was verändert wurde. Auch hier hab ich ja den selben Code wir vorher benutzt, daher ist mir schleierhaft, warum sowas passiert. Mit der simplen Input-Speicher-Funktion konnte ich Maps auch einfach überspeichern...

Es wäre super, wenn sich da mal jemand durchkämpfen würde. Wenn ja, hoffe ich, dass es jetzt etwas verständlicher ist. Das bereitet mir nämlich echt Kopfzerbrechen...

Danke im Vorraus für jegliche Hilfe!

ChaosCoder

BeitragFr, Jul 06, 2007 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal vorneweg: Hab keine Lösung.

Aber ich würde dir mal ganz dringend Debug-Ausgaben zu machen. Lass dir mapx und mapy ausgeben, la und br, windowtype usw... Vielleicht kommst du so an die Fehlerquelle heran.

Dann ist mir was anderes aufgefallen:
Du benutzt dauernd bei den Kollisionen MouseDown(1). Ich weiß nich ob es vllt sein kann das mal in einem Schleifendurchgang 2x geprüft wird ob MouseDown(1) true oder false is aber wenn das sein könnte (eig. auch wenn nich, da es sauberer is) dann solltest du MouseDown(1) in eine Variable speichern und die immer abprüfen, da ja der MouseDown-Buffer bei jedem Aufruf gelöscht wird.
Ich weiß nich ob es das is, ich glaube eher nich weil du des bezüglich schon was geschrieben hast...

MfG
Chaos
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

Reborn

BeitragMo, Jul 09, 2007 2:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke schonmal!
ChAoS|DrAgOn hat Folgendes geschrieben:
Aber ich würde dir mal ganz dringend Debug-Ausgaben zu machen. Lass dir mapx und mapy ausgeben, la und br, windowtype usw... Vielleicht kommst du so an die Fehlerquelle heran.

Ich hab das jetzt mal probiert. Dabei hab ich zufällig bemerkt, dass die Arraydeklaration bei "Neue Map" parallel zur Eingabe der Y-Größe der Map stattgefunden hat, was wohl eine Fehlerquelle war. Alleine die Deklaration NACH der Eingabe zu machen, hat jedoch nicht gereicht, es will nur funktionieren, wenn der folgende Code im Hauptcode steht:

Code: [AUSKLAPPEN]
Select windowtype
                .......
      Case 7
         mapx = Int(la$) - 1
         mapy = Int(br$) - 1
         ; - 1, weil ein Array bei 0 beginnt
         Dim map(mapx, mapy, 2)
         
         ; neue Map zentrieren
         scrollx = 0
         scrolly = -(((mapy + 1) - 15) * tile_gr)
         windowtype = 0
   End Select


Wenn ich die Zeilen nach "Case 7" in eine Function packe, z.b. "neuemap()", funktioniert es nicht. Daher auch die Überschrift "Arraydeklaration in Hauptprogramm <-> Function". Ich bin mir sicher, dass Arrays auch in Functions deklariert werden können, das war in meinen alten Functions (oben) ja auch so. Und alle Variabeln in diesen paar Zeilen sind global, deswegen versteh ich beim besten Willen nicht, warum derselbe Code nicht auch in einer Function funktioniert...

Beim anderen Problem bin ich jedenfalls noch nicht schlauer. Ich kann die Maps zwar speichern, aber sobald ich eine Map unter dem selben Namen speichere, werden die Änderungen nicht übernommen. Ich hab versucht mich an einem Workaround versucht, indem ich erst überprüft habe, ob die zu schreibende Datei schon existiert und wenn ja, diese erst gelöscht habe, aber das hat nichts geändert. Da weiß ich wirklich nicht, woran das liegen kann und wie ich das beheben soll...

Großen Danke schonmal an alle, die das hier gelesen haben und noch lesen werden... Smile

Reborn

BeitragDi, Jul 10, 2007 0:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal!

Ich hoffe, dass hier noch irgendjemand mitliest, denn ich nähere mich zumindest in ganz kleinen Schritten einer Lösung. Ich werde zunächst mal eine zusammengeschnibbelte BB-Datei zeigen, da die CODE-Boxen hier den Code wohl unleserlich machen würden, er enthält einige lange Zeilen...

Ich habe versucht, den Code auf das zu reduzieren, was mit dem Problem zu tun hat. Es ist vielleicht viel verlangt, das durchzugehen, aber wenn irgendjemand nichts zu tun hat oder mir einfach helfen will... ich wäre sehr dankbar! Smile

Das Problem ist wie gesagt die Speichernfunktion. Aus mir unbekannten Gründen funktioniert die nicht richtig. Es wird zwar gespeichert, aber wenn man eine existierende Map überschreiben will, wird stattdessen die Ladenfunktion ausgeführt! So komisch es klingt! Ich habe das rausgefunden, als ich testhalber einen Else-Befehl in die Ladenfunktion eingefügt habe, der den RuntimeError "Map existiert nicht!" ausgibt, wenn die Map eben nicht existiert. Sonderbarerweise kam die Meldung auch bei der Speichernfunktion, obwohl das ja eigentlich nicht sein kann, da beide ziemlich separat voneinander ausgeführt werden (sollen).
Das bedeutet also, dass Speichern und Laden mitunter vertauscht werden. Warum ist mir unklar, denn, wie man im Code sieht, wird die entsprechende Funktion nur ausgeführt, wenn auf den dazugehörigen Button geklickt wird, aber der Speichern- und der Laden-Button können nicht zusammen gezeichnet werden, da der eine nur bei windowtype = 3 und der andere nur bei windowtype = 2 gezeichnet wird.
Das ist mir alles nicht mehr geheuer, ich vermute ein generelles Problem bei meiner Herangehensweise. Daher wäre es super, wenn jemand versuchen würde irgendwas aus folgendem Code zu verstehen:

http://home.arcor.de/danielbue..._reborn.bb

Das müsste eigentlihc das wichtigste aus meinen letzten Posts sein und alles, was das Problem betreffen könnte.

Ich hab zum Beispiel auch noch versucht, die Bedingungen unter denen "Speichern" ausgeführt wird, weiter einzuschränken, also nicht nur das Überlappen und Klicken des Buttons, sondern auch noch "And windowtype = 3 ...... Else End", was ja Sinn machen würde, da windowtype ja zu dem Zeitpunkt ohnehin 3 sein muss, aber so lande ich dann komischerweise IMMER bei "End", obwohl meine Debuginformation bei windowtype 3 anzeigt.

Das ist alles so verwirrend, ich schaff das alleine nicht.

Ich bin wirklich für jeden FUNKEN von Hilfe dankbar, da mich das ganze in den Wahnsinn treibt!

Danke für alles im Vorraus!
 

Dreamora

BeitragDi, Jul 10, 2007 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem ist vermutlich das du den BildKollision Check ob OK geclickt wird IMMER durchführst, auch wenn WindowType 2 oder 3 ist obwohl dann da Laden / Speichern steht.

Aber davon abgesehen kanns sowieso nicht funktionieren

ReadFile / WriteFile gibt einen INT zurück, keinen String.
Deine Zuweisung läuft jedoch immer an einen String (Karte$)

Darüber hinaus machst du zwar ReadFile / WriteFile, du überprüfst jedoch garnie ob die Datei überhaupt geöffnet werden konnte, denn potentiell könnte genau das aus irgend einem Grund nicht möglich sein (Write ausserhalb des Userordners ist mit UserAccount als auch Vista nämlich nicht möglich!)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Reborn

BeitragDi, Jul 10, 2007 1:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Anstöße, Dreamora. Ich werde daraus allerdings nicht so ganz schlau:
Zitat:
Aber davon abgesehen kanns sowieso nicht funktionieren

ReadFile / WriteFile gibt einen INT zurück, keinen String.
Deine Zuweisung läuft jedoch immer an einen String (Karte$)

Hm, danke für den Hinweis. Dennoch klappt es auch mit einem String, denn ich habe es immer schon so gemacht und bevor ich die Buttons eingebaut habe, klappte es auch.
Zitat:
Darüber hinaus machst du zwar ReadFile / WriteFile, du überprüfst jedoch garnie ob die Datei überhaupt geöffnet werden konnte, denn potentiell könnte genau das aus irgend einem Grund nicht möglich sein (Write ausserhalb des Userordners ist mit UserAccount als auch Vista nämlich nicht möglich!)

Ich hatte es mehrmals geprüft, doch dort scheint der Fehler nicht zu liegen, denn Filetype(karte) war bei meinen Tests immer 1. Sobald ich das hier irgendwie hingebogen habe, werde ich auch ein entsprechendes Hinweisfenster programmieren, falls eine Map nicht existiert.
Zitat:
Das Problem ist vermutlich das du den BildKollision Check ob OK geclickt wird IMMER durchführst, auch wenn WindowType 2 oder 3 ist obwohl dann da Laden / Speichern steht.

Hmm, was spielt das für eine Rolle? Schließlich führe ich ALLE Bildkollisionchecks (könnte ich da übrigens nicht auch Imagesoverlap nehmen oder ist das langsamer?) IMMER durch. Das, was danach passiert, ist dann von windowtype abhängig. Und die erste Select-Schleife in der Fenster()-Function sorgt doch dafür, dass immer nur EIN Button gezeichnet wird... Ich weiß also nicht so recht, worauf du hinaus willst...
 

Dreamora

BeitragDi, Jul 10, 2007 1:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Du verstehst nicht ganz:

FileType gibt nur den Type des Files zurück.
Das heisst aber noch lange nicht, das man es auch zum Lesen oder Schreiben öffnen kann!
Denn das hat mit dem Rechteverwaltungssystem zu tun und nicht mit Dateien.
Wie gesagt, wenn du unter XP als normaler User und nicht als Admin drin bist oder in Vista allgemein, dann kannst du nur in den "eigene Dateien" Ordner schreiben prinzipiell. Nur um dir das anhand eines simplen Beispiels näher zu bringen.

Was du machen musst ist überprüfen ob der FileHandle den zu zugewiesen hast zu Karte% 0 ist oder nicht. Wenn er 0 ist, ist ReadFile / WriteFile misslungen. (kannst du auch nicht ändern, aber erwart keine weitere Hilfe wenn du dich rein aus Faulheit gegen die normalen Coding Konventionen stellst. Etwas was Int zurück gibt, weisst man einem Int zu nicht einem String!)


Du hast schon recht, es wird immer nur 1 Button gezeichnet.
Jedoch interessiert sich deine BildKollisionsroutine rein garnicht dafür was gezeichnet ist, sie arbeitet identisch zu RectOverlap (welches du stattdessen nehmen könntest), sie überprüft ob die Rechtecke sich überlagern, unabhängig von irgendwelchen Bilddaten.
Aber natürlich hast du insofern recht, das es eigentlich nicht geschehen sollte das etwas falsches ausgeführt wird. Aber wie du ja siehst, passiert doch etwas schiefes.

Insofern müssen alle potentiellen Auslöser überprüft werden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Reborn

BeitragDi, Jul 10, 2007 2:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Du hast schon recht, es wird immer nur 1 Button gezeichnet.
Jedoch interessiert sich deine BildKollisionsroutine rein garnicht dafür was gezeichnet ist, sie arbeitet identisch zu RectOverlap (welches du stattdessen nehmen könntest), sie überprüft ob die Rechtecke sich überlagern, unabhängig von irgendwelchen Bilddaten.

SUPER, DAS WAR'S! Danke, danke, danke! Natürlich! Meine BildKollision() überprüft nur die Koordinaten, die Parameter "Bild1" und "Bild2" sind bis auf die x3/y3-Berechnung nur Zierde. Das hab ich vollkommen außer acht gelassen, dann ist es kein Wunder, dass u. a. Speichern und Laden vertauscht wurde... Ein simples Einschränken der BildKollisionsbedingung mit "And windowtype = X" bzw. "And windowtype <> X" hat's getan.

An dieser Stelle: GROßES DANKESCHÖN! Smile Du hast mich echt gerettet, nachdem ich mir nun eine Woche lang an dem Zeug die Zähne ausgebissen habe...
Zitat:
Was du machen musst ist überprüfen ob der FileHandle den zu zugewiesen hast zu Karte% 0 ist oder nicht. Wenn er 0 ist, ist ReadFile / WriteFile misslungen.

Alles klar, da hab ich nicht genau gedacht. FileType prüft also nur, ob eine Datei EXISTIERT und nicht, ob sie auch GEÖFFNET werden kann, nehme ich an... Dann weiß ich ja, was ich in Zukunft zu tun habe, danke! Very Happy
Zitat:
(kannst du auch nicht ändern, aber erwart keine weitere Hilfe wenn du dich rein aus Faulheit gegen die normalen Coding Konventionen stellst. Etwas was Int zurück gibt, weisst man einem Int zu nicht einem String!)

Ich hab's mir notiert! Wink Das hat aber nichts mit Faulheit zu tun (im Grunde ist die richtige Methode ja sogar weniger aufwendig, da man sich das Tippen des $-Zeichens erspart! Wink)! Ich hab das mit dem String mal irgendwo aufgegriffen, mir die ReadInt/WriteInt Befehle aber nie so genau angeschaut. Jetzt, wo ich es weiß, kann ich es ja besser machen. Hab ich auch schon, um genau zu sein, es waren ja nur eine Handvoll Variabeln zu ändern...


So, insgesamt ein Dankeschön an alle, die sich irgendwie an diesem Thread beteiligt haben, ob nur gedanklich oder in Form von Beiträgen! Dann haben meine Romane ja doch noch was gebracht... Wink

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group