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
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"?

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

, 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

, 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
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

Verfasst: 14.04.2008 00:37
von scholly
ts-soft hat geschrieben:Hierfür
....
Jetzt ist es ein richtiger modaler Dialog. Den Rest sollteste jetzt aber schaffen

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
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

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
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.