Seite 1 von 2

[erledigt] Fenster komplett in Proc abarbeiten ?

Verfasst: 13.04.2008 23:35
von scholly
moin, moin, ich hab mal wieder 'n Brett vorm Kopp :cry:

Meine App soll vom Hauptteil (mit Event-Abarbeitung) je nach User-Aktion andere Fenster zur Interaktion öffnen.

Ist das OK, wenn ich diese Fenster komplett in einer Proc erstelle, dort in einer eigenen Eventschleife ( If EventWindow() = dasfensterhier) komplett abarbeite und dann schließe?
Können irgendwelche Events "verlorengehen"?
Muß ich das aufrufenden Fenster mit DisableWindow() vorher "ruhigstellen" und dann wieder "aufwecken"?

:freak: irgendwie neben sich sitzend... scholly

Verfasst: 13.04.2008 23:58
von ts-soft
Möchtest Du ein modales Dialogfenster, oder ein zweites Fenster?
Im zweiterem wird es schwierig, dort sollten die Events in einem Loop
abgearbeitet werden (mit IsWindow() usw.)
Beim Dialogfenster ist die ParentID zu setzen, sowie das andere Fenster
solange ruhig zu stellen :mrgreen: , sonst wirds blass

Verfasst: 14.04.2008 00:13
von scholly
ts-soft hat geschrieben:Beim Dialogfenster ist die ParentID zu setzen, sowie das andere Fenster solange ruhig zu stellen :mrgreen: , sonst wirds blass
Das triffts wohl.
Im Hauptfenster sind ein TG und ein LIG und es sollen von dort Fenster zur Erfassung neuer Medien(Cds/DVDs/HDDs) und neuer Filme aufgemacht werden. Von letzterem aus rufe ich Fenster zur Genre-Wahl oder zum Nachgucken bei der IMDB auf.
Eventuell kommt noch ein Prefs-Editor-Fenster per Menü dazu.
"ruhig stellen" geht klar ;)
Laut PB-Doku ist die ParentID optional, aber nicht weiter beschrieben, wozu gut.
Wozu ist sie in diesem Fall gut/notwendig?

Verfasst: 14.04.2008 00:29
von ts-soft
Hierfür :D

Code: Alles auswählen

Procedure OpenMyDialog()
  Protected Dialog.l = OpenWindow(#PB_Any, 0, 0, 200, 200, "Dialog", #PB_Window_WindowCentered | #PB_Window_SystemMenu, WindowID(0))

  If Dialog
    DisableWindow(0, #True)

    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          DisableWindow(0, #False)
          CloseWindow(Dialog)
          Break
      EndSelect
    ForEver
  EndIf
EndProcedure

Procedure OpenMyWindow()
  If OpenWindow(0, 293, 179, 400, 400, "Haupt", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateGadgetList(WindowID(0))
      ButtonGadget(0, 155, 160, 95, 30, "Dialog")
    EndIf
  EndIf
EndProcedure

OpenMyWindow()

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          OpenMyDialog()
      EndSelect
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case 0
          CloseWindow(0)
          Break
      EndSelect
  EndSelect
ForEver
Jetzt ist es ein richtiger modaler Dialog. Den Rest sollteste jetzt aber
schaffen :wink:

Verfasst: 14.04.2008 00:37
von scholly
ts-soft hat geschrieben:Hierfür :D
....
Jetzt ist es ein richtiger modaler Dialog. Den Rest sollteste jetzt aber schaffen :wink:
Danke für die Mühe mit dem Code, wäre nicht nötig gewesen.
Ich kann aber leider die Antwort auf "Wozu ist sie in diesem Fall gut/notwendig?" nicht erkennen.
Vielleicht sollte ich ersma Bubu machen und morgen/nacher alles mit frischen Augen betrachten :lol:

guts Nächtle...

Verfasst: 14.04.2008 00:41
von ts-soft
Öffne den Dialog und klicke aufs Hauptfenster, dann siehste wofür. So,
viel Spaß beim Bubu machen :lol:

Verfasst: 14.04.2008 08:24
von NicTheQuick
Ich mache es normalerweise immer so:
Jedes Fenster bekommt zwei bis drei Procedures.
Die erste zum erstellen des Fensters: GUI_Open_NameDesFensters()
Dann die für die Events des Fensters: GUI_Event_NameDesFensters(EventID.l)
Dann je nachdem noch eine zum Resizen des Fensters: GUI_Resize_NameDesFensters()

In der Main-Loop steht dann nur noch folgendes:

Code: Alles auswählen

Repeat
  EventID = WaitWindowEvent(10)
  GUI_Event_Fenster1(EventID)
  GUI_Event_Fenster2(EventID)
ForEver
In den Event-Procedures wird dann mit 'EventWindow()' verglichen, ob das
Event überhaupt für das Fenster ist und dann ganz normal abgearbeitet.
Bei einem '#PB_Event_Resize' wird dann die entsprechende Resize-Procedure aufgerufen.

Damit bin ich bisher super zurecht gekommen.

Verfasst: 14.04.2008 19:13
von scholly
@NTQ: Danke für Deine Erläuterung, ich bevorzuge aber "alles in einer Proc", wenns dabei keine gravierende Schwachstelle gibt, die ich bisher nicht erkenne.
ts-soft hat geschrieben:Öffne den Dialog und klicke aufs Hauptfenster, dann siehste wofür.
hm...
Mit 'ParentWindowID' erscheints nicht in der Taskleiste und die Titelleiste flackert beim Klick ins ElterFenster aufmerksamkeitsheischend.
Mehr Unterschiede habbich nich gefindet :cry:
Dann reicht doch eigentlich DisableWindow(#Window, 0|1).

Verfasst: 14.04.2008 19:23
von ts-soft
Du kannst das disabledte fenster nicht erreichen, was ja sinnvoll ist, reicht
also nicht, warum willste dir den einen nützlichen parameter sparen?

macht doch keinen sinn

Verfasst: 14.04.2008 19:33
von scholly
Vor dem Start der eigentlichen GUI kann es passieren, daß ich ein Fenster zur Eingabe von "Standard-Prefs" öffnen muß. Das hat ja noch kein ParentWindow.
Die Proc will ich aber eigentlich später nochmal per Menü aufrufbar machen.