Mit Types besser lösbar?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

relentless92

Betreff: Mit Types besser lösbar?

BeitragDi, Okt 06, 2009 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu,
Ich habe vor, Ein Programm mit BlitzPlus zu schreiben. Jetzt stoße ich bei der Entwicklung auf immer mehr indynamic Fälle.

Ich habe ein kleines Canvas in welches Balken gezeichnet werden. Die Balken sind 100/25 groß und das Canvas passt sich dem an.
Jetzt braucht aber jeder Balken "eine Eigenschaft": Ein Pfad soll bei Klick auf ihn aufgerufen werden, ein Bild gezeichnet wenn die Maus auf ihm ist, etc.

Bisher funktioniert das gut:

Code: [AUSKLAPPEN]
;INITIALISIERUNG ------------------------------------------
Global mX=MouseX()
Global my=MouseY()

AppTitle "QuickBrowse"
SeedRnd MilliSecs()
timer=CreateTimer(60)

If FileType("quick.ini")=0 Then
Notify "INI-File nicht gefunden! Programm wird beendet." : End
EndIf

Global ini$="quick.ini"

balkenanzahl=SelectInfo("anz_balken")
fenster_breite=200
fenster_hoehe=25*balkenanzahl
pfad$=SelectInfo("pfad1")
pfadname$=SelectInfo("pfad1name")


; GUI/CANVAS ----------------------------------------------

fenster=CreateWindow("QuickBrowse",mX,mY,fenster_breite,fenster_hoehe,0,0)
canvas=CreateCanvas(0,0,fenster_breite,fenster_hoehe,fenster)

SetBuffer CanvasBuffer(canvas)

Global balken=LoadImage("balken.png")
Global balken_a=LoadImage("balken_a.png")

; HAUPTSCHLEIFE ------------------------------------------

Repeat

balkeny=0
For i=1 To balkenanzahl
   DrawImage balken,0,balkeny
   balkeny=balkeny+25
Next

mx_a = Int(MouseY(canvas)/25) * 25
DrawImage balken_a,0,mx_a

Text 5,8,pfadname$

If MouseHit(1) And mx_a=0 Then
   ExecFile(pfad$)
   End
EndIf
   


FlipCanvas canvas
Cls
WaitTimer timer
Until KeyHit(1)


Nur bei dem Einbinden der Pfade bekomme ich jetzt mein Problem. Die benötigten Werte werden (wie man sieht) aus einer Datei gelesen. Da sollte der User nun so viele Pfade wie er will reinschreiben können. Aber so etwas wie pfad_x="Bla" funktioniert ja nicht, man kann ja nicht eine Variable in einer Variable haben.

Nun meine konkrete Frage, ist das mit Types leichter zu lösen? Oder kann man so weitermachen?

/Edit: Code editiert, ich hoffe, meine Intention ist besser erkennbar Wink

MfG

Firstdeathmaker

BeitragDi, Okt 06, 2009 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
jepp, nutze Types und werd glücklich Wink
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

relentless92

BeitragDi, Okt 06, 2009 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles klärchen Wink

Am besten einen Type mit ziemlich vielen Fields dann, oder?
à la

Type balken
Field y
Field bild
Field bild_a
Field pfad
End type

Und dann per for i next einfach paar davon erstellen? wie sieht denn dann meine ini aus? imoment steht halt einfach alles untereinander,

balkenanzahl=5
pfad1="C:\blubb"

etc.

P.S: Hab grad kein Blitz zur Hand, sonst könnt ichs testen Wink

Midimaster

BeitragSa, Okt 10, 2009 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
So ganz habe ich Deine Zeilen noch nicht verstanden, aber es geht wohl darum möglichst offen einige Strings zu verwalten. Ich bin mir auch nicht sicher, ob Du mit TYPES nicht ein wenig überfordert sein wirst, dehalb hier der Vorschlag, es vielleicht erst einmal mit ARRAYS zu probieren:

Anmerkung: Der Code läuft so nicht, ist nur symbolisch zu verstehen. Deine Routine SELECTINFO scheint zum Lesen von INI-Dateien zu sein. Ich nehme sie mal als gegeben hin.

Code: [AUSKLAPPEN]

Global Pfad$[99], PfadName$[99]

IniLesen
Malen
Repeat
   MausKlick
Forever


Function IniLesen()
   For i%=1 To 99
      Pfad[i]=SelectInfo("pfad"+i)
         If Pfad[i]="" Then Return
      PfadName[i]=SelectInfo("pfad"+i+"name")
   Next
   BalkenAnzahl=i-1
End Function


Function Malen()
   For I%=1 To BalkenAnzahl
         DrawImage Balken,50,i*25
         DrawText Pfad[i],50,i*25   
      EndIf
   Next
EndIf

   
Function MausKlick()
   Zeile = Int(MouseY(canvas)/25)
   mx_a = Zeile * 25
   DrawImage balken_a,0,mx_a
   Text 5,8,PfadName[Zeile]
   
   If MouseHit(1) And mx_a=0 Then
      ExecFile(Pfad[Zeile])
      End
   EndIf
End Function


Im IniLesen siehst Du, wie man den Suchbegriff mit einer Zahl verbindet. Außerdem wird glich noch automatisch BalkenAnzahl festgestellt.

Die Darstellung erfolgt nun über die Malen-Routine.

In Deiner Mausroutine habe ich das Zwischenergebnis "Zeile" eingeführt. Es bringt dich zum richtigen Eintrag in den Pfad-Arrays


Das ganze muß also nicht mit Types gelöst werden.
Hoffe, ich konnte helfen.

relentless92

BeitragDi, Okt 13, 2009 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit den Arrays produziert im Augenblick nur Mist:

Code: [AUSKLAPPEN]

Global mX=MouseX()
Global my=MouseY()

SeedRnd MilliSecs()
timer=CreateTimer(60)

If FileType("quick.ini")=0 Then
Notify "INI-File nicht gefunden! Programm wird beendet." : End
EndIf

Global ini$="quick.ini"
Global Pfad$[99], PfadName$[99]

;INILESEN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

balkenanzahl=SelectInfo("anz_balken")
fenster_breite=200
fenster_hoehe=25*balkenanzahl
   For i=1 To 99
      Pfad[anz]=SelectInfo("pfad"+anz)
      PfadName[anz]=SelectInfo("pfad"+anz+"name")
   Next

;GUI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

fenster=CreateWindow("QuickBrowse",mX,mY,fenster_breite,fenster_hoehe,0,0)
canvas=CreateCanvas(0,0,fenster_breite,fenster_hoehe,fenster)

SetBuffer CanvasBuffer(canvas)

Global balken=LoadImage("balken.png")
Global balken_a=LoadImage("balken_a.png")


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Repeat

   For I=1 To balkenanzahl
         DrawImage balken,0,i*25
         Text Pfad[anz],0,i*25   
   Next


   Zeile = Int(MouseY(canvas)/25)
   mx_a = Zeile * 25
   DrawImage balken_a,0,mx_a
   Text 5,8,PfadName[Zeile]
   
   If MouseHit(1) And mx_a=0 Then
      ExecFile(Pfad[Zeile])
      End
   EndIf

DebugLog "mxa: "+mx_a
DebugLog "zeile: "+zeile

FlipCanvas canvas
Cls
WaitTimer timer
Until KeyHit(1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


Function SelectInfo$(txt$)
Local s_info$,ok = 0

txt$ = Trim(txt$)

option = OpenFile(ini$)

While Not Eof(option)
info$=ReadLine(option)
If Instr(info$,txt$)
s_info$ = info$
ok = 1
Exit
EndIf
Wend

CloseFile(option)

If ok = 1
dummy$ = Left(s_info$,Instr(s_info$,"=")-1)
Return Right(s_info$,Len(s_info$)-Len(dummy$)-1)
Else
Return ""
EndIf

End Function


FRAGE: Geht sowas wie Pfad[anz] überhaupt? Also eine Variable in einer Variable?

Xeres

Moderator

BeitragDi, Okt 13, 2009 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar kann man für den Array-Index auch eine Variable verwenden.
Und wenn du eine bessere Fehlerbeschreibung als "Mist" oder "Funktioniert nicht" hast, kann der eine oder andere dir vielleicht auch helfen Wink
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)

relentless92

BeitragDi, Okt 13, 2009 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt natürlich, mein Fehler.

a) Die aktiven Balken werden nicht da gezeichnet, wo sie sein sollten
b) Die Ausführung der Pfade funktioniert nicht

Habe keine Ahnung woran es liegt, schob es erst auf die Variabeln, aber die scheinen ja zu Stimmen.

MfG

Midimaster

BeitragMi, Okt 14, 2009 10:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier kann auch was nicht stimmen. Entweder der Textinhalt gehört vorne oder hinten in die Befehlszeile:
...Text Pfad[[anz],0,i*25
...Text 5,8,PfadName[Zeile]


Deshalb siehst Du Deine Texte nicht:

Code: [AUSKLAPPEN]

...
   For i=1 To 99
      Pfad[anz]=SelectInfo("pfad"+anz)
          ^^^^                   ^^^^ 
     PfadName[anz]=SelectInfo("pfad"+anz+"name")
              ^^^^^                   ^^^^^^
   Next
...
   For I=1 To balkenanzahl
         DrawImage balken,0,i*25
         Text Pfad[anz],0,i*25
                   ^^^^ 
   Next
...



hier ist das "anz" falsch, es muss "i" heißen, schließlich soll die variable ja von 1 bis Balkenzahl durchlaufen

So sieht es korrekt aus:

Code: [AUSKLAPPEN]

....
   For i=1 To 99
      Pfad[i]=SelectInfo("pfad"+i)
      PfadName[i]=SelectInfo("pfad"+ i +"name")
   Next
...

   For I=1 To balkenanzahl
         DrawImage balken,0,i*25
         Text Pfad[i],0,i*25
   Next
...

Bei BlitzMax kennen wir hier eine Anweisung SUPERSTRICT, die zu Beginn des Codes gesetzt wird und dann darauf achtet, dass keine nicht definierten Variablen verwendet werden. Hätte hier sicher geholfen. Außerdem wären mehr DEBUGLOG während der Testphase sinnvoll.

Noch drei Hinweise:

1.)

Da ist mir noch eine unschöne Formulierung aufgefallen. Gewöhn Dir sowas gar nicht an, sondern lös es gleich von Anfang an korrekt:

Code: [AUSKLAPPEN]
balkenanzahl=SelectInfo("anz_balken")


SelectInfo liefert einen String zurück, BalkenAnzahl will einen Integer. Keine Ahnung wie Du das in BB lösen sollst, aber in Blitzmax geht es so:

Code: [AUSKLAPPEN]
balkenanzahl=Int(SelectInfo("anz_balken"))



2.)

Wenn Du ...For i=1 To 99.. durchlaufen willst, dann sind das mit dem Pfad[0] bis Pfad[99] 100 Elemente, also definierst Du 100 Elemente:

Global Pfad$[100], PfadName$[100]

(mea culpa: dieser Fehler stammte schon aus meinem Beispielcode, sorry)


3.)

Lesbarkeit

If FileType("quick.ini")=0 Then
Notify "INI-File nicht gefunden! Programm wird beendet." : End
EndIf

sollte besser so aussehen:

Code: [AUSKLAPPEN]

If FileType("quick.ini")=0 Then
       Notify "INI-File nicht gefunden! Programm wird beendet."
       End
EndIf
 


Sauberes Einrücken und immer nur 1 Befehl pro Zeile helfen Dritten bei Lesen eines fremden Codes ungemein.

relentless92

BeitragFr, Okt 16, 2009 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun gut, funktioniert soweit.
Allerdings führt er immer noch nichts aus.
Das mit den Arrays blick ich so langsam, hatte da vorher immer meine Probleme mit. (Bin Type-Fan Wink )

Nichtsdestotrotz möcht ich das nun auch mit den Arrays durchziehen.

a) Er führt nichts aus da

Code: [AUSKLAPPEN]
   If MouseHit(1) And MouseY(canvas)=Pfad[Zeile] Then
      ExecFile(Pfad[Zeile])
      End
   EndIf


Nichts bringt. Keine Ahnung wie ich das besser abfrag.

Und: Im Ersten Balken zeichnet er nicht den Text!

Code: [AUSKLAPPEN]
   For I=1 To balkenanzahl
      DrawImage balken,0,0
         DrawImage balken,0,i*25
      Text 0,0,PfadName[i]
         Text 0,i*25,PfadName[i]   
   Next


Ohne das DrawImage balken,0,0 würde er auch den ersten Balken nicht zeichnen. Sehr unschön.

Hoffe ihr könnt nochmal helfen,
MfG

Eingeproggt

BeitragFr, Okt 16, 2009 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei a) kann ich nur raten, da ich mir nicht alle Beiträge durchgesehen habe wo man sich deine Codefetzen zusammen suchen könnte... Aber es ist mir ohnehin rätselhaft ob du tatsächliche eine Integer ausführen möchtest mit ExecFile? (Pfad[Zeile] müsste eine Zahl sein sonst hast du beim Vergleich mit MouseY() ohnehin schon was falsch gemacht)
Aber zu dem anderen Problem:
Lass deine Schleife doch einfach bei 0 losgehen?
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

relentless92

BeitragSa, Okt 17, 2009 0:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab das Programm fertig.
Danke dir Eingeproggt, das war der entscheidene Fehler!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group