Seite 1 von 6

Grundsätzliche Frage zur Programmstruktur

Verfasst: 19.08.2008 19:43
von TobiasR
Hallo,

mal ne ganz grundsätzliche Frage.

Eigentlich bin ich es gewohnt dass ich das Hauptprogramm mit "Do" oder "Main" beginne und mit Loop beende.
Unterprogrammteile werden dann mit Gosub - Return aufgerufen.

Bei prureBasic habe ich das bisher nicht gefunden.

Wie strukturiert man hier ein Programm?

Verfasst: 19.08.2008 19:49
von Kaeru Gaman
Gosub gibts zwar auch, aber davon raten wir im allgemeinen ab,
weil die Variablen nicht gekapselt werden.

für Unterprogramme gibt es Procedure.

für die Hauptschleife kannst du jede Schleifenart verwenden die du magst,
allerdings bevorzugen die meisten Repeat : Until.

zur weiteren Strukturiereng kannst du deinen Code auch in mehrere Includes aufteilen.

Verfasst: 20.08.2008 16:05
von mk-soft
Ein strukturierter Aufbau ist immer wichtig und an Kommentaren sollte es nicht mangeln.

1. Programm Kommentarkopf
2. Konstanten
3. Globale Variablen und Stukturen (bei grossen Projekten als Include 'Global.pbi')
4. Proceduren und Funktionen
5. Main
6. DataSection

Für kleine Testprogramme verwende ich ein fertigen Programmbaustein denn ich dann nur noch erweitern muss.

Code: Alles auswählen

;-TOP
; Kommentar     : 
; Author        : mk-soft
; Second Author : 
; Datei         : .pb
; Version       : 1.01
; Erstellt      : 
; Geändert      :
; 
; Compilermode  :
;
; ***************************************************************************************

EnableExplicit

;- Konstanten
Enumeration ; Window ID
  #Window
EndEnumeration

Enumeration ; Menu ID
  #Menu
EndEnumeration

Enumeration ; MenuItem ID
  #Menu_Exit
EndEnumeration

Enumeration ; Statusbar ID
  #Statusbar
EndEnumeration

Enumeration ; Gadget ID
  #List
EndEnumeration

; ***************************************************************************************

Procedure UpdateWindow()

  Protected x,y,dx,dy
  Protected mn,st,tb
  
  x = 0
  y = 0
  mn = MenuHeight()
  st = StatusBarHeight(#StatusBar)
  ;tb = ToolBarHeight(#ToolBar)
  dx = WindowWidth(#Window)
  dy = WindowHeight(#Window) - mn - st - tb
  ResizeGadget(#List, x, y, dx, dy)
  
EndProcedure

; ***************************************************************************************

Procedure WriteLog(Info.s)
  Protected temp.s
  temp = FormatDate("%YYYY.%MM.%DD %HH:%II:%SS - ", Date()) + Info
  AddGadgetItem(#List, -1, temp)
  If CountGadgetItems(#List) > 500
    RemoveGadgetItem(#List, 0)
  EndIf
EndProcedure

; ***************************************************************************************

;- Globale Variablen
Global exit = 0
Global winstyle
Global event, window, menu, gadget, type

; ***************************************************************************************

;IncludeFile "*.pb"

; ***************************************************************************************
;- Fenster
winstyle = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 400, 300, "Fenster", winstyle)
  ; Menu
  If CreateMenu(#Menu, WindowID(#Window))
    MenuTitle("&Datei")
      MenuItem(#Menu_Exit, "Be&enden")
  EndIf
  ; Statusbar
  CreateStatusBar(#Statusbar, WindowID(#Window))
  ; Gadgets
  If CreateGadgetList(WindowID(#Window))
    ListViewGadget(#List, 0,0,0,0)
  EndIf
  
  ;-- Hauptschleife
  Repeat
    event = WaitWindowEvent()
    Select event
      Case #PB_Event_Menu
        menu = EventMenu()
        Select menu
          Case #Menu_Exit
            Exit = 1
        EndSelect
      Case #PB_Event_Gadget
        gadget = EventGadget()
        type   = EventType()
    
      Case #PB_Event_CloseWindow
        window = EventWindow()
        If window = #Window
          Exit   = 1
        EndIf
        
      Case #PB_Event_Repaint
        window = EventWindow()
        
      Case #PB_Event_SizeWindow
        window = EventWindow()
        If window = #Window
          UpdateWindow()
        EndIf
        
      Case #PB_Event_MoveWindow
        window = EventWindow()
        
      Case #PB_Event_ActivateWindow
        window = EventWindow()
        
      Case #PB_Event_SysTray
        type   = EventType()
    
    EndSelect
    
  Until Exit
EndIf

End
FF :wink:

Verfasst: 21.08.2008 01:04
von edel
Wenn es um Fenster-Anwendungen geht, die Eventschleife immer in einer eigenen Procedure ausfuehren!

Code: Alles auswählen

Procedure doEvents(timeout=#PB_Default)
	event = WaitWindowEvent(timeout)
	
	[...]
	
EndProcedure

OpenWindow([...])

Repeat
	doEvents()
	
	
ForEver

Es gibt keinen besseren Weg !

Verfasst: 21.08.2008 09:58
von TomS
edel hat geschrieben:Wenn es um Fenster-Anwendungen geht, die Eventschleife immer in einer eigenen Procedure ausfuehren!

(code)


Es gibt keinen besseren Weg !
Hallo. Kannst du auch erklären, warum das besser ist? Ich habe das zwar schon öfter mal gesehen, aber selber angewendet habe ich es noch nie. Wo sind denn da die Vorteile?

Verfasst: 21.08.2008 11:56
von Andreas_S
TomS hat geschrieben:
edel hat geschrieben:Wenn es um Fenster-Anwendungen geht, die Eventschleife immer in einer eigenen Procedure ausfuehren!

(code)


Es gibt keinen besseren Weg !
Hallo. Kannst du auch erklären, warum das besser ist? Ich habe das zwar schon öfter mal gesehen, aber selber angewendet habe ich es noch nie. Wo sind denn da die Vorteile?
Übersicht? Kapselung?

Verfasst: 21.08.2008 15:16
von Kaeru Gaman
yo, da würde mich jetzt auch mal ne begründung interessieren.
^ yoda... lol

Verfasst: 21.08.2008 16:42
von Josef Sniatecki
Ich finde diesen Weg nur gut, wenn man das "doEvents" ein zweites Mal
irgendwo anders gebraucht. Aber im obigen Beispiel ist das völlig sinnlos.
Besonders weil dadurch ein paar ASM-Codes mehr gebraucht werden. :wink:

Verfasst: 21.08.2008 16:47
von Kaeru Gaman
es geht weder um die drei byte für zusätzliche opcodes,
noch um den call und den jump, weil das ja auch außerhalb der schleife passiert und vernachlässigbar kurz ist.

wenn edel so eine Aussage macht, hat er sich meistens doch was dabei gedacht,
und dann würde mich einfach interessieren, wie er dazu kommt, was der Hintergrund ist.

Verfasst: 21.08.2008 16:49
von Andreas_S
@Josef Sniatecki

:?

Wiso sollte man die gleichen Event-Prozedur 2x gebrauchen?

Und Edel hat völlig recht! es ist besser, da man die Übersicht behält...

Und wenn es euch jetzt schon um 1 Procedure-call an kommt, dann schreibt euren Code doch gleich in eine Wurst :freak: .