Grundsätzliche Frage zur Programmstruktur

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
TobiasR
Beiträge: 19
Registriert: 16.08.2008 08:58
Wohnort: Nidda
Kontaktdaten:

Grundsätzliche Frage zur Programmstruktur

Beitrag 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?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 !
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag 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?
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, da würde mich jetzt auch mal ne begründung interessieren.
^ yoda... lol
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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:
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ß
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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: .
Antworten