Splitter "Rolladen"

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Splitter "Rolladen"

Beitrag von Eckhard.S »

Mein Splitter "Rolladen" zeigt nicht das gewünschte Ergebnis. Am Anfang sieht es bei Butten D noch ganz gut aus. Ansonsten bekommt der weiße Hintergrund erst am Ende ein refresh.

Code: Alles auswählen

;PB4
; ************* Variablen Deklaration *************
                                              
        Global FontID1
        FontID1 = LoadFont(1, "Courier New", 9)    ; Font für die Darstellung 

; ************* Fensteraufbau *************
Enumeration 
  #window : #Menu 
    #menu1 : #menu2 : #menu3 : #menu11 : #menu12 : #menu13 : #menu14 : #menu15 
    #menu21 : #menu22 : #menu23 
    #menu51 : #menu52
  #toolbar1 : #toolbar2 : #toolbar3 : #toolbar4 : #toolbar5 : #toolbar6
  #combobox1 : #combobox2
  #tile : #Splitter 
  #edit1 : #edit2 : #edit3 : #Editor_3
  #Frame 
  #Button1 : #Button2 : #ButtonBoth : #Buttontrans
  #inbtn_1 : #inbtn_2 : #inbtn_3 : #inbtn_4 : #inbtn_5 : #inbtn_6
  #outbtn_1 : #outbtn_2 : #outbtn_3 : #outbtn_4 : #outbtn_5 :  #outbtn_6
  #list
  #text1
  
  #TestButton
EndEnumeration 

framebreite = 250
  
hwnd = OpenWindow(#window,0,0,800,600,fensterueberschrift$,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) 
SetWindowColor(0,RGB(100, 150, 100))
CreateGadgetList(hwnd) 
ButtonGadget(#Button1   ,15,220,25,18,"E") 
ButtonGadget(#ButtonBoth,50,220,25,18,"E/D") 
ButtonGadget(#Button2   ,80,220,25,18,"D") 
 
EditorGadget(#edit1,0,0,0,0) 
EditorGadget(#edit2,0,0,0,0, #PB_Window_Invisible )                          
EditorGadget(#edit3,0,0,0,0, #PB_Editor_ReadOnly) 
SetGadgetFont(#edit1, FontID1)
SetGadgetFont(#edit2, FontID1)
SetGadgetFont(#edit3, FontID1)

SplitterGadget(#Splitter, framebreite, 32, WindowWidth(#Window)- framebreite - 10, WindowHeight(#Window)- 60,#edit1, #edit3) 
AddGadgetItem(#edit1,0,"esperanto teksto ") 
AddGadgetItem(#edit2,0,"")                           
AddGadgetItem(#edit3,0,"Deutscher Text") 

; ************* Hauptprogramm *************
  
 waittime = 50000 
        
 Repeat 
 Select WaitWindowEvent() 
   Case #PB_Event_CloseWindow 
        Break
    
   Case #PB_Event_Gadget 
        Select EventGadget() 
      
         Case #Button1 
              For splitterposition =  GetGadgetState(#Splitter) To GadgetHeight(#Splitter) 
                  SetGadgetState(#Splitter,  splitterposition) 
                  For time = 0 To waittime: Next  
              Next
             
         Case #Button2 
              For splitterposition =  GetGadgetState(#Splitter) To 0 Step -1  
                  SetGadgetState(#Splitter,  splitterposition) 
                  For time = 0 To waittime: Next  
              Next
                             
         Case #ButtonBoth 
             If GetGadgetState(#Splitter) > GadgetHeight(#Splitter)/2      ;von unten nach oben
                For splitterposition =  GetGadgetState(#Splitter) To GadgetHeight(#Splitter)/2 Step -1  
                  SetGadgetState(#Splitter,  splitterposition) 
                  For time = 0 To waittime: Next  
                Next
             Else   ;von oben nach unten
               For splitterposition =  GetGadgetState(#Splitter) To GadgetHeight(#Splitter)/2  
                  SetGadgetState(#Splitter,  splitterposition) 
                  For time = 0 To waittime: Next  
               Next
             EndIf
         
         EndSelect
            
     EndSelect
   
ForEver 

End
 
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Die Schleifen verhindern ein neuzeichnen des Fensters, das es bei 'D'
normal aussieht liegt daran dass darunter ja schon ein Gadget liegt.
Also ohne Schleifen versuchen , am besten mit einem Callback.
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Danke für den Hinweis, aber das sagt mir nichts. Wie soll ich das ohne einen Zähler machen?
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Ich habe es hier mal mit einem Thread versucht

Beispiel :

Code: Alles auswählen


  Enumeration
    #window 
  EndEnumeration
  
  Enumeration
    #Splitter
    
    #Button1
    #Button2
    #button3
    
    #edit1
    #edit2
  EndEnumeration
  
  Enumeration
    #hoch
    #runter
    #mitte
  EndEnumeration

  Global isMove
  
  hwnd = OpenWindow(#window,0,0,800,600,"")
  
  CreateGadgetList(hwnd)
  
  ButtonGadget(#Button1,5,5,20,20,"UP")
  ButtonGadget(#Button2,5,25,20,20,"DO")
  ButtonGadget(#button3,5,45,20,20,"NO")
  
  EditorGadget(#edit1,0,0,0,0)
  EditorGadget(#edit2,0,0,0,0)
  
  SplitterGadget(#Splitter,30,5,765,590,#edit1,#edit2)
  
  #waittime = 2
  
  Procedure Move(a)
    Select a
      Case #hoch
        For splitterposition =  GetGadgetState(#Splitter) To GadgetHeight(#Splitter)
          SetGadgetState(#Splitter,  splitterposition) 
        Next
      Case #runter
        For splitterposition =  GetGadgetState(#Splitter) To 0 Step -1 
          SetGadgetState(#Splitter,  splitterposition)
        Next
      Case #mitte
        temp  = GetGadgetState(#Splitter)
        temp2 = GadgetHeight(#Splitter)/2 
        If temp > temp2
          For splitterposition =  temp To temp2 Step -1 
            SetGadgetState(#Splitter,  splitterposition)
          Next
        Else
          For splitterposition =  temp To temp2 
            SetGadgetState(#Splitter,  splitterposition)
          Next 
        EndIf 
    EndSelect
    
    isMove = 0
    
  EndProcedure
  
  Repeat
    
    event = WaitWindowEvent()
    
    If event = #PB_Event_Gadget 
        If EventGadget() = #Button1
          If isMove
            KillThread(isMove)
          EndIf
          isMove = CreateThread(@Move(),#runter)  
        EndIf
        If EventGadget() = #Button2
          If isMove
            KillThread(isMove)
          EndIf
          isMove = CreateThread(@Move(),#hoch)
        EndIf
        If EventGadget() = #button3 
          If isMove
            KillThread(isMove)
          EndIf
          isMove = CreateThread(@Move(),#mitte)
        EndIf 
    EndIf
    
  Until event = #WM_CLOSE


'Enumerationsvergewaltigung' !

Erstelle fuer jeden Typ eine eigene Enumerationsliste.

Code: Alles auswählen


;Windows Fenster
  Enumeration
    #window 
  EndEnumeration
  
;gadgets
  Enumeration
    #Splitter
    
    #Button1
    #Button2
    #button3
    
    #edit1
    #edit2
  EndEnumeration
  
;menu und/oder toolbar
  Enumeration
    #Menu
    #Toolbar
  EndEnumeration
  
;menu items
  Enumeration
    #MenuButton
    #ToolButton
  EndEnumeration
  
;sonstige Konstanten
  Enumeration
    #hoch
    #runter
    #mitte
  EndEnumeration

Das gleiche fuer Sprites , Image usw ...
Ausserdem immer bei 0 (null) anfangen.
Das was du da machst ist nicht nur schwer zu lesen sondern auch
unnoetig und verbraucht nur mehr Speicher.

Als Alternative kannst du auch #pb_any nutzen

beispiel :

Code: Alles auswählen

  Structure app
    window.l
    Button1.l
  EndStructure
  
  Global App.app
  
  App\window = OpenWindow(#PB_Any,0,0,800,600,"")
  
  CreateGadgetList(WindowID(App\window))
  App\Button1 = ButtonGadget(#PB_Any,10,10,100,100,"")
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      
      If EventGadget() = App\Button1
        MessageRequester("","App\Button1")
      EndIf
      
    EndIf
    
    
  Until Event = #WM_CLOSE
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Mein lieber Herr Gesangsverein! :shock: Das ist aber höhere Programmierkunst.

Erstmal prima, dass du mir den Rollanden gezaubert hast, Edel. :allright:
Die "Enumerationsvergewaltigung" nehme ich mir zu Herzen. Habe mir mit Debug mal die Werte ausdrucken lassen und jetzt gelernt, dass man bei jedem Typ bei 0 anfängt.

Die Abteilung CreateThread(@ProcedureName(), Wert) durchschaue ich noch nicht im einzelnen, besonders wenn man in der Hilfe liest: KillThread(Thread) ... Dies ist eine sehr gefährliche Operation und sollte nur selten benutzt werden. ... :o

Na wie dem auch sei, ich freue mich sehr, dass man so tolle Hilfe hier bekommt. Ich nehme an, solche Aufgaben reizen dich auch als Herausforderung :D

Du hattest eine #waittime = 2 eingeführt aber noch nicht eingebaut. Vermutlich, wenn man den Rolladen etwas langsamer fahren will. Ich habe mit Delay(#waittime) keinen Erfolg erzielt (wurde sehr langsam) und daher For-Next-Schleifen eingebaut. Ist das geschickt oder nicht weil eventuell CPU-abhängig???

Code: Alles auswählen

Enumeration 
    #window 
  EndEnumeration 
  
  Enumeration 
    #Splitter 
    
    #Button1 
    #Button2 
    #button3 
    
    #edit1 
    #edit2 
  EndEnumeration 
  
  Enumeration 
    #hoch 
    #runter 
    #mitte 
  EndEnumeration 

  Global isMove 
  
  hwnd = OpenWindow(#window,0,0,800,600,"") 
  
  CreateGadgetList(hwnd) 
  
  ButtonGadget(#Button1,5,5,20,20,"UP") 
  ButtonGadget(#Button2,5,25,20,20,"DO") 
  ButtonGadget(#button3,5,45,20,20,"NO") 
  
  EditorGadget(#edit1,0,0,0,0) 
  EditorGadget(#edit2,0,0,0,0) 
  
  SplitterGadget(#Splitter,30,5,765,590,#edit1,#edit2) 
  
  Global waittime = 20000
  
  Procedure Move(a) 
    Select a 
      Case #hoch 
        For splitterposition =  GetGadgetState(#Splitter) To GadgetHeight(#Splitter) 
          SetGadgetState(#Splitter,  splitterposition) 
          For x=1 To waittime:Next
        Next 
      Case #runter 
        For splitterposition =  GetGadgetState(#Splitter) To 0 Step -1 
          SetGadgetState(#Splitter,  splitterposition) 
          For x=1 To waittime:Next
        Next 
      Case #mitte 
        temp  = GetGadgetState(#Splitter) 
        temp2 = GadgetHeight(#Splitter)/2 
        If temp > temp2 
          For splitterposition =  temp To temp2 Step -1 
            SetGadgetState(#Splitter,  splitterposition) 
            For x=1 To waittime:Next
          Next 
        Else 
          For splitterposition =  temp To temp2 
            SetGadgetState(#Splitter,  splitterposition) 
            For x=1 To waittime:Next
          Next 
        EndIf 
    EndSelect 
    
    isMove = 0 
    
  EndProcedure 
  
  Repeat 
    
    event = WaitWindowEvent() 
    
    If event = #PB_Event_Gadget 
        If EventGadget() = #Button1 
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#runter)  
        EndIf 
        
        If EventGadget() = #Button2 
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#hoch) 
        EndIf 
        If EventGadget() = #button3 
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#mitte) 
        EndIf 
    EndIf 
    
  Until event = #WM_CLOSE 
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Nachfrage zu Enumeration. Macht man es so, die Buttons direkt auch zu benennen?

Code: Alles auswählen

Enumeration:
#MenuButtonNeu 
#MenuButtonOeffnen 
#MenuButtonSpeichern 

#MenuButtonUndo 
#MenuButtonRedo
EndEnumeration 
oder so?

Code: Alles auswählen

Enumeration:
#MenuButton11 
#MenuButton12
#MenuButton13 

#MenuButton21 
#MenuButton22
EndEnumeration 
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

@Edel

Habe gerade einen Nachteil entdeckt: Obwohl im Editorfenster nichts passiert, wird im Code unten beim Rolladenziehen permanent "Warum ich?" ausgegeben. Bei mir gibt es bei Editortextänderungen einige Berechnungen, die so bei jedem Rolladenschritt diesen erlahmen lassen.
Was tun?

Code: Alles auswählen

  Enumeration 
    #window 
  EndEnumeration 
  
  Enumeration 
    #Splitter 
    
    #Button1 
    #Button2 
    #button3 
    
    #edit1 
    #edit2 
  EndEnumeration 
  
  Enumeration 
    #hoch 
    #runter 
    #mitte 
  EndEnumeration 

  Global isMove 
  
  hwnd = OpenWindow(#window,0,0,800,600,"") 
  
  CreateGadgetList(hwnd) 
  
  ButtonGadget(#Button1,5,5,20,20,"UP") 
  ButtonGadget(#Button2,5,25,20,20,"DO") 
  ButtonGadget(#button3,5,45,20,20,"NO") 
  
  EditorGadget(#edit1,0,0,0,0) 
  EditorGadget(#edit2,0,0,0,0) 
  
  SplitterGadget(#Splitter,30,5,765,590,#edit1,#edit2) 
  
  Global waittime = 20000
  
  Procedure Move(a) 
    Select a 
      Case #hoch 
        For splitterposition =  GetGadgetState(#Splitter) To GadgetHeight(#Splitter) 
          SetGadgetState(#Splitter,  splitterposition) 
          For x=1 To waittime:Next
        Next 
      Case #runter 
        For splitterposition =  GetGadgetState(#Splitter) To 0 Step -1 
          SetGadgetState(#Splitter,  splitterposition) 
          For x=1 To waittime:Next
        Next 
      Case #mitte 
        temp  = GetGadgetState(#Splitter) 
        temp2 = GadgetHeight(#Splitter)/2 
        If temp > temp2 
          For splitterposition =  temp To temp2 Step -1 
            SetGadgetState(#Splitter,  splitterposition) 
            For x=1 To waittime:Next
          Next 
        Else 
          For splitterposition =  temp To temp2 
            SetGadgetState(#Splitter,  splitterposition) 
            For x=1 To waittime:Next
          Next 
        EndIf 
    EndSelect 
    
    isMove = 0 
    
  EndProcedure 
  
  Repeat 
    
    event = WaitWindowEvent() 
    
    If event = #PB_Event_Gadget 
        If EventGadget() = #edit1  
        Debug "Warum ich?" 
        EndIf
    
        If EventGadget() = #Button1 
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#runter)  
        EndIf 
        
        If EventGadget() = #Button2 
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#hoch) 
        EndIf 
        If EventGadget() = #button3 
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#mitte) 
        EndIf 
    EndIf 
    
  Until event = #WM_CLOSE 
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Natuerlich passiert dort etwas , das Fenster wird ja vergroessert bzw verkleinert.

Welchen Namend deine Konstanten haben ist voellig wurst, Hauptsache
ist, du weisst was wo hingehoert.

Es gibt ein 'Edit' Button.
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Ich habe noch ein Logikverständnisproblem. Wenn man Button 1 drückt wird die Rolladen-Prozedure gestartet. Wie ich ausprobiert habe, kann man während der Rolladen läuft sogar Texte eintippen, das heißt es ist ein Parallelprozeß? 8)

Wo muss das Debug "Rolladen ist zu Ende" stehen, damit ich erkennen kann, wann der Rolladen zu Ende ist. Erst dann will ich die Berechnung im Fenster wieder aktivieren?


Code: Alles auswählen

Enumeration 
    #window 
  EndEnumeration 
  
  Enumeration 
    #Splitter 
    
    #Button1 
    #Button2 
    #button3 
    
    #edit1 
    #edit2 
  EndEnumeration 
  
  Enumeration 
    #hoch 
    #runter 
    #mitte 
  EndEnumeration 

  Global isMove 
  
  hwnd = OpenWindow(#window,0,0,800,600,"") 
  
  CreateGadgetList(hwnd) 
  
  ButtonGadget(#Button1,5,5,20,20,"UP") 
  ButtonGadget(#Button2,5,25,20,20,"DO") 
  ButtonGadget(#button3,5,45,20,20,"NO") 
  
  EditorGadget(#edit1,0,0,0,0) 
  EditorGadget(#edit2,0,0,0,0) 
  
  SplitterGadget(#Splitter,30,5,765,590,#edit1,#edit2) 
  
  Global waittime = 20000 
  
  Procedure Move(a) 
    Select a 
      Case #hoch 
        For splitterposition =  GetGadgetState(#Splitter) To GadgetHeight(#Splitter) 
          SetGadgetState(#Splitter,  splitterposition) 
          For x=1 To waittime:Next 
        Next 
      Case #runter 
        For splitterposition =  GetGadgetState(#Splitter) To 0 Step -1 
          SetGadgetState(#Splitter,  splitterposition) 
          For x=1 To waittime:Next 
        Next 
      Case #mitte 
        temp  = GetGadgetState(#Splitter) 
        temp2 = GadgetHeight(#Splitter)/2 
        If temp > temp2 
          For splitterposition =  temp To temp2 Step -1 
            SetGadgetState(#Splitter,  splitterposition) 
            For x=1 To waittime:Next 
          Next 
        Else 
          For splitterposition =  temp To temp2 
            SetGadgetState(#Splitter,  splitterposition) 
            For x=1 To waittime:Next 
          Next 
        EndIf 
    EndSelect 
    
    isMove = 0 
    
  EndProcedure 
  
  Repeat 
    
    event = WaitWindowEvent() 
    
    If event = #PB_Event_Gadget 
        If EventGadget() = #edit1  
       ; Debug "Warum ich?" 
        EndIf 
    
        If EventGadget() = #Button1 
          Debug "Rolladen startet"
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#runter)  
          Debug "Rolladen ist zu Ende"
        EndIf 
        
        If EventGadget() = #Button2 
          Debug "Rolladen startet"
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#hoch)
          Debug "Rolladen ist zu Ende" 
        EndIf 
        If EventGadget() = #button3 
          Debug "Rolladen startet"
          If isMove 
            KillThread(isMove) 
          EndIf 
          isMove = CreateThread(@Move(),#mitte)
          Debug "Rolladen ist zu Ende" 
        EndIf 
    EndIf 
    
  Until event = #WM_CLOSE 
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Benutzeravatar
Eckhard.S
Beiträge: 136
Registriert: 22.07.2006 17:19
Wohnort: Meschede/Sauerland

Beitrag von Eckhard.S »

Debug "Rolladen ist zu Ende"
hat sich erledigt. Muss natürlich ans Ende nach den For-Next-Schleifen.

Die Frage nach Parallelprozeß ist noch offen.
Viele Grüße aus dem Sauerland
Eckhard

PureBasic 4.0 Vollversion, WinXP
Make a better world :D
Antworten