Zugriff auf Main von innerhalb eines Moduls

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Zugriff auf Main von innerhalb eines Moduls

Beitrag von _JON_ »

Ja, ja Ich weiß Module sind zur Code Abschottung gedacht.

Aber ist es irgendwie möglich auf Konstanten im Haupt program zuzugreifen?
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von mk-soft »

Nicht direkt...

Code: Alles auswählen


DeclareModule Common
  
  Enumeration 10
    #common_value0
    #common_value1
  EndEnumeration
  
EndDeclareModule

Module Common
  
EndModule

DeclareModule MyModul
  
  Declare fc()
  
EndDeclareModule

Module MyModul
  
  UseModule Common
  
  Procedure fc()
    ProcedureReturn #common_value0
  EndProcedure
  
EndModule

;- Test

UseModule Common

Debug MyModul::fc()
Debug #common_value1
__________________________________________________
Quote-Tags>Code-Tags
14.05.2016
RSBasic
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von ts-soft »

Code: Alles auswählen

DeclareModule CommonConstants
  ; Form
  Enumeration FormWindow
  EndEnumeration
  Enumeration FormGadget
  EndEnumeration
  Enumeration FormMenu
  EndEnumeration
  Enumeration FormImage
  EndEnumeration
  Enumeration FormFont
  EndEnumeration
  ; Event
  Enumeration EventCustom #PB_Event_FirstCustomValue
  EndEnumeration
  Enumeration EventTypeCustom #PB_EventType_FirstCustomValue
  EndEnumeration
EndDeclareModule

Module CommonConstants
EndModule

UseModule CommonConstants
Solange CommonConstants an erster Stelle im Code steht und es ins Modul einverleibt wird, können diese benamsten Enumerationen sogar problemlos in jedem Module erweitert werden und sind überall gültig, wo sie einverleibt wurden.

Die Enumerationen in der CommonConstants können dabei leer bleiben, wie oben abgebildet!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von _JON_ »

Danke, das werde ich so machen :allright:
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von helpy »

Warum überhaupt noch Code außerhalb von Modulen verwalten?

Wie wäre es damit:

Code: Alles auswählen

DeclareModule Application
	EnableExplicit
	; Global application constants, structures, macros, ...
	; ...
	Declare	Main()
	End Main()
EndDeclareModule

Module Application
	; Private application constants, structures, macros, ...
	; ...
	Procedure Main()
		Debug #PB_Compiler_Module + "::" + #PB_Compiler_Procedure + " started!"
		; ...
		Delay(2000)
		; ...
		Debug #PB_Compiler_Module + "::" + #PB_Compiler_Procedure + " finished!"
	EndProcedure
EndModule
Andere Module (wenn das überhaupt nötig ist) könnten dann einfach mit Application::XYZ auf globale Konstanten, Variablen usw. zugreifen.

LG,
Guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von _JON_ »

helpy hat geschrieben:Warum überhaupt noch Code außerhalb von Modulen verwalten?
Gute Frage, also mirfällt da eigentlich kein Grund ein.

Das nächst Program wird also komplett "moduliert" :)
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von mk-soft »

Den Gedanken hatte ich auch schon...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von helpy »

Ich fange alle meine Programme/Tools (wie klein sie auch sein mögen) nun seit einiger Zeit schon so an.

Inzwischen habe ich mich schon so daran gewöhnt, dass sich ohne bereits seltsam anfühlt ;-).
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Kurzer »

Sorry, wenn ich das hier ausbuddel, aber ich habe mich gerade ähnliches gefragt ("warum kann ich im Modul nicht auf Konstanten des Hauptprogramms zugreifen?"), zumal bei WIN-Api Konstanten offenbar eine Ausnahme gemacht wird.

Code: Alles auswählen

Enumeration 
	#GG_DATAMODE_INTEGER
	#GG_DATAMODE_FLOAT
EndEnumeration

DeclareModule GraphGadget
	
	#GG_BORDERSIZE = 1
	#GG_BUTTONSGAPSIZE = 5
	
	Declare   Draw(*GraphGadget.GraphGadget, iDataMode=#GG_, iDrawButtons.i=#False)
	#WM_
	
EndDeclareModule

Module GraphGadget
	
	;...
	
EndModule
Die beiden #GG_DATAMODE... Konstanten habe ich in den Hauptscope gelegt, damit ich bei Nutzung des Moduls ohne UseModule einfach...

GraphGadget::Draw(*GHnd, #GG_DATAMODE_INTEGER) schreiben kann und nicht die umständliche Variante
GraphGadget::Draw(*GHnd, GraphGadget::#GG_DATAMODE_INTEGER), wenn ich die beiden Konstanten innerhalb des Moduls deklarieren würde.

So weit, so ungut. Ich kann aus einem Modul heraus also nicht auf selbst deklarierte Konstanten des Hauptprogramms zu greifen.

Bild

Auf der anderen Seite geht das mit API-Konstanten sehr wohl.

Bild

So ganz kann ich daher die (unvollständige) Abschottung nach außen nicht nachvollziehen.
Klar, wenn man den Zugriff auf sämtliche Konstanten aus einem Modul heraus unterbinden würde, wäre das völlig idiotisch, aber warum die Abschottung bei den selbst definierten Konstanten im Hauptscope? Bei der Verwendung von "fremden" Konstanten kann ich aus dem Modul heraus doch nichts im Hauptscope kaputt machen. Mich würde der Sinn dahinter interessieren.

PS: Ich löse das jetzt damit, dass ich die betreffenden Konstanten zweimal deklariere. Innerhalb und außerhalb des Moduls. :freak:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von _JON_ »

Die Konstanten die in den Residents festgelegt sind, sind überall verfügbar, der Rest nicht.
Module sind leider wirklich nur BlackBoxen und zu Code teilen im Forum gedacht.
Kurzer hat geschrieben:PS: Ich löse das jetzt damit, dass ich die betreffenden Konstanten zweimal deklariere. Innerhalb und außerhalb des Moduls. :freak:
Ja, anders geht es auch nicht.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Antworten