Seite 1 von 4

Zugriff auf Main von innerhalb eines Moduls

Verfasst: 14.05.2016 12:32
von _JON_
Ja, ja Ich weiß Module sind zur Code Abschottung gedacht.

Aber ist es irgendwie möglich auf Konstanten im Haupt program zuzugreifen?

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 14.05.2016 13:25
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

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 14.05.2016 13:49
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!

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 14.05.2016 14:41
von _JON_
Danke, das werde ich so machen :allright:

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 14.05.2016 14:50
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

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 14.05.2016 18:22
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" :)

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 14.05.2016 19:39
von mk-soft
Den Gedanken hatte ich auch schon...

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 14.05.2016 19:52
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 ;-).

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 20.02.2019 15:42
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:

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 20.02.2019 16:52
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.