Seite 1 von 4

Wie baut man einen Programmablauf in Pure Basic richtig auf?

Verfasst: 10.09.2006 16:17
von Myrddin
Hallo zusammen!

Ich bin neu hier auf den Board und möchte mich kurz vorstellen. Ich habe Ende der 80ger mit GW-Basic begonnen, dann eine Zeit QuickBasic 4.5 und zuletzten Visual Basic 1.0. Danach habe ichs das Programmieren für längere Zeit aufgegeben. Bin nun seit einem Jahr aus beruflichen Gründen wieder verstärkt dazu gekommen kleinere und mittlere Sachen über den VB-Interpreter im MS-Office zu schreiben.

Nun habe ich mich kürzlich mit jemand unterhalten das ich mal wieder Laune hätte mich näher mit Programmierung zu beschäftigen. Von diesem wurde mir Pure Basic empfohlen. Ich bin nun natürlich nurnoch objektorientierte Programmierung gewöhnt. Habe mich jetzt Tagelang durch die F1 Hilfe, die Beispiele und auch hier durchs Forum gekämpft. Doch so ganz ist der Groschen noch nicht gefallen wie ich einen Programmcode richtig aufbaue.

Vieleicht wär jemand so so nett mir ein wenig auf die Sprünge zu helfen.

Für das geplante Programm möchte ich ständig eine größere Reihe von Berechnung durchführen und das Ergebniss dann laufend vom Programm ausgeben lassen. Als Basis für die Entwicklung habe ich folgendes kleines Programm geschrieben.

Code: Alles auswählen


; Variablen definieren

Global Zahl1.d=0
Global Zahl2.d=0
Global Zahl3.d=0

Global Berechnung1.d=-1
Global Berechnung2.d=0.1
Global Berechnung3.d=0.8

; Fenster Öffnen;
OpenWindow(0,350,150,200,200,"Zahlen")
CreateGadgetList(WindowID(0)) 
StringGadget(0,10,10,50,20,Str(Zahl1))
StringGadget(1,10,40,50,20,Str(Zahl2))
StringGadget(2,10,70,50,20,Str(Zahl2))

Procedure Berechnung ()

  Zahl1 = Zahl1 + Berechnung1
  Zahl2 = Zahl2 + Berechnung2
  Zahl3 = Zahl3 + Berechnung3
  
EndProcedure

Procedure Ausgabe()

  SetGadgetText(0,Str(Zahl1))
  SetGadgetText(1,Str(Zahl2))
  SetGadgetText(2,Str(Zahl3))

EndProcedure

Repeat

  EventID = WaitWindowEvent(1)

  ; Proceduren aufrufen
  Berechnung()
  Ausgabe()

  ;Programmtakt
  Delay (100)

  EventID = WindowEvent()

Until EventID = #PB_Event_CloseWindow

Ich dachte eigentlich so müsste das gehen. Tut es aber nicht.

1. Problem: Es werden nur Gadget 1 und 2 aber nicht das dritte angezeigt.
2. Problem: Das Fenster schliesst meisst nicht wenn ich aufs "x" in der Titelleiste klicke. Bzw man muß scheinbar gerade glücklich im richtigen Moment treffen.

Also meine erste Frage, wie erreiche ich einen Reload nachdem ein neuer Text in Gadget geschrieben wurde?

Wie baue ich die Repet-Schleife richtig auf das Tastatur/Maus-Aktionen richtig erkannt werden?

Gruß
Michael

Verfasst: 10.09.2006 16:21
von Kaeru Gaman
1. komisch...
abgesehen von dem tippfehler beim einrichten (Zahl2 statt Zahl3)
sollte das da sein wo es hin soll...

2. du hast 2x Waitwindowevent() drin, und nur das zweite nimmt ein close an
außerdem ist dein Delay(100) überflüssig

nimm das zweite WaitWindowEvent() raus, und mach aus dem ersten ein
WaitWindowEvent(100), streiche auch das Delay()

PS:
ok, bei zweiten ist kein Wait, trotzdem isses überflüssig

PPS:
ok, habs mal laufen lassen...
bei mir erscheint nur ein einziges gadget... merkwürdig...
ich muss nochmal genauer reinschaun...

Verfasst: 10.09.2006 16:26
von Alves
Also das Klicken auf das X kommt wahrscheinlich vom Delay(100), das hält den Programmablauf komplett an. Versuche stattdessen mal ein Delay(0).

Allgemein ist die Frage, ob du wirklich Double für deine Arbeit benötigst.


Nachtrag: Habe den Code jetzt mal getestet und es ist wirklich komisch. Bei mir auf 3.94 wird das dritte Gadget auch nicht angezeigt und das mit dem Delay solltest du auch vergessen.



:allright:

Verfasst: 10.09.2006 16:31
von Myrddin
Hallo!

Danke für die super schnelle Antworten. Neuer Code:

Code: Alles auswählen


; Variablen definieren

Global Zahl1.d=0
Global Zahl2.d=0
Global Zahl3.d=0

Global Berechnung1.d=-1
Global Berechnung2.d=0.1
Global Berechnung3.d=0.8

; Fenster Öffnen;
OpenWindow(0,350,150,200,200,"Zahlen")
CreateGadgetList(WindowID(0)) 
StringGadget(0,10,10,50,20,Str(Zahl1))
StringGadget(1,10,40,50,20,Str(Zahl2))
StringGadget(2,10,70,50,20,Str(Zahl3))

Procedure Berechnung ()

  Zahl1 = Zahl1 + Berechnung1
  Zahl2 = Zahl2 + Berechnung2
  Zahl3 = Zahl3 + Berechnung3
  
EndProcedure

Procedure Ausgabe()

SetGadgetText(0,Str(Zahl1))
SetGadgetText(1,Str(Zahl2))
SetGadgetText(2,Str(Zahl3))

EndProcedure

Repeat

; Proceduren aufrufen
Berechnung()
Ausgabe()

EventID = WaitWindowEvent(100)

Until EventID = #PB_Event_CloseWindow

Problem 2 ist weg ...

Problem 1, hat sich verstärkt. es wird nurnoch das erste Gadget angezeigt. Wenn ich nach jedem SetGadgetText ein WaitWindowsEvent Setze werden zwar alle Gadget angezeigt (führt wohl zu nem Auffrischen) aber ich kann das klicken nicht mehr abfragen.

Gruß
Michael

Verfasst: 10.09.2006 16:31
von Kaeru Gaman
so jetzt mal nochmal genau den code getestet, den du gepostet hattest.

zwei gadgets angezeigt

das zweite WindowEvent auskommentiert, damit das X richtig funktioniert:

nur noch ein gadget

das ist wirklich mal extrem strange....

Verfasst: 10.09.2006 16:39
von edel
Ich bin mal so dreist und zitier mich selber ...
edel hat geschrieben:schau dir mal folgenden Code an : (ACHTUNG : FALSCH)

Code: Alles auswählen

hwnd = OpenWindow(0,0,0,100,100,"")

CreateGadgetList(hwnd)
StringGadget(0,0,0,80,20,"")


Repeat
  
  event = WaitWindowEvent()
  
  SetGadgetText(0,"Fehler")
  
  ; If event = #PB_Event_Gadget
    ; If #PB_EventType_Change = EventType()
      ; Debug "FEHLER"
    ; EndIf
  ; EndIf
  
Until event = #WM_CLOSE
Mit WaitWindowEvent() wird die Schleife gestopt bis ein Event ankommt.
SetGadgetText veranlasst das Gadget aber auch ein Event abzusetzen.
Heisst also dein Programm bekommt immer Events und dann faengt es
froehlich mit flackern an.

Heisst also Berechnung() und Ausgabe() sind dort fehl am Platz.
Versuch es mal mit Timer.


Beispiel :

Code: Alles auswählen



; Variablen definieren

Global Zahl1.d=0
Global Zahl2.d=0
Global Zahl3.d=0

Global Berechnung1.d=-1
Global Berechnung2.d=0.1
Global Berechnung3.d=0.8

; Fenster Öffnen;
OpenWindow(0,350,150,200,200,"Zahlen")
CreateGadgetList(WindowID(0))
StringGadget(0,10,10,50,20,Str(Zahl1))
StringGadget(1,10,40,50,20,Str(Zahl2))
StringGadget(2,10,70,50,20,Str(Zahl3))

Procedure Ausgabe()
  
  SetGadgetText(0,Str(Zahl1))
  SetGadgetText(1,Str(Zahl2))
  SetGadgetText(2,Str(Zahl3))
  
EndProcedure

Procedure Berechnung ()
  
  Zahl1 = Zahl1 + Berechnung1
  Zahl2 = Zahl2 + Berechnung2
  Zahl3 = Zahl3 + Berechnung3
  
  Ausgabe()
  
EndProcedure

SetTimer_(WindowID(0),0,10,@Berechnung())

Repeat
  
  ; Proceduren aufrufen

  EventID = WaitWindowEvent()
  
Until EventID = #PB_Event_CloseWindow

Verfasst: 10.09.2006 16:45
von Kaeru Gaman
@edel

ja, sowas ähnliches hatte ich auch grad probiert...

...aber irgendwie muss ich mist gebaut haben, hab nämlich nen schicken StackOverflow bekommen...

Verfasst: 10.09.2006 17:04
von Hellhound66
1.) Das ist schön Edel, aber wie lässt er das jetzt unter Linux laufen?

2.) Sobald ich SetgadgetText() Aufrufe, werden alle nachfolgenden Gadgets nicht mehr aufgerufen. Das ist auch klar. Weil pro Berechnungsintervall nur ein Windowevent abgefragt wird. Damit fallen die anderen Änderungen über Bord.

So gehts eher:

Code: Alles auswählen


; Variablen definieren

Global Zahl1.d=0
Global Zahl2.d=0
Global Zahl3.d=0
Global zahl4

Global Berechnung1.d=-1
Global Berechnung2.d=0.1
Global Berechnung3.d=0.8

; Fenster Öffnen;
OpenWindow(0,350,150,200,200,"Zahlen")
CreateGadgetList(WindowID(0))
StringGadget(0,10,10,50,20,Str(Zahl1))
StringGadget(1,10,40,50,20,Str(Zahl2))
StringGadget(2,10,70,50,20,Str(Zahl3))

Procedure Ausgabe()
    
    SetGadgetText(0,Str(Zahl1))
    SetGadgetText(1,Str(Zahl2))
    SetGadgetText(2,Str(Zahl3))
    
EndProcedure

Procedure Berechnung ()
    zahl4+1
    If zahl4>10
        
        Zahl1 = Zahl1 + Berechnung1
        Zahl2 = Zahl2 + Berechnung2
        Zahl3 = Zahl3 + Berechnung3
        
        Ausgabe()
        
        zahl4=0
    EndIf 
EndProcedure

;SetTimer_(WindowID(0),0,10,@Berechnung())

Repeat
    
    Berechnung()   
    ; Proceduren aufrufen
    
    Delay(2)
    EventID = WindowEvent()
    
Until EventID = #PB_Event_CloseWindow

Verfasst: 10.09.2006 17:07
von Kaeru Gaman
das ist auch schön, Sarge,
aber jetzt zeigt er nur an, wenn ich die maus bewege,
also, der weisheit letzter schluß ist es immer noch nicht...

PS: das wait beim event weg?

[edit2]

Code: Alles auswählen

Repeat 
    
    Berechnung()    
    ; Proceduren aufrufen 
    
    EventID = WaitWindowEvent(100) 
    
Until EventID = #PB_Event_CloseWindow

Verfasst: 10.09.2006 17:09
von Hellhound66
Dummer Fehler, jetzt korrigiert.

/edit:
Das ist sowieso hingepfuscht. Man sollte das noch sauber trennen.