Wie baut man einen Programmablauf in Pure Basic richtig auf?

Anfängerfragen zum Programmieren mit PureBasic.
Myrddin
Beiträge: 7
Registriert: 10.09.2006 15:44
Wohnort: Immenstadt im Allgäu

Wie baut man einen Programmablauf in Pure Basic richtig auf?

Beitrag 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
Pure Basic 4.0
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Zuletzt geändert von Kaeru Gaman am 10.09.2006 16:26, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag 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:
Myrddin
Beiträge: 7
Registriert: 10.09.2006 15:44
Wohnort: Immenstadt im Allgäu

Beitrag 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
Pure Basic 4.0
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag 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
Zuletzt geändert von Hellhound66 am 10.09.2006 17:10, insgesamt 2-mal geändert.
Optimismus ist ein Mangel an Information.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Zuletzt geändert von Kaeru Gaman am 10.09.2006 17:10, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Dummer Fehler, jetzt korrigiert.

/edit:
Das ist sowieso hingepfuscht. Man sollte das noch sauber trennen.
Optimismus ist ein Mangel an Information.
Antworten