Seite 1 von 3

SetWindowState(0, #PB_Window_Minimize)

Verfasst: 13.08.2006 15:43
von HemSA
Hallole Ihr,
ich habe jetzt mal ein kleines Programm gemacht das zeigt auf was ich hinausmöchte.

Wenn ich das "X" anklicke, dann schliesst das Programm sofort.
Wenn ich das"_" anklicke, dann minimiert das Fenster und ist unten in der Taskleiste. Klicke ich in der Taskleiste nochmal drauf ist es wieder da mit all den Inhalten.

Wenn ich den "Schliessenbutton" anklicke, dann minimiert das Fenster, um danach noch 2 mal aufzutauchen und danach schliesst auch das Programm. Aber beim Auftauchen ist das Fenster leer.

An was liegt das, das das Fenster leer wieder zum Vorschein kommt, während es beim "Minimierbutton" die Inhalte nicht verliert?

In der PureBasic-Lounge habe ich schon eine ähnliche Frage gestellt.

Hier der Code in PB 4

Code: Alles auswählen

If OpenWindow(0,216,0,300,300,"Testfenster",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  If CreateGadgetList(WindowID(0))
      TextGadget(1, 20, 20, 150, 20, "Textfeld 1")
      TextGadget(2, 20, 60, 60, 20, "Textfeld 2")                       
      TextGadget(3, 20, 100, 60, 20, "Textfeld 3")
      TextGadget(4, 20, 140, 60, 20, "Textfeld 4")
      ButtonGadget(5, 140, 200, 100, 30, "Schliessen")
EndIf     
  
  EndIf

  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow 
      Quit = 1
    EndIf
     If EventID = #PB_Event_Gadget
    
    
        If EventGadget()=5
          Quit = 1
        EndIf
          
       
        
        For i=1 To 2
   
            SetWindowState(0, #PB_Window_Minimize)
            Delay(2000)
            SetWindowState(0, #PB_Window_Normal)
            Delay(500)
             ;Delay(5000)
        Next 
      
       
           
    EndIf 
 Until Quit=1
  

End


Verfasst: 13.08.2006 15:54
von edel

Code: Alles auswählen

        For i=1 To 2
   
            SetWindowState(0, #PB_Window_Minimize)
            Delay(2000)
            SetWindowState(0, #PB_Window_Normal)
            Delay(500)
             ;Delay(5000)
        Next 
Hier findet keine Verarbeitung der Events statt , das kann so nix werden.
Events werden z.b. dafuer gebraucht um Gadgets neuzuzeichnen.

Verfasst: 13.08.2006 16:02
von #NULL
..genau.

Code: Alles auswählen

        SetWindowState(0, #PB_Window_Minimize)
        Delay(1000)
        SetWindowState(0, #PB_Window_Normal)
        While WindowEvent():wend ;<<<<<<<<<<<<<<<<<<<< ##
        Delay(1000)
..auch wenn ich nich weiß wozu..

Verfasst: 13.08.2006 16:06
von HemSA
Danke schon mal - da stehe ich dann noch auf der Leitung. Ich dachte immer Events werden nur zum Abfragen - ob sich was im Fenster getan hat - gebraucht. Das sie auch für das Darstellen von Gadgets benötigt werden wusste ich nicht.

Wie kann man dann ein Fenster verschwinden lassen und nach einer Weile wieder anzeigen ohne das die Inhalte verloren gehen? Mit "HideWindow(#Window, Status)" kommt ja bei dem Code das Gleiche raus - nämlich auch ein leeres Fenster.

Verfasst: 13.08.2006 16:15
von #NULL
mein letzter code macht ja genau dies. im übrigen gehen die inhalte nicht verloren, sondern das neuzeichnen des fensters wird einfach vernachlässigt

..des weiteren macht das auch dein eigener code, sobald er wieder be WaitWindowEvent() angelangt ist, aber da du quit=1 setzt gibt es kein nächstes mal (es ist also eher ein strukturierungs-problem deines codes)

Verfasst: 13.08.2006 16:19
von HemSA
Vielen Dank! - das ging ja flott.
Das hat mich schon mal weitergebracht.

Es geht um ein Programm, das aus einer Datei Wörter ausliest ( Italienisch und die Bedeutung auf Deutsch/Englisch was man will.)

Und das Fenster sollte so alle 5 Minuten mal für ein paar Sekunden auf dem Bildschirm angezeigt werden mit den beiden Wörtern in der jeweiligen Sprache. Sozusagen als Erinnerung. Den Code habe ich schon mal in der Louge gepostet.

Verfasst: 13.08.2006 16:33
von HemSA
Hallole - du warst mit deiner Antwort schneller, als ich mit dem Schreiben.
Das ist übrigens der Code. Aber es sind noch Macken drinnen. Es klappt mit dem While - Wend noch nicht.
Wie würdest du denn das machen mit dem Programmschliessen? Ein 2. Fenster? Und das Erscheinende und wieder versteckende Fenster als "Child"?


Code: Alles auswählen

If OpenWindow(0,50,100,350,200,"Testfenster",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
  
     If LoadFont(1, "Arial", 20) 
      SetGadgetFont(#PB_Default, FontID(1)) 
     EndIf 
  
  
  
    If  LoadImage(0, "C:\I.bmp")    
        LoadImage(1, "C:\Tr.bmp")    
    EndIf 
  
  
    If CreateGadgetList(WindowID(0)) 
      ImageGadget(0, 10,10,10, 10,ImageID(0))                      
      TextGadget(1, 100, 20, 150, 50, "")                            
      ImageGadget(2, 10,80,10, 10,ImageID(1))    
      TextGadget(3, 100,90, 150, 50, "") 
      TextGadget(4, 10,150, 250, 50, "Wortschatzanzahl: ") 
      TextGadget(5, 250,150, 100, 50, "") 
      
      
      
    EndIf 
  

    Repeat 
                    
         If ReadFile(1,"data.txt") 
              laengew.w= Lof(1)                                      
              
              zeilenanzahlw.w=laengew.w/62 
              zeilenanzahls.s= StrU((zeilenanzahlw.w), #Word) 
              
              
              zufallszeilennummerw.w= Random(zeilenanzahlw.w-1) 
              
              FileSeek(1,zufallszeilennummerw.w*62)                                        
          
              wert1s.s= StrU((zufallszeilennummerw.w+1), #Word)            
              wert2s.s=ReadString(1) 
              italienischs.s=Left(wert2s.s,20) 
              tuerkischs.s=Mid(wert2s.s,21, 20) 
              deutschs.s=Mid(wert2s.s,41, 20) 
              
            SetGadgetText(1,italienischs.s)    
            SetGadgetText(3,tuerkischs.s) 
            SetGadgetText(5,zeilenanzahls.s) 
            
                
            Debug "Zeile: "+wert1s.s+"     Italienisch:    "+italienischs.s+"     Türkisch:    "+tuerkischs.s+"     Deutsch:    "+deutschs.s    
    
            Delay(3000) 
            SetWindowState(0, #PB_Window_Normal) 
            Delay(1000) 
            SetWindowState(0, #PB_Window_Minimize) 
            While WindowEvent():Wend 
            ;Delay(500) 
            CloseFile(1) 
         EndIf    
  
ForEver 

EndIf 

End 

Verfasst: 13.08.2006 16:50
von #NULL
du hast diesmal das
While WindowEvent():Wend
ja auch nach dem
SetWindowState(0, #PB_Window_Minimize)
statt nach dem
SetWindowState(0, #PB_Window_Normal)

..und delay() ist prinzipiell nicht so günstig, weil dein programm in der zeit nichts/0 macht, also auch kein fenster refreshen. besser wäre für sowas vielleicht ein timer, der dafür sorgt, dass bestimmte sachen nur in abständen bearbeitet werden, wobei die hauptschleife prinzipiell immer durchläuft und wichtiges wie z,b, events abholen. (abgesehen von vielleicht einem kleinen delay(5) oder so, damit der rechenleistungs-anspruch der schleife etwas gebremst wird)

Verfasst: 13.08.2006 16:51
von Kaeru Gaman
so eine warteschleife irgendwo mittendrin ist übrigens eine der unschönsten lösungen, ebenso wie deine Delays.

spontan würd ich sagen, mach es mit nem timer-callback.
(wie das genau geht weiß ich aber nicht, hab ich noch nie gemacht)

ich könnte es mit einer komplett durchlaufenden schleife lösen.

evtl. wäre es auch vorzuziehen, die datei zuerst komplett einzulesen (in eine LL oder ein Array)
anstatt ständig die datei zu öffnen/durchsuchen/schließen.
es ist zwar hier nicht so tragisch, weil die performance nicht so sehr ins gewicht fällt
bei nem programm was eh lange delay-zeiten benutzt, aber es wäre trotzdem besserer stil.

Verfasst: 13.08.2006 17:05
von HemSA
Danke an euch beiden - ich sehe schon - ich muss da noch etwas herumbasteln was den Code angeht.

Tschüssle und Danke nochmals für die Zeit die Ihr euch für mich genommen habt.