Seite 1 von 2
[gelöst] Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Di, 24.11.2020 22:49
von craig22
Hallo,
leider funktioniert folgender Beispielcode nicht, wenn ich die Stringvariable zum Aufruf nutze:
Code: Alles auswählen
Option Explicit
Dim sString as String
Sub Start
sString = "Test"
' funktioniert nicht
Call sString
' funktioniert
' Call Test
End Sub
Sub Test
print "geht"
End Sub
Gibt es eine Möglichkeit, wie man dieses lösen könnte?
z.B. durch irgendeine Umwandlung des Strings, damit der Interpreter damit etwas anfangen kann.
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Di, 24.11.2020 23:07
von erikafuchs
???? Häh??
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Di, 24.11.2020 23:24
von craig22
Hallo Pit,
???? Häh??
Warum ???? Häh??
Hast Du den Code getestet?
- Call sString → funktioniert nicht
- Call Test → funktioniert
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 00:58
von Hiker
Hallo Craig,
Du suchst etwas wie dieses Beispiel in Visual-Basic.
https://docs.microsoft.com/en-us/dotnet ... -procedure
Ob bei AOO/LO dasselbe funktioniert weiss ich nicht.
Mfg, Jörn
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 08:52
von Stephan
Gibt es eine Möglichkeit, wie man dieses lösen könnte?
Eigentlich nein.
Es gibt 2 abenteuerliche Möglichkeiten:
1.
Erstelle zur Laufzeit eine Batchdatei (oder ein Script) welche den Makroaufruf enthält und starte diese Batchdatei. Beispiele dafür sollten sich im Forum finden lassen.
2.
Man könnte in einer Bibliothek ein Makro mit bekanntem Namen zur Laufzeit jeweils passend umbenennen und dann starten.
Beispiel:
Code: Alles auswählen
'Module1
Sub Start
sString = "Test"
BasicLibs = Globalscope.BasicLibraries
Bib = BasicLibs.Getbyname("Standard")
x = Bib.getByName("Module2")
x = Replace(x, "meinMakro", "Test")
Bib.replaceByName("Module2", x)
Call Module2.Test
Hinweis: die Namensänderung des Makros ist in der BasicIDE nicht direkt zu sehen, sondern erst wenn man OO schliesst und erneut öffnet.
Wie geschrieben, ist Beides 'abenteuerlich', wobei 2. auch wenig Sinn macht, denn Du müsstest ja alte und neue Makronamen vorab festlegen um passend umbenennen zu können.
(1. wird in anderem Zusammenhang gelegentlich benötigt, nämlich z.B. wenn man einen Programmierzugriff auf das Betriebssystem machen will, der direkt per StarBasic nicht geht, ist es hilfreich das per VB Script zu tun und das hierzu nötige Skript zur Laufzeit zu erzeugen.)
Gruß
Stephan
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 08:54
von Stephan
???? Häh??
Wieder einmal nur zum Kopfschütteln - es ist eine Frage aufgeworfen die GENAU den Inhalt berührt nach Welchem Du kürzlich selbst fragtest:
https://de.openoffice.info/viewtopic.php?f=18&t=75104
aber Du tust so als wüsstest Du nicht worum es geht.
Stephan
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 12:18
von erikafuchs
Stephan hat geschrieben: Mi, 25.11.2020 08:54
???? Häh??
Wieder einmal nur zum Kopfschütteln - es ist eine Frage aufgeworfen die GENAU den Inhalt berührt nach Welchem Du kürzlich selbst fragtest:
aber Du tust so als wüsstest Du nicht worum es geht.
Stephan
Ok, das stimmt. Entschuldigung! craig22 hat meine Frage nur nochmals anders gestellt.
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 18:08
von F3K Total
Moin,
ist zwar nicht das gleiche, sollte aber hinreichen, oder?
Code: Alles auswählen
Sub Start_Makro_per_String
sMacroName = inputbox ("Bitte Namen eingeben", "Eingabe",)
get_Macro(sMacroName)
End Sub
sub get_Macro(sMacroName)
select case sMacroName
case "M1"
M1
case "M2"
M2
case "M3"
M3
case "M4"
M4
case "M5"
M5
end select
end sub
sub M1
msgbox "Makro1"
end sub
sub M2
msgbox "Makro2"
end sub
sub M3
msgbox "Makro3"
end sub
sub M4
msgbox "Makro4"
end sub
sub M5
msgbox "Makro5"
end sub
Gruß R
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 18:50
von erikafuchs
Na ja, das war ja eigentlich mein Originalcode - den wollte ich halt "elganter" gestalten - siehe hier:
https://de.openoffice.info/viewtopic.ph ... 49#p292549
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 21:29
von craig22
Hallo,
vielen Dank für Eure Antworten.
@Stephan
Ich habe auf verschiedenste Weise mit Deiner 2. Methode experimentiert.
Dein Code funktioniert, sofern sich nur eine Sub-Routine im Modul2 befindet.
Meine Frage habe ich absichtlich in Kurzform gestellt, weil ich gehofft hatte, dass es ein Interface,
einen Service oder sonstiges gibt, mit dem ich die Stringvariable in eine Anweisung umwandeln kann.
Es scheint eine unüberwindbare Hürde für Basic zu sein.
Inhalt von Modul2, wobei in Modul1 die Variable "sAufgabe" mit Public deklariert wurde:
Code: Alles auswählen
REM ***** BASIC *****
REM Dieses Modul soll alle Aufgaben beinhalten
Sub Aufg_01
Msgbox sAufgabe
End Sub
Sub Aufg_02
Msgbox sAufgabe
End Sub
Sub Aufg_03
Msgbox sAufgabe
End Sub
Mittels XRAY kann ich mir zwar den gesamten Inhalt als Plaintext anzeigen lassen, aber es gibt offensichtlich
keine Methode, mit der ich direkt auf die einzelnen Sub's zugreifen kann.
Ich schließe diesen Beitrag und
poste hier meinen leider nicht komplett funktionierden Code.
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 21:41
von Stephan
Mittels XRAY kann ich mir zwar den gesamten Inhalt als Plaintext anzeigen lassen, aber es gibt offensichtlich
keine Methode, mit der ich direkt auf die einzelnen Sub's zugreifen kann.
ja, stimmt. Vielleicht hätte ich "bekannten" Namen mehr betonen sollen, gemeint war einen eineindeutigen Namen zu nutzen damit dieser nur einmal als Wort im ganzen Modul vorkommt, denn dann ist das Ändern per Replace leicht (was nicht heisst das es sonst nicht ginge).
Am Simpelsten wäre es die Makronamen einfach mit einem x zu ergänzen, z.B. "Aufg_01x", dann ist klar was im Replace stehen muss, nämlich als zu ersetzen der eigentlich gewünschte Name plus "x":
Code: Alles auswählen
x = Bib.getByName("Module2")
x = Replace(x, "Aufg_01x", "Aufg_01")
Gruß
Stephan
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Mi, 25.11.2020 23:28
von craig22
Hallo Stephan,
wenn ich wie in Deinem Beispiel hier explizit
.Test angeben, dann wird die Routine "Test" aufgerufen.
.Test ist eine feste Vorgabe, sollte aber variabel sein.
Ich lade im anderen Thread meine Beispieldatei hoch, dort wird die Problematik erkennbar sein.
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Do, 26.11.2020 00:15
von Stephan
Ja, Du hast REcht.
Versuche es so (nicht getestet):
Code: Alles auswählen
'Module1
Sub Start
sString = "Test"
Call Module1.Start2(sString, 0)
Call Module2.Start3
Call Module1.Start2(sString, 1)
End Sub
Sub Start2(par, modus)
BasicLibs = Globalscope.BasicLibraries
Bib = BasicLibs.Getbyname("Standard")
x = Bib.getByName("Module2")
if modus = 0 Then
x = Replace(x, "Call Module2.X", "Call Module2." & par)
elseif modus = 1 Then
x = Replace(x, "Call Module2." & par, "Call Module2.X")
end if
Bib.replaceByName("Module2", x)
End Sub
Code: Alles auswählen
'Module2
Sub Start3
Call Module2.X
End Sub
Sub Test
print "geht"
End Sub
Aber ich halte weiterhin diese Art der Lösung für abenteuerlich und würde das nicht so verwenden wollen.
Gruß
Stephan
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Do, 26.11.2020 09:23
von Stephan
Aber ich halte weiterhin diese Art der Lösung für abenteuerlich und würde das nicht so verwenden wollen.
Sofern die Frage aufkommt was ich bervorzugen würde:
Code: Alles auswählen
Sub Start
sString = "Test"
Start2(sString )
End Sub
Sub Start2(par)
Select Case par
Case "Test"
'... tue etwas
End Select
End Sub
Gruß
Stephan
Re: Mit einer String-Variablen eine Prozedur aufrufen
Verfasst: Do, 26.11.2020 18:12
von craig22
Hallo Stephan,
Stephan hat geschrieben:Sofern die Frage aufkommt was ich bervorzugen würde:
Nun dies war der Ausgangspunkt für meine Anfrage:
Meine Anfrage bewegt sich in der Grauzone zu einem Crossposting.
Routinenname mit Variablen starten
Die Case-Anweisung sollte nach Pit’s Wunsch ggf. wegfallen oder einfacher strukturiert werden. Wie auch immer?
Ich habe meine Frage halt nur etwas anders gestellt, in der Hoffnung, dass es eine Konvertierungs-
möglichkeit für eine String-Variable gibt, so das der Interpreter es versteht.
bisheriges Fazit:
Basic kann es nicht.
Ein letzte Frage in diesem Zusammenhang:
Wenn ich eine Call-Anweisung in einem Modulblatt schreibe,
HelloWorld
ist dies im Prinzip auch ein String.
Ich weiß das der Interpreter den Code zur Laufzeit in Maschinensprache übersetzt.
Welche Mechanismen des Interpreters greifen hier, damit er dies als
Anweisung und nicht als
String verarbeitet?
Habe bereits im Netz versucht Info’s zu finden. Mir fehlen hier die richtigen Suchbegriffe.