Seite 3 von 3

Verfasst: 27.12.2005 12:04
von PAMKKKKK
@ts-soft
Siehste jetzt haste den PB42 wieder verscheucht..... /:->

@PB42
Erst hat du deinen Code gepostet, dann konnte ich über die Weihnachtsfeiertage nix machen, und nun wollte ich den mal konstruktiv überarbeiten und jetzt ist der Code wieder weg.... :?
Na den.... zum letzten mal..... eben nicht..... :(
Hier braucht sich keine schämen!!
Und Kritik muss man hier aushalten! :)

Du hast schon mehrmals einfach Beiträge hinterher gelöscht, das ist für ein Forum nicht statthaft!!!
Stell dir mal vor es würden mehrere Leute ihre Post hinterher wieder löschen,
das Forum wäre zerstört.
Sowas macht man nicht !!!

Verfasst: 27.12.2005 13:49
von PB42
OK, war ein Mißverständnis. Teile meines Codes waren aber nun tagelang gepostet und der ts-soft hatte mich nicht verscheucht. Ich dachte einfach nur, da kommt nichts mehr, weil bei meinem Code vielleicht eh alles zu spät ist.

Was ich zum VERZWEIFELN finde, ist, daß es bei PB keine Funktion wie DeactivateGadget() gibt, damit man im Bedarfsfall die Wahl hat, ob ein Gadget in der Schleife nur einmal durchlaufen wird oder in ständiger Wiederholung. Nur DAHER rührt meine Eventschleife, welche ich nunmehr wieder hier einstelle. Der Vorschlag mit

Code: Alles auswählen

EventID = WaitWindowEvent()     
     Select EventID     
       Case #PB_Event_Gadget
         Select EventGadgetID()
stur nach PB-Hilfe-Anleitung brachte mir auch nichts, denn das warf neue Probleme auf: Beim Klicken auf die Tasten kam kein Noten-Sprite mehr auf den Bildschirm und kein Ton mehr aus dem Lautsprecher, weil sich das scheinbar nicht mit winapi-Befehlen verträgt.

Mein Code läuft zwar, aber es gibt Probleme mit dem ComboBoxGadget, denn nachdem ich da da drin die Anzahl der Kreuz-Vorzeichen ausgewählt habe, (bei den b-Vorzeichen bin ich noch gar nicht), muß ich hinterher erstmal jeden Button zweimal klicken, damit der anspricht! EDIT: Gilt nur für die beiden Buttons, die ich mit WindowMouseX() und WindowMouseY() abfrage!!! Danach ist dann wieder alles erstmal normal, eben so lange, bis wiederum ein Eintrag im ComboBoxGadget ausgewählt wird.

Ich vermute, daß das ganze mit dieser Windows-Queue zusammenhängt, da wird einem in der PB-Hilfe die Formel

Code: Alles auswählen

While : WindowEvent() : Wend 
zur Abhilfe von Problemen hingeknallt, aber WIE und WO flechtet man das ins Programm ein? Hier ist meine Eventschleife:

Code: Alles auswählen

ButtonGadget(0,680,5,40,40,"#")
ButtonGadget(1,730,5,40,40,"b")
ButtonGadget(2,630,5,40,40,"Clear")
ButtonGadget(9,280,5,40,40,"Vorsp.")

ComboBoxGadget(10,160,15,110,250)
AddGadgetItem(10,-1,"keine Vorzeichen")
AddGadgetItem(10,-1,"1 Kreuz")
AddGadgetItem(10,-1,"2 Kreuze")
AddGadgetItem(10,-1,"3 Kreuze")
AddGadgetItem(10,-1,"4 Kreuze")
AddGadgetItem(10,-1,"5 Kreuze")
AddGadgetItem(10,-1,"6 Kreuze")
AddGadgetItem(10,-1,"7 Kreuze")
AddGadgetItem(10,-1,"1 b")
AddGadgetItem(10,-1,"2 b")
AddGadgetItem(10,-1,"3 b")
AddGadgetItem(10,-1,"4 b")
AddGadgetItem(10,-1,"5 b")
AddGadgetItem(10,-1,"6 b")
AddGadgetItem(10,-1,"7 b")


Repeat
    eventID = WindowEvent()
    GadgetID = EventGadgetID()   
       
     Select GadgetID
      Case 0
      Case0 = 1
      Case1 = 0
     EndSelect
    
    If eventID = #WM_LBUTTONDOWN And WindowMouseX() > 630 And WindowMouseX() < 670 And WindowMouseY() > 5 And WindowMouseY() < 45
                                                                                                           ; reagiert, wenn man Button 2 klickt, = Clear-Funktion 
   
      DisplaySprite(118,31,0)
      DisplaySprite(118,31,85)
      DisplaySprite(119,500,0)
      DisplaySprite(119,500,85)
      CISCIS = 0
      CIS = 0
      cis1 = 0
      cis2 = 0
      cis3 = 0
      
      DISDIS = 0
      DIS = 0
      dis1 = 0
      dis2 = 0
      dis3 = 0
         
      .....
    
      EndIf       
      
    
    ;Taste C
    If Case0 = 1
      If eventID = #WM_LBUTTONDOWN And WindowMouseX() > 0 And WindowMouseX() < 17 And WindowMouseY() > 350 And WindowMouseY() < 415
      x = x + 32
        If CISCIS = 1
        CISCIS = 0
        CIS = 0
        DisplaySprite(104,x-2,84)
        PlaySound(30)
        Goto cisg
        EndIf
      DisplaySprite(64,x-2,85)
      PlaySound(30)
      EndIf
      If eventID = #WM_LBUTTONDOWN And WindowMouseX() > 0 And WindowMouseX() < 26 And WindowMouseY() > 415 And WindowMouseY() < 450 
      x = x + 32
        If CISCIS = 1
        CISCIS = 0
        CIS = 0
        DisplaySprite(104,x-2,84)
        PlaySound(30)
        Goto cisg
        EndIf      
      DisplaySprite(64,x-2,85)
      PlaySound(30)
      EndIf
    EndIf 
    
    ....
    
    Select GadgetID
      Case 1
      Case0 = 0
      Case1 = 1
    EndSelect
       
       
    If Case1 = 1  
      If eventID = #WM_LBUTTONDOWN And WindowMouseX() > 16 And WindowMouseX() < 33 And WindowMouseY() > 350 And WindowMouseY() < 415
        If DESDES = 1 Or DES = 1
        x = x + 32
        DisplaySprite(65,x-2,85)
        PlaySound(44)
        Goto TD
        EndIf
      DESDES = 1
      DES = 1
      x = x + 32
      DisplaySprite(89,x-2,85)
      PlaySound(44)
      EndIf
    EndIf
    
    ......

    ;Vorspiel-Teil, reagiert, wenn Button 9 geklickt wird:

    If eventID = #WM_LBUTTONDOWN And WindowMouseX() > 280 And WindowMouseX() < 320 And WindowMouseY() > 5 And WindowMouseY() < 45
    Vorspiel = 1
    EndIf  
      
    If Vorspiel = 1 
      If axa = 0
      Goto axa
      EndIf
      PlaySound(axa)
      Delay(500)
      StopSound(-1)
      axa:
       
      If bxa = 0
      Goto bxa
      EndIf
      PlaySound(bxa)
      Delay(500)
      StopSound(-1)
      bxa:
      
      .....
      
    EndIf
  
  If axa = 0 Or bxa = 0 
  Vorspiel = 0
  EndIf
    If axa > 0 And bxa > 0
    Vorspiel = 0
    EndIf
    
Until eventID = #PB_EventCloseWindow 




Ich würde gerne den Vorspielteil über Case 9 aufrufen, aber dann hört das Gedudel ja nicht mehr auf. Genuaso der Clear-Button, welchen ich über Case 2 aufrufen könnte, aber nicht kann, weil dann die Löschfunktion alles neu geschriebene sofort wieder löscht, nur weil es kein DeactivateGadget() gibt. Einmal geschaltet, immer geschaltet und wenn ich

Code: Alles auswählen

EventID = WaitWindowEvent()     
     Select EventID     
       Case #PB_Event_Gadget
         Select EventGadgetID()
verwende, wirft das auch sofort neue Probleme auf.

Ich bin echt frustriert.

PB42

Verfasst: 27.12.2005 15:13
von Macros
Ich verstehe zwar nicht ganz dein Problem,
aber ich habe jetzt mal selbst ein Programm
zum Notenspielen gebaut (mit Clear und Spielen-Button).
Wenn du willst kann ich es dir hier reinstellen (200 Zeilen).

Gadget umschalten:
setgadgetstate(1,0)=deaktiviert
setgadgetstate(1,1)=aktiviert

Verfasst: 27.12.2005 15:33
von PB42
Nur 200 Zeilen? *Verblüfftbin* Kannst Du gerne mal einstellen. Ich denke, ich kann da was lernen und nur das will ich. Danke.

PB42

Verfasst: 27.12.2005 15:42
von Macros

Code: Alles auswählen

c=523
cis=544
d=587
dis=622
e=659
f=698
fis=740
g=784
gis=831
a=880
ais=932
h=988
c2=1047
cis2=1109
d2=1175
dis2=1245
e2=1319
f2=1397
fis2=1480
g2=1568
gis2=1661
a2=1760
ais2=1865
h2=1976
LoadFont(1,"arail",14)
UseFont(1)
SetGadgetFont(#PB_Default,FontID())
Global string1.l
Global string2.l
OpenWindow(1, (GetSystemMetrics_(#SM_CXSCREEN) - 620) / 2, (GetSystemMetrics_(#SM_CYSCREEN) - 325) / 2,620,325,#PB_Window_MinimizeGadget,"Notenwandler")
CreateGadgetList(WindowID(1))
string1.l=StringGadget(1,0,0,400,100,"daaaiaiCaagggfgagfeddaaaiaiCaagggfga----defgaiagfedegfeedrde----defgaiagfedegfeeddrd",#ES_MULTILINE|#WS_HSCROLL|#ES_AUTOHSCROLL|#ES_NOHIDESEL)
string2.l=StringGadget(2,0,100,400,100,".84488884448844.8884.8448888444884424844888888488888888.48448888884888888882",#ES_MULTILINE|#WS_HSCROLL|#ES_AUTOHSCROLL|#ES_NOHIDESEL)
TextGadget(4,0,300,50,25,"Dauer")
StringGadget(5,50,300,50,25,"100",#PB_String_Numeric)
TextGadget(6,100,300,300,25,"cis=r , dis=t , fis=z , gis=u , ais=i")
ButtonGadget(3,0,200,400,100,"Spielen",#PB_Button_Toggle)
ButtonGadget(7,520,000,100,325,"Clear")
SetGadgetFont(#PB_Default,0)
TextGadget(10,420,0,100,325,"Oben Noten eingeben c=tiefes c C=hohes C Halbtöne: siehe unten Unten Dauer eingeben 8=eine achtel Note             2=eine halbe Der "+Chr(34)+"Spielen"+Chr(34)+" Button startet die Wiedergabe des Stücks.   Mit Dauer wird die Länge einer ganzen Note bestimmt",#SS_LEFT)
UseFont(1)
SetGadgetFont(#PB_Default,FontID())


Repeat
input:
event=WindowEvent()
Delay(20)

;Clear button
If event=#PB_Event_Gadget
If EventGadgetID()=7
SetGadgetText(1,"")
SetGadgetText(2,"")
SetGadgetState(3,0)
SetGadgetState(7,0)
EndIf
EndIf

;wenn "Spielen gedrückt ist
If GetGadgetState(3)=1

stpper=0
ton$=GetGadgetText(1)

If Len(Ton$)=0
SetGadgetState(3,0)
Goto input
EndIf

lengh$=GetGadgetText(2)

; Noten Kompletieren
If Len(lengh$)<Len(ton$)
Repeat
lengh$+"4"
Until Len(lengh$)=Len(ton$)
EndIf

If Len(lengh$)>=Len(ton$)
;abspielen aller Töne
For x=1 To Len(ton$)

dauer.f=Val(GetGadgetText(5))
; Rahmen der Var "Dauer" einschränken"
If dauer<50
SetGadgetText(5,"50")
dauer=50
EndIf
If dauer>400
dauer=400
SetGadgetText(5,"400")
EndIf
; Aktuelle Position markieren
SendMessage_(string1.l,#EM_SETSEL,x-1,x)
SendMessage_(string2.l,#EM_SETSEL,x-1-stpper,x-stpper)
SendMessage_(string1.l,#EM_SCROLLCARET,0,0)
SendMessage_(string2.l,#EM_SCROLLCARET,0,0)
;note erkennen
note$=Mid(ton$, x,1)
Select note$
Case "c"
fr=c
Case "d"
fr=d
Case "e"
fr=e
Case "f"
fr=f
Case "g"
fr=g
Case "a"
fr=a
Case "h"
fr=h
Case "C"
fr=c2
Case "D"
fr=d2
Case "E"
fr=e2
Case "F"
fr=f2
Case "G"
fr=g2
Case "A"
fr=a2
Case "H"
fr=h2
Case "r"
fr=cis
Case "t"
fr=dis
Case "z"
fr=fis
Case "u"
fr=gis
Case "i"
fr=ais
Case "R"
fr=cis2
Case "T"
fr=dis2
Case "Z"
fr=fis2
Case "U"
fr=gis2
Case "I"
fr=ais2
Case "-"
Delay(125*dauer/100)
stop=1
stpper+1

Default
SetGadgetState(3,0)
Goto input
EndSelect
;Dauer der Wiedergabe des aktuellen Tons bestimmen
If Val(Mid(lengh$,x-stpper,1))
dur=1000/Val(Mid(lengh$,x-stpper,1))
EndIf
If Mid(lengh$,x-stpper,1)="."
dur=375
EndIf
If stop=0
;ton Spielen
duration=dur*dauer/100
Beep_(fr,duration)
Else
stop=0
EndIf
;überprüfen ob noch "Spielen" gedrückt ist
If GetGadgetState(3)=0
Goto end1
EndIf
;kurze Pause nach jeder Note und die WindowEvent() einlesen
Delay(20*dauer/100)
event=WindowEvent()
;der Clear-Button ________________________________
If EventGadgetID()=7
SetGadgetText(1,"")
SetGadgetText(2,"")
SetGadgetState(3,0)
SetGadgetState(7,0)
Goto input
EndIf
;__________________________________________
Next
;große Pause nach dem Stück
For xxxxx=1 To 10
Delay(100)
Next
Else
SetGadgetText(2,"Error")
EndIf
EndIf

end1:
Until event=#PB_Event_CloseWindow

Verfasst: 27.12.2005 16:29
von PB42
Schönes Ding! Beep_(xy,duration) ist völlig neu für mich, somit war für mich die Methode mit den Frequenzen ausgeschieden. (Habe für jeden Ton ne wav.-Datei angelegt). Und von winapi kenn ich bisher auch so gut wie nix.

OK, so geht das, aber auch bei Dir spielt die Musik halt immer weiter. Die soll bei mir aber nur einmal durchspielen, dann stoppen und dann sofort und ohne Umwege über Klicks und andere Buttons wieder abspielbar sein.

interessant, wie Du die Gadgets abfragst und Gadgetstates dabei einflechtest, mit der Methode befasse ich mich jetzt erstmal näher. Danke nochmals. Toll, wie schnell Du sowas bauen kannst.

PB42

Verfasst: 27.12.2005 16:50
von PB42
Mein Problem hat sich in Luft aufgelöst! Ich habe Dank Macros gelernt, wie man effizient Gadgets abfragt. :D 100 Punkte für Macros und :allright:

PB42

Verfasst: 27.12.2005 17:29
von Macros
Danke für das Lob :D !

Verfasst: 27.12.2005 18:00
von Konne
Ein Beispiel sagt mehr als 1000 Worte. (warscheinlich wurden sogar noch mehr gepostet) :D