Zeitverzögertes "SetGadgetText" in einem Fenster

Anfängerfragen zum Programmieren mit PureBasic.
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

ts-soft,
Danke schon mal - das heisst das Ganze mit der verzögerten Anzeige muss ich wohl dann wohl in die "Procedure hauptprogramm()" irgendwie reinpacken?

Kaeru Gaman,
von dem "...timer-callback " habe ich noch weniger Ahnung.
Wenn ich es mit den "Events" noch nicht recht kapiert habe :cry: hat es ja wohl kein Sinn mit dem "...timer-callback " anzufangen denke ich mal.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

Also du musst dir vorstellen, das alles, was mit einem Fenster passiert, events erzeugt.
Ob du das fenster jetzt verschiebst, minimierst, maximietrst, schließen willst, oder einen txt änderst.
Diese Events werden mit der Funktion WaitWindowEvent() [/windowevent()] abgearbeitet.
Da gibt es dann die Events die du selebr bearbeiten kannst (zb #PB_Event_Closewindow oder #PB_event_gadget ...) der die Events die Windows Verarbitet (zb Paint)
Das heißt, alle änderungen an einem Fenster müssen mit windowevent() abgearbeitet werden.
Je nach betriebssystem könen nes auch verschieden viele events sein, die das selbe bezwecken.
Also kann es sein, das du "windowevent()" mehrmals ausführen musst.
Deswegen besteht der "perfekte" Eventloop, auch nur aus der abarbeitung der Events.
Alle anderen vorgaänge, wie zum beispiel ein download, das packen / entpacken, ein delay() usw würden ein abarbeiten des Loops verhindern.
Deswegen kann man selber Callbacks / Timer / threads was auch imemr benutzen, damit der Loop weiterläuft.
Du könntest zum beispiel in die Loop eine if abfrage machen, ob eine bestimmte funktion laufen soll, und die dann stück für stück pro eventdurchlauf ein bisschen weiter ausführen
oder u lässt eien procedure parralel zum loop laufen (stichwort Threads).
So sendet der Thread zum beispiel das event, das das gadget nr 5 einen anderen Text bekommen soll und wartet dann 2 sekunden, wärend die main diese events ganz normal abarbeitet.
Mehr fällt mir jetzt grade nicht dazu ein :allright:
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallo a14xerus,
danke schon mal für deine Erklärung zu der Sache.
Deswegen besteht der "perfekte" Eventloop, auch nur aus der abarbeitung der Events.
und ich dachte ich hätte schon einen fast "perfekten Eventloop" da ich in der "Procedure hauptprogramm()" ja eigendlich nur auf Events eingehe, und die jeweiligen Proceduren starte.
Aber für mich war ein Event eben mit - Button drücken - Fenster schließen - Häckchen machen etc. und andere von "mir" ( nicht von Windows ) gemachten Reaktionen verbunden - der Gedankengang war wohl falsch.
Es hat mich eben durcheinandergebracht, weil es beim 1. Aufruf funktioniert hatte wie ich es wollte, und bei der Wiederholung eben nicht mehr. Auch das Verhalten vom Verschieben des Blockes innerhalb der "Procedure Open_Versteckfenster_italienisch_turkisch()"
mit total anderem Ergebnis ( erst wird der Text FRAGE geschrieben - danach kommt der Text ANTWORT mit den Image zusammen hat mich eben verwirrt, weil ich der Meinung war in dieser Procedur wird nur mit TEXTEN und nicht mit IMAGE was gemacht (es gibt in der Procedur kein Befehl der das IMAGE betrifft )

Aber jetzt ist ja Wochenende, für mich etwas kürzer als bei dir ( hier gibts kein Weihnachten ) - so das ich mich mal hinsetzen kann, und mir mal die Sachen mit - Threads / 2. Timer - mehr anschauen kann.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

HemSA hat geschrieben:und ich dachte ich hätte schon einen fast "perfekten Eventloop" da ich in der "Procedure hauptprogramm()" ja eigendlich nur auf Events eingehe, und die jeweiligen Proceduren starte.
Ist ja sowit auch richtig, aber du musst beachten, das das programm ja wartet , bis die procedure fertig ist, und so lange wird der loop ja unterbrochen, du musst eben nur dadrauf achten, das der loop immer weiterläuft
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallo a14xerus,
wenn das Programm dann wartet bis die Procedur fertig ist, warum gibt es dann eine unterschiedliche Darstellung in der Zeit von den IMAGES wenn ich was innerhalb der Procedur etwas verschiebe und die Procedur mit den IMAGES eigendlich nichts zu tun hat?

Aber wie gesagt, ich will mich mal über das Wochenende damit beschäftigen.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallole Ihr, ich hoffe ihr seid alle gut rübergerutscht ins Neue Jahr 2007.
Nachträglich noch alles Gute und die besten Wünsche.

Ich bin mit meinem Problem, der verzögerten Anzeige in einem Fenster, nicht weitergekommen. Was ich auch probiert habe - es klappt nicht, oder nur im 1. Durchlauf.

Warum kann ich nicht in das "#Erinnerungsfenster" den Text "#Erinnerungsfenster_txt2" schreiben.
Ich will den Text später verzögert anzeigen, deshalb versuche ich den Text in einem anderen Programteil in das Fenster "#Erinnerungsfenster" zu schreiben. Aber die ganzen Abfragen im Hauptprogram führen nicht zum Ziel.

Hier ist mal die 1. Version

Code: Alles auswählen

Enumeration ; Windows 
  #Eingangsfenster 
  #Erinnerungsfenster
EndEnumeration 

Enumeration ; Gadgets 
 
  ; Eingangsfenster 
  #Eingangsfenster_txt1 
  #Eingangsfenster_txt2
  #Eingangsfenster_imagIT
  #Eingangsfenster_txt3 
  #Eingangsfenster_txt4 
  #Eingangsfenster_txt5 
  #Eingangsfenster_txt6 
  #Eingangsfenster_butWeiter 
   
  
  ; Erinnerungsfenster
  #Erinnerungsfenster_imag1
  #Erinnerungsfenster_txt1
  #Erinnerungsfenster_imag2
  #Erinnerungsfenster_txt2
  
EndEnumeration 
 
Global anzeigezeitl.l, versteckzeitl.l  

Procedure Open_Eingangsfenster() 
    If OpenWindow(#Eingangsfenster,400,300,330,220,"İtalyanca - Release 2.0",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar ) 
    EndIf 
    
    If LoadFont(1, "Arial", 10) 
        SetGadgetFont(#PB_Default, FontID(1)) 
    EndIf
    
    If  LoadImage(0, "I.bmp")    
        LoadImage(1, "D.bmp") 
    EndIf 
    
    If CreateGadgetList(WindowID(#Eingangsfenster)) 
      TextGadget(#Eingangsfenster_txt1, 10,10, 230, 30, "Giuseppe, bana İtalyanca öğrettiğin") 
      TextGadget(#Eingangsfenster_txt2, 10,40,200, 30, "için çok teşekkür ederim.") 
      ImageGadget(#Eingangsfenster_imagIT, 250,10,10, 10,ImageID(0))
      TextGadget(#Eingangsfenster_txt3, 250,70, 350, 30, "Saygılar") 
      TextGadget(#Eingangsfenster_txt4, 250,100, 350, 30, "Michael") 
      TextGadget(#Eingangsfenster_txt5, 10,130, 220, 30, "Şu anda programın kelime hazinesi: ") 
      TextGadget(#Eingangsfenster_txt6, 250,130, 150, 30, "") 
      ButtonGadget(#Eingangsfenster_butWeiter, 35, 170, 250, 30, "Devam etmek için tıklayın") 
    EndIf 
    
    If ReadFile(1,"Wortschatz.dat") 
        laengel.l= Lof(1) 

        zeilenanzahlw.w=laengel.l/162 
        zeilenanzahls.s= StrU((zeilenanzahlw.w), #Word) 
        SetGadgetText(#Eingangsfenster_txt6,zeilenanzahls.s) 
       CloseFile(1) 
     EndIf 
  EndProcedure    
  

Procedure Open_Erinnerungsfenster_italienisch_turkisch()    
  If OpenWindow(#Erinnerungsfenster,50,100,300,130,"Hatırlatma pencere") 
    
    
    If LoadFont(1, "Arial", 15) 
      SetGadgetFont(#PB_Default, FontID(1)) 
    EndIf 
    
    
    If CreateGadgetList(WindowID(#Erinnerungsfenster)) 
      ImageGadget(#Erinnerungsfenster_imag1, 10,10,10, 10,ImageID(0))                      
      TextGadget(#Erinnerungsfenster_txt1, 90, 20, 200, 50, "")                            
      ImageGadget(#Erinnerungsfenster_imag2, 10,70,10, 10,ImageID(1))    
      TextGadget(#Erinnerungsfenster_txt2, 90,80, 200, 50, "")
      
    EndIf 
    
  EndIf 
  
EndProcedure    
 
Procedure Open_Versteckfenster_italienisch_turkisch()
  Static zeit 
  
  If ElapsedMilliseconds() > zeit 
    zeit = ElapsedMilliseconds() +  anzeigezeitl.l + versteckzeitl.l
    
    If ReadFile(1,"Wortschatz.dat") 
      laengel.l= Lof(1) 
      
      zeilenanzahlw.w=laengel.l/162 
      zeilenanzahls.s= StrU((zeilenanzahlw.w), #Word) 
      
      zufallszeilennummerw.w= Random(zeilenanzahlw.w-1) 
      
      FileSeek(1,zufallszeilennummerw.w*162)                                        
      
      wert1s.s= StrU((zufallszeilennummerw.w+1), #Word)            
      wert2s.s=ReadString(1) 
      italienischs.s=Left(wert2s.s,40) 
      tuerkischs.s=Mid(wert2s.s,41, 40) 
      deutschs.s=Mid(wert2s.s,81, 40)
      englischs.s=Mid(wert2s.s,121, 40)
      
      CloseFile(1) 
    EndIf 
    
      SetWindowState(#Erinnerungsfenster, #PB_Window_Normal)
      StickyWindow(#Erinnerungsfenster,1);Fenster immer im Vordergrund
      
  Else 
    SetWindowState(#Erinnerungsfenster, #PB_Window_Minimize)
  EndIf 
  
      SetGadgetText(#Erinnerungsfenster_txt1,italienischs.s)
      
EndProcedure 

Procedure hauptprogramm()
  
  Protected quit.l 
  Protected Ereignis.l 
  Protected EreignisGadget.l 
  Protected EreignisWindow.l 
  
  Open_Eingangsfenster()
  
  Repeat 
    
    Ereignis       = WaitWindowEvent() 
    EreignisGadget = EventGadget() 
    EreignisWindow = EventWindow() 
    
    Select Ereignis 
      Case #PB_Event_CloseWindow 
        
        Select EreignisWindow 
          Case #Eingangsfenster         :  quit =1      
          Case #Erinnerungsfenster      :  quit =1
        EndSelect 
        
      Case #PB_Event_Gadget  
        
        Select EreignisWindow 
          
          Case #Eingangsfenster
            
            Select EreignisGadget 
              Case #Eingangsfenster_butWeiter
                Open_Erinnerungsfenster_italienisch_turkisch()
                SetWindowState(#Eingangsfenster, #PB_Window_Minimize)
                DisableGadget(#Eingangsfenster_butWeiter,1)

                  anzeigezeits.s= "4"
                  versteckzeits.s= "2"
                  anzeigezeitl.l= Val(anzeigezeits.s)*1000
                  versteckzeitl.l= Val(versteckzeits.s)*1000
                     
                  SetTimer_(Open_Erinnerungsfenster_italienisch_turkisch(),1,anzeigezeitl.l,@Open_Versteckfenster_italienisch_turkisch())
            EndSelect
          
      
          Case #Erinnerungsfenster ;hier frage ich saemtliche Gadgetereignise ab - aber ohne Wirkung
            Select EreignisGadget
              Case #Erinnerungsfenster_txt1
                SetGadgetText(#Erinnerungsfenster_txt2,deutschs.s) 
              Case #Erinnerungsfenster_imag1
                SetGadgetText(#Erinnerungsfenster_txt2,deutschs.s) 
              Case #Erinnerungsfenster_imag2
                SetGadgetText(#Erinnerungsfenster_txt2,deutschs.s)   
            EndSelect    
                
        
      Select EreignisWindow ; das Fenster wird doch von minimiert zu normal gemacht, müsste doch ein Ereignis abgeben
           Case #Erinnerungsfenster
                SetGadgetText(#Erinnerungsfenster_txt2,deutschs.s) 
                        
      EndSelect   
        EndSelect 
    EndSelect  
  Until quit=1 
  
EndProcedure 

hauptprogramm()
End 
Und hier habe ich noch einen Versuch mit einem Threat. Aber da klappt es nur beim 1. Durchlauf. Danach findet keine verzögerte Anzeige mehr statt - warum?

Code: Alles auswählen

Enumeration ; Windows 
  #Eingangsfenster 
  #Erinnerungsfenster
EndEnumeration 

Enumeration ; Gadgets 
 
  ; Eingangsfenster 
  #Eingangsfenster_txt1 
  #Eingangsfenster_txt2
  #Eingangsfenster_imagIT
  #Eingangsfenster_txt3 
  #Eingangsfenster_txt4 
  #Eingangsfenster_txt5 
  #Eingangsfenster_txt6 
  #Eingangsfenster_butWeiter 
   
  
  ; Erinnerungsfenster
  #Erinnerungsfenster_imag1
  #Erinnerungsfenster_txt1
  #Erinnerungsfenster_imag2
  #Erinnerungsfenster_txt2
  
EndEnumeration 
 
Global anzeigezeitl.l, versteckzeitl.l  

Procedure Open_Eingangsfenster() 
    If OpenWindow(#Eingangsfenster,400,300,330,220,"İtalyanca - Release 2.0",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar ) 
    EndIf 
    
    If LoadFont(1, "Arial", 10) 
        SetGadgetFont(#PB_Default, FontID(1)) 
    EndIf
    
    If  LoadImage(0, "I.bmp")    
        LoadImage(1, "D.bmp") 
    EndIf 
    
    If CreateGadgetList(WindowID(#Eingangsfenster)) 
      TextGadget(#Eingangsfenster_txt1, 10,10, 230, 30, "Giuseppe, bana İtalyanca öğrettiğin") 
      TextGadget(#Eingangsfenster_txt2, 10,40,200, 30, "için çok teşekkür ederim.") 
      ImageGadget(#Eingangsfenster_imagIT, 250,10,10, 10,ImageID(0))
      TextGadget(#Eingangsfenster_txt3, 250,70, 350, 30, "Saygılar") 
      TextGadget(#Eingangsfenster_txt4, 250,100, 350, 30, "Michael") 
      TextGadget(#Eingangsfenster_txt5, 10,130, 220, 30, "Şu anda programın kelime hazinesi: ") 
      TextGadget(#Eingangsfenster_txt6, 250,130, 150, 30, "") 
      ButtonGadget(#Eingangsfenster_butWeiter, 35, 170, 250, 30, "Devam etmek için tıklayın") 
    EndIf 
    
    If ReadFile(1,"Wortschatz.dat") 
        laengel.l= Lof(1) 

        zeilenanzahlw.w=laengel.l/162 
        zeilenanzahls.s= StrU((zeilenanzahlw.w), #Word) 
        SetGadgetText(#Eingangsfenster_txt6,zeilenanzahls.s) 
       CloseFile(1) 
    EndIf 
  EndProcedure  
  
  

Procedure Open_Erinnerungsfenster_italienisch_turkisch()    
  If OpenWindow(#Erinnerungsfenster,50,100,300,130,"Hatırlatma pencere") 
    
    
    If LoadFont(1, "Arial", 10) 
      SetGadgetFont(#PB_Default, FontID(1)) 
    EndIf 
    
    
    If CreateGadgetList(WindowID(#Erinnerungsfenster)) 
      ImageGadget(#Erinnerungsfenster_imag1, 10,10,10, 10,ImageID(0))                      
      TextGadget(#Erinnerungsfenster_txt1, 90, 20, 200, 50, "")                            
      ImageGadget(#Erinnerungsfenster_imag2, 10,70,10, 10,ImageID(1))    
      TextGadget(#Erinnerungsfenster_txt2, 90,80, 200, 50, "")
      
    EndIf 
    
  EndIf 
  
EndProcedure    
 
Procedure Erinnerungsfenster_txt2(interval)    
  
  If LoadFont(1, "Arial", 10) 
    SetGadgetFont(#PB_Default, FontID(1)) 
  EndIf 
  
  Delay(interval)
  SetGadgetText(#Erinnerungsfenster_txt2,"deutschs.s")
  
EndProcedure      

Procedure Open_Versteckfenster_italienisch_turkisch()
  Static zeit 
  
  If ElapsedMilliseconds() > zeit 
    zeit = ElapsedMilliseconds() +  anzeigezeitl.l + versteckzeitl.l
    
    If ReadFile(1,"Wortschatz.dat") 
      laengel.l= Lof(1) 
      
      zeilenanzahlw.w=laengel.l/162 
      zeilenanzahls.s= StrU((zeilenanzahlw.w), #Word) 
      
      zufallszeilennummerw.w= Random(zeilenanzahlw.w-1) 
      
      FileSeek(1,zufallszeilennummerw.w*162)                                        
      
      wert1s.s= StrU((zufallszeilennummerw.w+1), #Word)            
      wert2s.s=ReadString(1) 
      italienischs.s=Left(wert2s.s,40) 
      tuerkischs.s=Mid(wert2s.s,41, 40) 
      deutschs.s=Mid(wert2s.s,81, 40)
      englischs.s=Mid(wert2s.s,121, 40)
      
      CloseFile(1) 
      
      SetGadgetText(#Erinnerungsfenster_txt1,italienischs.s)
      thread = CreateThread(@Erinnerungsfenster_txt2(), 2000)
      
      
      EndIf 
    
      SetWindowState(#Erinnerungsfenster, #PB_Window_Normal)
      StickyWindow(#Erinnerungsfenster,1);Fenster immer im Vordergrund
      
  Else 
      SetWindowState(#Erinnerungsfenster, #PB_Window_Minimize)
  EndIf 
  
     
    EndProcedure 
  
    
    

Procedure hauptprogramm()
  
  Protected quit.l 
  Protected EventID.l 
  Protected EventGadget.l 
  Protected EventWindow.l 
  
  Open_Eingangsfenster()
  
  Repeat 
    
    EventID     = WaitWindowEvent() 
    EventGadget = EventGadget() 
    EventWindow = EventWindow() 
    
    Select EventID 
      Case #PB_Event_CloseWindow 
        
        Select EventWindow 
          Case #Eingangsfenster         :  quit =1      
          Case #Erinnerungsfenster      :  quit =1
        EndSelect 
        
      Case #PB_Event_Gadget  
        
        Select EventWindow 
          
          Case #Eingangsfenster
            
            Select EventGadget 
              Case #Eingangsfenster_butWeiter
                Open_Erinnerungsfenster_italienisch_turkisch()
                SetWindowState(#Eingangsfenster, #PB_Window_Minimize)
                 
                  DisableGadget(#Eingangsfenster_butWeiter,1)

                  anzeigezeits.s= "4"
                  versteckzeits.s= "2"
                  anzeigezeitl.l= Val(anzeigezeits.s)*1000
                  versteckzeitl.l= Val(versteckzeits.s)*1000
                     
                  SetTimer_(Open_Erinnerungsfenster_italienisch_turkisch(),1,anzeigezeitl.l,@Open_Versteckfenster_italienisch_turkisch())
            
             EndSelect
          
        EndSelect 
    EndSelect  
  Until quit=1 
  
EndProcedure 

hauptprogramm()
End 
Vielen Dank schon mal im Vorraus für die Hilfe.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

HemSA,
ich hoffe, du hast dir das so vorgestellt:

Code: Alles auswählen

anzeigezeitl.l=1000 
versteckzeitl.l=1000 

Procedure Open_Erinnerungsfenster_italienisch_turkisch()
  Static zeit   
  If OpenWindow(#Erinnerungsfenster,50,100,300,130,"Hatirlatma pencere")
        If LoadFont(1, "Arial", 15)
           SetGadgetFont(#PB_Default, FontID(1))
        EndIf
        If CreateGadgetList(WindowID(#Erinnerungsfenster))
           ImageGadget(#Erinnerungsfenster_imag1, 10,10,10, 10,ImageID(0))                     
           TextGadget(#Erinnerungsfenster_txt1, 90, 20, 200, 50, "")                           
           ImageGadget(#Erinnerungsfenster_imag2, 10,70,10, 10,ImageID(1))   
           TextGadget(#Erinnerungsfenster_txt2, 90,80, 200, 50, "")
        EndIf
    EndIf
    StickyWindow(#Erinnerungsfenster,1);Fenster immer im Vordergrund
    SetGadgetText(#Erinnerungsfenster_txt1,"Frage")
    Delay(anzeigezeitl)
    SetGadgetText(#Erinnerungsfenster_txt2,"Antwort")
EndProcedure   
 
Procedure hauptprogramm()
 
  Protected quit.l
  Protected EventID.l
  Protected EventGadget.l
  Protected EventWindow.l
  Open_Eingangsfenster()
  Repeat
    EventID     = WaitWindowEvent()
    EventGadget = EventGadget()
    EventWindow = EventWindow()
    Select EventID
      Case #PB_Event_CloseWindow
        Select EventWindow
          Case #Eingangsfenster         :  quit =1     
          Case #Erinnerungsfenster      :  quit =1
        EndSelect
      Case #PB_Event_Gadget
      Select EventGadget()
      Case #Eingangsfenster_butWeiter
           HideWindow(#Eingangsfenster,1)
           Open_Erinnerungsfenster_italienisch_turkisch()
           Delay(versteckzeitl)  
           HideWindow(#Eingangsfenster,0)
           CloseWindow(#Erinnerungsfenster)       
      EndSelect
    EndSelect 
  Until quit=1
 
EndProcedure
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallo dysti,
im Prinzip schon, aber du hast ja den Timer rausgeschmissen, und das Erinnerungsfenster soll ja später je nach Wunsch ca. 3 Minuten minimiert werden. Aber das Zusammenlegen von 2 Proceduren zu einer war schon mal eine gute Idee.

Nochmal eine Frage an alle im Forum. Im folgenden Code klappt alles so wie ich es will. Aber nur eben mit angezeigtem Eingangsfenster :-( Ich bin zufällig draufgekommen, als ich beim Test das "Eingangsfenster" normalisiert habe(mit "Klick" auf das Symbol in der Taskleiste). Wenn ich das "Eingangsfenster" maximiere klappt es auch wie ich es will, aber wenn ich es minimiere ( wie ich es eigendlich will ) werden die Texte wieder gleichzeitig angezeigt ohne Verzögerung zwischen den Texten. Kann mir das jemand logisch und verständlich erklären (in Zeile 132 ohne das ";")?

Code: Alles auswählen

Enumeration ; Windows 
  #Eingangsfenster 
  #Erinnerungsfenster 
EndEnumeration 

Enumeration ; Gadgets 
  
  ; Eingangsfenster 
  #Eingangsfenster_txt1 
  #Eingangsfenster_txt2 
  #Eingangsfenster_imagIT 
  #Eingangsfenster_txt3 
  #Eingangsfenster_txt4 
  #Eingangsfenster_txt5 
  #Eingangsfenster_txt6 
  #Eingangsfenster_butWeiter 
    
  
  ; Erinnerungsfenster 
  #Erinnerungsfenster_imag1 
  #Erinnerungsfenster_txt1 
  #Erinnerungsfenster_imag2 
  #Erinnerungsfenster_txt2 
  
EndEnumeration 
  
Global anzeigezeitl.l, versteckzeitl.l  

Procedure Open_Eingangsfenster() 
    If OpenWindow(#Eingangsfenster,400,300,330,220,"İtalyanca - Release 2.0",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar ) 
    EndIf 
    
    If LoadFont(1, "Arial", 10) 
        SetGadgetFont(#PB_Default, FontID(1)) 
    EndIf 
    
    If  LoadImage(0, "I.bmp")    
        LoadImage(1, "Tr.bmp") 
    EndIf 
    
    If CreateGadgetList(WindowID(#Eingangsfenster)) 
      TextGadget(#Eingangsfenster_txt1, 10,10, 230, 30, "Giuseppe, bana İtalyanca öğrettiğin") 
      TextGadget(#Eingangsfenster_txt2, 10,40,200, 30, "için çok teşekkür ederim.") 
      ImageGadget(#Eingangsfenster_imagIT, 250,10,10, 10,ImageID(0)) 
      TextGadget(#Eingangsfenster_txt3, 250,70, 350, 30, "Saygılar") 
      TextGadget(#Eingangsfenster_txt4, 250,100, 350, 30, "Michael") 
      TextGadget(#Eingangsfenster_txt5, 10,130, 220, 30, "Şu anda programın kelime hazinesi: ") 
      TextGadget(#Eingangsfenster_txt6, 250,130, 150, 30, "") 
      ButtonGadget(#Eingangsfenster_butWeiter, 35, 170, 250, 30, "Devam etmek için tıklayın") 
    EndIf 
    
    If ReadFile(1,"Wortschatz.dat") 
        laengel.l= Lof(1) 

        zeilenanzahlw.w=laengel.l/162 
        zeilenanzahls.s= StrU((zeilenanzahlw.w), #Word) 
        SetGadgetText(#Eingangsfenster_txt6,zeilenanzahls.s) 
       CloseFile(1) 
     EndIf 
  EndProcedure    
  

Procedure Open_Erinnerungsfenster_italienisch_turkisch() 
   Static zeit 
  
  If ElapsedMilliseconds() > zeit 
    zeit = ElapsedMilliseconds() +  anzeigezeitl.l + versteckzeitl.l 
     
  If OpenWindow(#Erinnerungsfenster,50,100,300,130,"Hatırlatma pencere") 
    
    
    If LoadFont(1, "Arial", 15) 
      SetGadgetFont(#PB_Default, FontID(1)) 
    EndIf 
    
    
    If CreateGadgetList(WindowID(#Erinnerungsfenster)) 
      ImageGadget(#Erinnerungsfenster_imag1, 10,10,10, 10,ImageID(0))                      
      TextGadget(#Erinnerungsfenster_txt1, 90, 20, 200, 50, "")                            
      ImageGadget(#Erinnerungsfenster_imag2, 10,70,10, 10,ImageID(1))    
      TextGadget(#Erinnerungsfenster_txt2, 90,80, 200, 50, "") 
    EndIf 
    
  EndIf 
  

 
    
      SetGadgetText(#Erinnerungsfenster_txt1,"Frage") 
      Delay(1000) 
      SetGadgetText(#Erinnerungsfenster_txt2,"Antwort") 
      
      SetWindowState(#Erinnerungsfenster, #PB_Window_Normal) 
      StickyWindow(#Erinnerungsfenster,1);Fenster immer im Vordergrund 
      
  Else 
    SetWindowState(#Erinnerungsfenster, #PB_Window_Minimize) 
  EndIf 
    
EndProcedure 

Procedure hauptprogramm() 
  
  Protected quit.l 
  Protected EventID.l 
  Protected EventGadget.l 
  Protected EventWindow.l 
  
  Open_Eingangsfenster() 
  
  Repeat 
    
    EventID     = WaitWindowEvent() 
    EventGadget = EventGadget() 
    EventWindow = EventWindow() 
    
    Select EventID 
      Case #PB_Event_CloseWindow 
        
        Select EventWindow 
          Case #Eingangsfenster         :  quit =1      
          Case #Erinnerungsfenster      :  quit =1 
        EndSelect 
        
      Case #PB_Event_Gadget  
        
        
            
            Select EventGadget 
              Case #Eingangsfenster_butWeiter 
                Open_Erinnerungsfenster_italienisch_turkisch() 
                ;SetWindowState(#Eingangsfenster, #PB_Window_Minimize) ;macht mal den Strichpunkt weg! Dann werden die Texte gleichzeitig angezeigt!
            
                  
                  DisableGadget(#Eingangsfenster_butWeiter,1) 

                  anzeigezeits.s= "3" 
                  versteckzeits.s= "5" 
                  anzeigezeitl.l= Val(anzeigezeits.s)*1000 
                  versteckzeitl.l= Val(versteckzeits.s)*1000 
                      
                  SetTimer_(Open_Erinnerungsfenster_italienisch_turkisch(),0,anzeigezeitl.l,@Open_Erinnerungsfenster_italienisch_turkisch()) 
                          
                  
            EndSelect 
        
    EndSelect  
  Until quit=1 
  
EndProcedure 

hauptprogramm() 
End
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Hallo HEMSA,

was willst du eigentlich erreichen. Vom pädagoschischen Standpunkt ist die Version vom mir soweit korrekt. Der Schüler klickt auf den Button und die Frage und zeitversetzt die Antwort. Wenn der Schüler es nochmal sehen will, klickt er noch einmal. Oder habe ich das Prg falsch interpretiert. Ich kann leider kein Türkisch. Weiß also nicht, was im Hauptfenster angezeigt wird.

Dein Prg vom letzten Posting habe ich überarbeitet, ich hoffe, das es jetzt so ist wie du dir das vorstellst.

Nun zu deinem Problem: Die beiden Texte werden deshalb angezeigt, weil während der Maximierung die Bearbeitung weiterläuft. Bis das Bild aufgebaut ist, ist das Prg im Arbeitsspeicher schon weiter.

Code: Alles auswählen

Enumeration ; Windows
  #Eingangsfenster
  #Erinnerungsfenster
EndEnumeration

Enumeration ; Gadgets
 
  ; Eingangsfenster
  #Eingangsfenster_txt1
  #Eingangsfenster_txt2
  #Eingangsfenster_imagIT
  #Eingangsfenster_txt3
  #Eingangsfenster_txt4
  #Eingangsfenster_txt5
  #Eingangsfenster_txt6
  #Eingangsfenster_butWeiter
   
 
  ; Erinnerungsfenster
  #Erinnerungsfenster_imag1
  #Erinnerungsfenster_txt1
  #Erinnerungsfenster_imag2
  #Erinnerungsfenster_txt2
 
EndEnumeration
 
Global anzeigezeitl.l, versteckzeitl.l, anzeige

Procedure Open_Eingangsfenster()
    If OpenWindow(#Eingangsfenster,400,300,330,220,"Italyanca - Release 2.0",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar )
    EndIf
   
    If LoadFont(1, "Arial", 10)
        SetGadgetFont(#PB_Default, FontID(1))
    EndIf
   
    If  LoadImage(0, "test1.ico")   
        LoadImage(1, "test2.ico")
    EndIf
   
    If CreateGadgetList(WindowID(#Eingangsfenster))
      TextGadget(#Eingangsfenster_txt1, 10,10, 230, 30, "Giuseppe, bana Italyanca ögrettigin")
      TextGadget(#Eingangsfenster_txt2, 10,40,200, 30, "için çok tesekkür ederim.")
      ImageGadget(#Eingangsfenster_imagIT, 250,10,10, 10,ImageID(0))
      TextGadget(#Eingangsfenster_txt3, 250,70, 350, 30, "Saygilar")
      TextGadget(#Eingangsfenster_txt4, 250,100, 350, 30, "Michael")
      TextGadget(#Eingangsfenster_txt5, 10,130, 220, 30, "Su anda programin kelime hazinesi: ")
      TextGadget(#Eingangsfenster_txt6, 250,130, 150, 30, "")
      ButtonGadget(#Eingangsfenster_butWeiter, 35, 170, 250, 30, "Devam etmek için tiklayin")
    EndIf
   
    If ReadFile(1,"Wortschatz.dat")
        laengel.l= Lof(1)

        zeilenanzahlw.w=laengel.l/162
        zeilenanzahls.s= StrU((zeilenanzahlw.w), #Word)
        SetGadgetText(#Eingangsfenster_txt6,zeilenanzahls.s)
       CloseFile(1)
     EndIf
  EndProcedure   
 

Procedure Open_Erinnerungsfenster_italienisch_turkisch()
  Static zeit
  If ElapsedMilliseconds() > zeit
    zeit = ElapsedMilliseconds() +  anzeigezeitl.l + versteckzeitl.l
    If anzeige=0 
    If OpenWindow(#Erinnerungsfenster,50,100,300,130,"Hatirlatma pencere")
    If LoadFont(1, "Arial", 15)
      SetGadgetFont(#PB_Default, FontID(1))
    EndIf
    If CreateGadgetList(WindowID(#Erinnerungsfenster))
      ImageGadget(#Erinnerungsfenster_imag1, 10,10,10, 10,ImageID(0))                     
      TextGadget(#Erinnerungsfenster_txt1, 90, 20, 200, 50, "")                           
      ImageGadget(#Erinnerungsfenster_imag2, 10,70,10, 10,ImageID(1))   
      TextGadget(#Erinnerungsfenster_txt2, 90,80, 200, 50, "")
    EndIf 
  EndIf
      SetGadgetText(#Erinnerungsfenster_txt1,"Frage")
      Delay(1000)
      SetGadgetText(#Erinnerungsfenster_txt2,"Antwort")
      Anzeige=1 
      Else
      HideGadget(#Erinnerungsfenster_txt2,0)
   EndIf      
  Else
    HideGadget(#Erinnerungsfenster_txt2,1)
    SetWindowState(#Erinnerungsfenster, #PB_Window_Minimize)
    Delay(versteckzeitl.l/2)
    SetWindowState(#Erinnerungsfenster, #PB_Window_Normal)
    StickyWindow(#Erinnerungsfenster,1);Fenster immer im Vordergrund
    
  EndIf 
   
EndProcedure

Procedure hauptprogramm()
 
  Protected quit.l
  Protected EventID.l
  Protected EventGadget.l
  Protected EventWindow.l
 
  Open_Eingangsfenster()
 
  Repeat
   
    EventID     = WaitWindowEvent()
    EventGadget = EventGadget()
    EventWindow = EventWindow()
   
    Select EventID
      Case #PB_Event_CloseWindow
       
        Select EventWindow
          Case #Eingangsfenster         :  quit =1     
          Case #Erinnerungsfenster      :  quit =1
        EndSelect
       
      Case #PB_Event_Gadget 
       
       
           
            Select EventGadget
              Case #Eingangsfenster_butWeiter
                Open_Erinnerungsfenster_italienisch_turkisch()
                SetWindowState(#Eingangsfenster, #PB_Window_Minimize) ;macht mal den Strichpunkt weg! Dann werden die Texte gleichzeitig angezeigt!
           
                 
                  DisableGadget(#Eingangsfenster_butWeiter,1)
                  ;Werte anzeigezeits.s und versteckzeitl.l müssen gleich sein
                  anzeigezeits.s= "5"
                  versteckzeits.s= "5"
                  anzeigezeitl.l= Val(anzeigezeits.s)*1000
                  versteckzeitl.l= Val(versteckzeits.s)*1000
                     
                  SetTimer_(Open_Erinnerungsfenster_italienisch_turkisch(),1,anzeigezeitl.l,@Open_Erinnerungsfenster_italienisch_turkisch())
                         
                 
            EndSelect
       
    EndSelect 
  Until quit=1
 
EndProcedure

hauptprogramm()
End
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Hallole dysti,
danke für deine Mühe. Es handelt sich hier um ein Vokabelprogramm das eigendlich 3 Fenster hat ( den gesamten Code habe ich hier schon gepostet ). Im "Eingangsfenster" bedanke ich mich nur beim Lehrer, da er sich in seiner freien Mittagpause bemüht uns Italienisch näher zu bringen, und zeigt dann noch die Anzahl der Italienischen Wörter in der Datenbank an.

Das Programm zeigt uns in bestimmten Zeitabschnitten das italienische Wort und die Bedeutung in Türkisch ( und auf Wunsch auch in Deutsch und / oder Englisch ) an. Die Zeit die das "Erinnerungsfenster" auf dem Bildschirm erscheint ( z.B. 5 Sek. ) und wieder verschwindet ( z. B. 180 Sek. ) wird vom Anwender eingegeben ( Anzeigezeit und Versteckzeit sind nicht gleich wie in deinem Code vorgeschrieben ). Das Programm läuft sozusagem nebenher im Hintergrund und zeigt uns die gelernten Italienischen Wörter, in bestimmten Zeitabschnitten automatisch mit den entsprechenen Bedeutungen ohne ein Zutun vom Anwender an.

Nun hatte ein Mitschüler die Idee, ob man die Bedeutungen nicht später ( Zeitdauer vom User angegeben ) als das Italienische Wort anzeigen könnte. So hätte man als Schüler die Chance erst mal zu überlegen was die Bedeutung von dem Wort wäre bevor es angezeigt wird.

Aber so wie ich es sehe, funktioniert das wohl nicht. Es sah so einfach aus - einfach ein DELAY(xxxx) zwischen den beiden Textfeldern - klappt auch gut, aber eben nur im 1. Durchgang :-( . Danach sind dann ganz andere Probleme aufgetaucht, mit denen ich nicht gerechnet habe.
Nun zu deinem Problem: Die beiden Texte werden deshalb angezeigt, weil während der Maximierung die Bearbeitung weiterläuft. Bis das Bild aufgebaut ist, ist das Prg im Arbeitsspeicher schon weiter.
Aber ich habe ja nur das "Eingangsfenster" normalisiert oder maximiert. Das "Erinnerungsfenster" maximiert sich ja genauso wie wenn das "Eingangsfenster" minimiert ist - aber eben mit unterschiedlichen Ergebnissen von der Textausgabe.

Ich werde mich dann nochmal weiterhin bemühen um das hinzubekommen - und bedanke mich nochmal an alle die sich die Mühe gemacht haben und auf meine Fragen eingegangen sind.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Antworten