Mit Types besser lösbar?
Übersicht

![]() |
relentless92Betreff: Mit Types besser lösbar? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() MfG |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
jepp, nutze Types und werd glücklich ![]() |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
relentless92 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alles klärchen ![]() 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 ![]() |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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) |
![]() |
relentless92 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab das Programm fertig.
Danke dir Eingeproggt, das war der entscheidene Fehler! |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group