Schöne Idee. So eine Art Mixin.Sicro hat geschrieben:Code: Alles auswählen
... Macro OptionsMacro ...
Zugriff auf Main von innerhalb eines Moduls
Re: Zugriff auf Main von innerhalb eines Moduls
Re: Zugriff auf Main von innerhalb eines Moduls
Das ist mal eine stichfeste Erklärung für das aktuelle Verhalten.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.
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
"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.
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.
Re: Zugriff auf Main von innerhalb eines Moduls
Tja, schade. Das mit dem Macro funktioniert leider nicht, wenn ich es mittels Includedatei realiseren möchte.
Moduldatei:
----
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
... 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.
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()
Angenommen das Hauptprogramm sieht einfach nur so aus
Code: Alles auswählen
IncludeFile "MyModule.pbi"
; ...
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.
"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.
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.
Re: Zugriff auf Main von innerhalb eines Moduls
Für den Compiler sind sie auch verfügbar. Nur der Editor (Autovervollständigung) kennt nicht den Inhalt von Include-Dateien.Kurzer hat geschrieben:... dann müssten die Konstanten direkt hinter dem Includefile ja schon verfügbar sein.
Mein Hauptprogramm:
Code: Alles auswählen
IncludeFile "MyModule.pbi"
Debug #GG_DATAMODE_INTEGER
Debug #GG_DATAMODE_FLOAT
angezeigt.0
1
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Zugriff auf Main von innerhalb eines Moduls
@Nino
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.Für den Compiler sind sie auch verfügbar. Nur der Editor (Autovervollständigung) kennt nicht den Inhalt von Include-Dateien.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Re: Zugriff auf Main von innerhalb eines Moduls
Mag sein. Das wird hier aber nicht viel nützen, da Makros sowieso nur vom Compiler expandiert werden.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.
- silbersurfer
- Beiträge: 174
- Registriert: 06.07.2014 12:21
Re: Zugriff auf Main von innerhalb eines Moduls
@Nino
das weiß ich jetzt nicht so genau, aber es sind auch Makros in der Option dort auswählbar.Mag sein. Das wird hier aber nicht viel nützen, da Makros sowieso nur vom Compiler expandiert werden.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Re: Zugriff auf Main von innerhalb eines Moduls
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.
Die IDE wird Macros vermutlich nicht auflösen, um deren Inhalt bzgl. Verwendbarkeit in der Autovervollständigung zu untersuchen.
"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.
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.
Re: Zugriff auf Main von innerhalb eines Moduls
@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.
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.
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Re: Zugriff auf Main von innerhalb eines Moduls
Nochmal zur Erinnerung...
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.
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.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.
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.
"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.
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.