[erledigt] Fenster komplett in Proc abarbeiten ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[erledigt] Fenster komplett in Proc abarbeiten ?

Beitrag 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
Zuletzt geändert von scholly am 17.05.2008 15:34, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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?
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Öffne den Dialog und klicke aufs Hauptfenster, dann siehste wofür. So,
viel Spaß beim Bubu machen :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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).
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten