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

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.

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

.