Grundsätzliche Frage zur Programmstruktur
Grundsätzliche Frage zur Programmstruktur
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?
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?
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
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.
FF 
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

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Wenn es um Fenster-Anwendungen geht, die Eventschleife immer in einer eigenen Procedure ausfuehren!
Es gibt keinen besseren Weg !
Code: Alles auswählen
Procedure doEvents(timeout=#PB_Default)
event = WaitWindowEvent(timeout)
[...]
EndProcedure
OpenWindow([...])
Repeat
doEvents()
ForEver
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?edel hat geschrieben:Wenn es um Fenster-Anwendungen geht, die Eventschleife immer in einer eigenen Procedure ausfuehren!
(code)
Es gibt keinen besseren Weg !
Übersicht? Kapselung?TomS hat geschrieben: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?edel hat geschrieben:Wenn es um Fenster-Anwendungen geht, die Eventschleife immer in einer eigenen Procedure ausfuehren!
(code)
Es gibt keinen besseren Weg !
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- Josef Sniatecki
- Beiträge: 657
- Registriert: 02.06.2008 21:29
- Kontaktdaten:
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.
irgendwo anders gebraucht. Aber im obigen Beispiel ist das völlig sinnlos.
Besonders weil dadurch ein paar ASM-Codes mehr gebraucht werden.

PB 4.61 | Windows Vista - 32Bit
Homepage
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Homepage
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.