Seite 3 von 4

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 09:51
von #NULL
Sicro hat geschrieben:

Code: Alles auswählen

...
  Macro OptionsMacro
...
Schöne Idee. So eine Art Mixin.

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 09:57
von Kurzer
mhs hat geschrieben:PB kapselt die Konstanten des Main Scopes ebenfalls, da es auch hier zu Überschneidungen kommen könnte. Das ist eigentlich sogar ziemlich gut durchdacht. Gehe davon aus, dass aus irgendwelchen Gründen im Main Scope bereits #GG_DATAMODE_INTEGER deklariert ist, was passiert dann innerhalb des Moduls, wenn die gleiche Konstante nochmal deklariert wird? Das ist in dem Fall zwar unwahrscheinlich, die Konstante könnte aber auch einfach #ALL, #NONE, etc heißen.
Das ist mal eine stichfeste Erklärung für das aktuelle Verhalten. :allright:
Okay, jetzt macht es Sinn, wenn die Konstanten des Mainscopes ausgeblendet werden.

Die Sache mit der Konstantendefinition per Macro werde ich so machen, auch das ist sehr sinnvoll.

Gruß Markus

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 16:37
von Kurzer
Tja, schade. Das mit dem Macro funktioniert leider nicht, wenn ich es mittels Includedatei realiseren möchte.

Moduldatei:
----

Code: Alles auswählen

DeclareModule MyModule
	Macro CommonConstants()
		Enumeration
			#GG_DATAMODE_INTEGER
			#GG_DATAMODE_FLOAT
		EndEnumeration
	EndMacro
	
	CommonConstants()
  ; ...
	
EndDeclareModule

Module MyModule
	; ...	
EndModule

MyModule::CommonConstants()
Man beachte: Ich lasse innerhalb der separaten Moduldatei das Macro ganz am Ende bereits im Hauptscope ausführen, damit man als Anwender des Moduls nicht extra daran denken muss. Aber leider werden die Konstanten im Hauptscope nicht vorgeschlagen.

Angenommen das Hauptprogramm sieht einfach nur so aus

Code: Alles auswählen

IncludeFile "MyModule.pbi"
; ...
... dann müssten die Konstanten direkt hinter dem Includefile ja schon verfügbar sein.

Wenn ich nun im Editor versuche die Konstanten zu nutzen, tut sich nix. Offenbar parst der Editor nicht Includefileübergreifend bzw. expandiert er die Macros nicht.

Ich bleibe also bei der doppelten Deklaration und passe auf, dass ich bei Änderungen immer schön mit Copy & Pastete arbeite. :)

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 17:59
von Nino
Kurzer hat geschrieben:... dann müssten die Konstanten direkt hinter dem Includefile ja schon verfügbar sein.
Für den Compiler sind sie auch verfügbar. Nur der Editor (Autovervollständigung) kennt nicht den Inhalt von Include-Dateien.

Mein Hauptprogramm:

Code: Alles auswählen

IncludeFile "MyModule.pbi"

Debug #GG_DATAMODE_INTEGER
Debug #GG_DATAMODE_FLOAT
Wie erwartet wird
0
1
angezeigt.

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 18:37
von silbersurfer
@Nino
Für den Compiler sind sie auch verfügbar. Nur der Editor (Autovervollständigung) kennt nicht den Inhalt von Include-Dateien.
doch wenn die Include-Dateinen einfach in den Editor hinzugeladen werden (in einen neuen Tab), dann werden Sie auch von der Autovervollständigung gefunden, sofern in der Einstellung unter Autovervollständigung alle offene Projekte makiert ist.

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 18:51
von Nino
silbersurfer hat geschrieben:doch wenn die Include-Dateinen einfach in den Editor hinzugeladen werden (in einen neuen Tab), dann werden Sie auch von der Autovervollständigung gefunden, sofern in der Einstellung unter Autovervollständigung alle offene Projekte makiert ist.
Mag sein. Das wird hier aber nicht viel nützen, da Makros sowieso nur vom Compiler expandiert werden. :-)

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 19:37
von silbersurfer
@Nino
Mag sein. Das wird hier aber nicht viel nützen, da Makros sowieso nur vom Compiler expandiert werden.
das weiß ich jetzt nicht so genau, aber es sind auch Makros in der Option dort auswählbar.
Bild

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 19:46
von Kurzer
Ich kann es jetzt nicht ausprobieren, aber ich denke, dass das nur bedeutet, dass die Autovervollständigung auch Macrobezeichner auflisten soll.

Die IDE wird Macros vermutlich nicht auflösen, um deren Inhalt bzgl. Verwendbarkeit in der Autovervollständigung zu untersuchen.

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 20:42
von Sicro
@Kurzer:
Ja, Autovervollständigung funktioniert mit der Macro-Variante leider nicht, weil die Macros erst beim Kompilieren aufgelöst werden.

Nimm die Variante von @mk-soft, die speziell ein Modul für die Konstanten bereitstellt und mit UseModule überall "inkludiert" werden kann, wo du Zugriff auf die Konstanten haben möchtest. So gelöst funktioniert auch die Autovervollständigung.

Re: Zugriff auf Main von innerhalb eines Moduls

Verfasst: 21.02.2019 23:55
von Kurzer
Nochmal zur Erinnerung... :|
kurzer hat geschrieben: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.
Natürlich hätte ich das alles mit UseModule oder durch Verwendung eines unabhängigen "CommonConstants-Moduls" machen können, aber darum ging es mir nicht. Meine zugrunde liegende Anforderung war eine andere.

Es ging darum, das Modul vom Hauptscope aus explizit zu adressieren ModulName::ModuleFunction(*Blah, #GG_DATAMODE_XYZ) (ohne Verwendung von UseModul) und dabei den Konstantennamen direkt anwenden zu können.

Es sind mittlerweile viele nette Vorschläge erwähnt worden. Für meinen Fall relevant und nutzbar bleibt jedoch nur die manuelle, doppelte Deklaration der Konstanten (ohne Macro) und der Hinweis von mhs, der die Abschottung der selbst definierten Konstanten aus dem Mainscope gegenüber dem Modulscope für mich schlüssig begründet hat.