Seite 1 von 2

Vorteile einer Kapselung von OpenWindow mit if-Statement?

Verfasst: 08.08.2009 19:29
von Klaus_1963
Bin mal wieder am werkeln. Hier zwei Quelltexte: Example_1 habe ich direkt von der Hilfe von PB übernommen. Nun habe ich aber festgestellt, dass Example_2, bei denen ich die if-Kapselung* von OpenWindow und CreateMenu einfach entfernt habe genau das gleiche leistet. Aus welchem Grund wird üblicherweise (zumindest wenn ich die Hilfe-Beispiele betrachte) diese if-Kapselung* durchgeführt?

*ich nenne das einfach mal if-Kapselung, weil mir nichts anderes einfiel...


Example_1: Dieses Beispiel habe ich aus der Hilfe von PB

Code: Alles auswählen

If OpenWindow(0, 0, 0, 230, 90, "Event-Handling Beispiel...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

   ButtonGadget  (1, 10, 10, 200, 20, "Klick mich")
   CheckBoxGadget(2, 10, 40, 200, 20, "Markiere mich")

   If CreateMenu(0, WindowID(0))
     MenuTitle("Menu")
     MenuItem(1, "Eintrag 1")
     MenuItem(2, "Eintrag 2")
     MenuItem(3, "Eintrag 3")
   EndIf

   Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Schalter 1 angeklickt!"
           Case 2 : Debug "Schalter 2 angeklickt!"
           Case 3 : Debug "Schalter 3 angeklickt!"
         EndSelect
       
       Case #PB_Event_Menu
         Select EventMenu()
           Case 1 : Debug "Menü-Eintrag 1 angeklickt!"
           Case 2 : Debug "Menü-Eintrag 2 angeklickt!"
           Case 3 : Debug "Menü-Eintrag 3 angeklickt!"
         EndSelect
     
     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf
Nun arbeitet folgendes leicht abgeändertes Beispiel genau gleich:

Example_2:

Code: Alles auswählen

OpenWindow(0, 0, 0, 230, 90, "Event-Handling Beispiel...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

   ButtonGadget  (1, 10, 10, 200, 20, "Klick mich")
   CheckBoxGadget(2, 10, 40, 200, 20, "Markiere mich")

   CreateMenu(0, WindowID(0))
     MenuTitle("Menu")
     MenuItem(1, "Eintrag 1")
     MenuItem(2, "Eintrag 2")
     MenuItem(3, "Eintrag 3")


   Repeat
     Event = WaitWindowEvent()
     
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Schalter 1 angeklickt!"
           Case 2 : Debug "Schalter 2 angeklickt!"
           Case 3 : Debug "Schalter 3 angeklickt!"
         EndSelect
       
       Case #PB_Event_Menu
         Select EventMenu()
           Case 1 : Debug "Menü-Eintrag 1 angeklickt!"
           Case 2 : Debug "Menü-Eintrag 2 angeklickt!"
           Case 3 : Debug "Menü-Eintrag 3 angeklickt!"
         EndSelect
     
     EndSelect
   Until Event = #PB_Event_CloseWindow

Verfasst: 08.08.2009 19:38
von ts-soft
Mit der IF Kapselung wird überprüft, ob die Funktion auch funktioniert hat:
<> 0
Solch eine Überprüfung sollte man möglichst immer durchführen, vor allem
bei Memory, Datei und ähnlichen Funktionen. Bei OpenWindow ist es ver-
nachlässigbar.

gruß
Thomas

Verfasst: 08.08.2009 19:44
von Captn. Jinguji
Es doch tatsächlich schon Fälle gegeben haben, in denen OpenWindow()
NICHT erfolgreich war.

Wenn das Deinen Programmen mal passieren sollte, willst Du doch sicher nicht, dass das Programm an den Folgen der danach nicht mehr funktionierenden Aktionen stirbt und entsprechende Todesschreie ausstösst, sondern vielleicht die Fehlersituation noch auswerten (dazu bedarf es natürlich eines ELSE - Zweiges, der die Hilfe unübersichtlich gemacht hätte) und den Benutzer informieren, dass es an zuwenig Speicher, falscher Version oder was immer es auch ist, lag.

Das macht ja auch Dir die Arbeit leichter, wenn Du nicht der User, sondern der Hersteller bist.

Verfasst: 08.08.2009 19:49
von Kaeru Gaman
man kann statt den gesamten code zu klammern auch einfach ein If Not verwenden.

ein beispiel das zeigt, dass es sinnvoll sein kann:

Code: Alles auswählen

InitSprite()
If Not OpenScreen( 1000, 500, 32, "geht nich")
  MessageRequester("Error","Screen geht nich")
  End
EndIf
das format existiert nicht, kein Grafikmodus kann 1000x500 darstellen.
anstatt einfach abzustürzen wird ein korrekter MessageRequester ausgegeben.

Verfasst: 08.08.2009 19:49
von Klaus_1963
Hallo Thomas und alle anderen Helfer

Aha, deshalb! Vielen Dank für die superschnelle und einleuchtende Antwort.

Grüsse

Klaus

Verfasst: 08.08.2009 20:34
von Kiffi
Captn. Jinguji hat geschrieben:Es doch tatsächlich schon Fälle gegeben haben, in denen OpenWindow()
NICHT erfolgreich war.
[...]
und den Benutzer informieren, dass es an zuwenig Speicher, falscher Version oder was immer es auch ist, lag.
... wobei ich mich ernsthaft frage, wie so eine Benachrichtigung aussähe?
Klappt ein MessageRequester(), wenn ein OpenWindow() fehlschlug?

Grüße ... Kiffi

Verfasst: 08.08.2009 20:38
von Kaeru Gaman
die Frage hab ich mir auch schon oft gestellt... xD

Verfasst: 08.08.2009 20:48
von TomS
Kiffi hat geschrieben:... wobei ich mich ernsthaft frage, wie so eine Benachrichtigung aussähe?

Am besten in ein ErrorLog, welches dann gleich mit RunProgram() aufgerufen wird.

Verfasst: 08.08.2009 22:57
von Captn. Jinguji
Kiffi hat geschrieben:
Captn. Jinguji hat geschrieben:Es doch tatsächlich schon Fälle gegeben haben, in denen OpenWindow()
NICHT erfolgreich war.
[...]
und den Benutzer informieren, dass es an zuwenig Speicher, falscher Version oder was immer es auch ist, lag.
... wobei ich mich ernsthaft frage, wie so eine Benachrichtigung aussähe?
Klappt ein MessageRequester(), wenn ein OpenWindow() fehlschlug?

Grüße ... Kiffi
Ich denke, der ursprüngliche Poster wird schon die Transformationsleistung von "OpenWindow()" zu "OpenFile()" etc. selbst erbringen können.
Greets
CJ

Verfasst: 08.08.2009 23:16
von hjbremer
ein Messagerequester braucht kein Window, es hat selbst eins. :D