Seite 1 von 1

Ein minimiertes Fenster normal anzeigen

Verfasst: 23.04.2006 09:28
von aspicza
Hallo!

Gleich vorweg: Ich habe bereits hier im Forum nach einer Lösung gesucht - aber keine gefunden. Dehalb schreibe ich nun mein Problem.

Ich habe ein Fenster, das beim Starten des Programms geöffnet wird. Wenn eine Bedingung erfüllt ist, dann öffnet sich ein zweites Fenster, welches nur geschlossen werden kann. Es dient auch nur als Hinweisfenster - so nach dem Motto: "Hier ist was passiert. Bitte drum kümmern!" . Bis dato gibt es auch kein Problem, aber...

Mein erstes Fenster soll nun nicht immer auf dem Desktop sichtbar sein, deshalb wird es der Benutzer minimieren. Und jetzt das Problem: Wenn die Bedingung erfüllt ist, so dass das Hinweisfenster geöffnet wird, dann passiert das auch, aber es ist nur in der Taskleiste zu sehen!!!

Wenn mein erstes Fenster nicht minimiert ist, dann funktioniert alles prima!

Wie bereits erwähnt habe ich bereits etliche ShowWindow_ SetForegroundWindow_ und SetWindowPos_ ausprobiert, aber anscheinend nicht richtig.

Bitte helft mir!

Hier mein Code:

Code: Alles auswählen

OpenWindow(0, 329, 99, 799, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , "Programm")

datum.l=Date()

zeile=10

Repeat
event=WindowEvent()

       
    verstrichen.l=Date()

    

    If verstrichen-datum>10
    
        datum+9
        
        tickets.l=0
        
        If tickets<zeile
           OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "NEUER HINWEIS")
          
           ShowWindow_(WindowID(0),#SW_RESTORE)       
           ShowWindow_(WindowID(1),#SW_RESTORE)
           ; SetForegroundWindow_(WindowHandle) 
           tickets=zeile
        EndIf
      
        
        tickets.l=zeile
    
    EndIf

    If event=#PB_Event_CloseWindow And EventWindowID()=1
      CloseWindow(1)     
    EndIf

Delay(100)
Until event=#PB_Event_CloseWindow And EventWindowID()=0
End
Das ist der letzte meiner vielen Versuche gewesen. Auch habe ich mit UseWindow(), ActivateWindow() und HideWindow() rumprobiert. Aber es klappte einfach alles nicht.

Carpe Diem

Arndt

Verfasst: 23.04.2006 09:38
von ts-soft
Funktionierender Code wäre nett, ansonsten kann man nichts testen!
1. bin zu Faul einen funktionierenden Code draus zu machen
2. oftmals liegt der Fehler im nicht vorhandenen Code

Auf jedenfall ist die Windowsschleife nicht gut so, WaitWindowsEvent() sollte
es schon sein. Die Fenster in der Schleife müssen unterschieden werden.
Mehr kann ich ohne Code nicht sagen.

SORRRRYYYYY :-)

Verfasst: 23.04.2006 09:53
von aspicza
Habe gerade meinen Code editiert. Nun kann man ihn einfach kopieren. Er läuft jetzt.

Werde darauf in Zukunft besonders achten...

Tschuldigung

Verfasst: 23.04.2006 10:16
von ts-soft
Ich weiß jetzt nicht genau was es werden soll :wink: , aber vielleicht hilft es ja:

Code: Alles auswählen

OpenWindow(0, 329, 99, 799, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , "Programm")
OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible, "NEUER HINWEIS")

datum.l=Date()

zeile=10

event=#PB_Event_CloseWindow And EventWindowID()=0
Repeat
event=WindowEvent()

       
    verstrichen.l=Date()

   

    If verstrichen-datum>10
   
        datum+9
       
        tickets.l=0
       
        If tickets<zeile
           ;OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "NEUER HINWEIS")
            HideWindow(1, #False)
            SetForegroundWindow_(WindowID(1))
           ;ShowWindow_(WindowID(0),#SW_RESTORE)       
           ;ShowWindow_(WindowID(1),#SW_RESTORE)
           ; SetForegroundWindow_(WindowHandle)
           tickets=zeile
        EndIf
     
       
        tickets.l=zeile
   
    EndIf

    If event=#PB_Event_CloseWindow And EventWindowID()=1
      HideWindow(1, #True)     
    EndIf

Delay(100)
Until event=#PB_Event_CloseWindow And EventWindowID()=0
End

Verfasst: 23.04.2006 10:27
von aspicza
Hallo!

@ts-soft: Leider funktioniert es nicht. Aber Deine Varaiante hat mich über die Funktion IsWindow() stolpern lassen :-) Vielen Dank!

Und nun funktioniert es auch!

Hier der Code für alle mit dem gleichen Problem:

Code: Alles auswählen

OpenWindow(0, 329, 99, 799, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , "Programm") 
OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible, "NEUER HINWEIS") 

datum.l=Date() 

zeile=10 

event=#PB_Event_CloseWindow And EventWindowID()=0 
Repeat 
event=WindowEvent() 

        
    verstrichen.l=Date() 

    

    If verstrichen-datum>10 
    
        datum+9 
        
        tickets.l=0 
        
        If tickets<zeile 
           If IsWindow(1)=#False : OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "NEUER HINWEIS") : EndIf
            HideWindow(1, #False) 
            SetForegroundWindow_(WindowID(1)) 
             tickets=zeile 
        EndIf 
      
        
        tickets.l=zeile 
    
    EndIf 

    If event=#PB_Event_CloseWindow And EventWindowID()=1 
      CloseWindow(1)      
    EndIf 

Delay(100) 
Until event=#PB_Event_CloseWindow And EventWindowID()=0 
End

Verfasst: 23.04.2006 10:33
von ts-soft
Warum erstellst Du das Fenster immer Neu? Verstecken würde doch reichen.
Für Deine Ereignisschleife solltest Du vielleicht einen Timer einsetzen und auf
WaitWindowEvent() umstellen. Ansonsten reagiert es nicht auf jedes Ereignis
und die CPU hat mehr Luft um andere Programme zu verarbeiten :wink:

Verfasst: 23.04.2006 10:44
von aspicza
Hallo!

@ts-soft: Das wollte ich auch, aber wenn ich das Fenster nur versteckt habe, nachdem auf den Close-Button geklickt wurde, wurde merkwürdigerweise auch mein erstes Fenster geschlossen und damit das Programm nicht gewollt beendet.

Code: Alles auswählen

If event=#PB_Event_CloseWindow And EventWindowID()=#Window_1
      HideWindow(#Window_1,1)     
    EndIf
Das ich nicht WaitWindowEvent() benutze liegt an meiner Information, dass WaitWindowEvent() die Programmausführung anhält und wartet bis was passiert. Da ich aber darauf warte, dass 10 Sekunden verstreichen, habe ich mich für WindowEvent() entschlossen und einem Delay am Ende der Schleife, damit die CPU-Arbeit auch noch andere Programme abbekommen. Oder habe ich die Funktionen missverstanden??? Ich gehe davon aus, dass nach dem Befehl WaitWindowEvent das Programm wirklich "steht".

Verfasst: 23.04.2006 10:52
von ts-soft
Das Programm steht, ist richtig. Das ist für Anwendungen auch erforderlich, um nicht das ganze System zu belasten, und weil sonst alle Ereignisse, die während des Delays den Jordan hinunter gehen, verloren gehen.

Ein Timer (entweder die Lib aus PBOSL oder per API) durchbricht diesen Halt, bzw. Arbeitet das Ereignis in einem Callback ab.

Am einfachsten wäre es, wenn Du PB4 Beta verwendest, da kannste
event = waitwindowevent(100) verwenden, wobei dann alle 100 ms die
Schleife auch ohne Ereignis abgearbeitet wird.

Hier nochmal ein andere Code mit Timer, Timer steht auf 20 Sek,

Code: Alles auswählen

Procedure Timer()
  If IsWindow(1) = #False
    OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible, "NEUER HINWEIS")
  EndIf
  HideWindow(1, #False)
  SetForegroundWindow_(WindowID(1))
EndProcedure

OpenWindow(0, 329, 99, 799, 300,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , "Programm")
OpenWindow(1, 372, 247, 333, 67,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_Invisible, "NEUER HINWEIS")
SetTimer_(WindowID(0), 0, 20000, @Timer())
Repeat
  event=WaitWindowEvent()
  windID = EventWindowID()
  If event=#PB_Event_CloseWindow And windID = 1
    CloseWindow(1)    
  EndIf
Until event=#PB_Event_CloseWindow And windID = 0
KillTimer_(WindowID(0), 0)
End

Verfasst: 23.04.2006 12:23
von aspicza
Hallo!

@ts-soft: Diese Variante finde ich sehr elegant :-) *DANKE*