[gelöst] Mit einer String-Variablen eine Prozedur aufrufen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst] Mit einer String-Variablen eine Prozedur aufrufen

Re: Mit einer String-Variablen eine Prozedur aufrufen

von craig22 » Fr, 27.11.2020 18:12

Hallo,
das Probelm ist aus meiner Sicht gelöst.
Ich fand endlich den passenden Suchbegriff und siehe da, es funktioniert.

Dazu lade ich im anderen Thread meine geänderte Beispieldatei hoch.
https://de.openoffice.info/viewtopic.ph ... 29#p292629

Die entscheidenden Zauberwörter lauten:

Code: Alles auswählen

Service "MasterScriptProviderFactory"
Interface "XScriptInvocationContext"
Auf vielen Umwegen im englischen Forum gefunden.
Siehe Antwort von Hanya:
https://forum.openoffice.org/en/forum/v ... 9&p=365392

Re: Mit einer String-Variablen eine Prozedur aufrufen

von Stephan » Fr, 27.11.2020 08:28

Vielleicht gibt es noch eine Möglichkeit den String mit einer andere Programmiersprache zu verarbeiten.
Wie bereits geschrieben ginge eine Batch-Datei oder ein Script, welche man zur Laufzeit erzeugt.

Beides würde unter Windows funktionieren, dürfte aber unter Linux, wegen der Ausführungsrechte, auf Probleme stossen.


Gruß
Stephan

Re: Mit einer String-Variablen eine Prozedur aufrufen

von Stephan » Fr, 27.11.2020 08:13

Nun dies war der Ausgangspunkt für meine Anfrage:
Weswegen ich es ausdrücklich gekennzeichnet hatte (="was ich bevorzugen würde") das es keine Antwort auf Deine Frage ist, sondern nur eine Erläuterung meiner Aussage.
Die Case-Anweisung sollte nach Pit’s Wunsch ggf. wegfallen oder einfacher strukturiert werden.
WENN Letzteres so wäre, wäre das von mir Gesagte zufällig doch eine Antwort, denn mein Beispiel geht davon aus sich die ganzen Einzelmakros zu sparen, was ja, zumindest nach Pit's Logik, als Vereinfachung gilt, da es jeweils 2 Code-Zeilen einspart.

Nebenbeigesagt könnte man es auch optisch anders schreiben, das es ähnlich aussieht als wären es doch einzelne Makros, sofern das jemand besser fände:

Code: Alles auswählen

		Sub Start2(par)
			  Select Case par
    



   Case "Test"
      '... tue etwas



   Case '....
      '...





			  End Select
			End Sub

Wnnn Du hierbei Sub .... Select und End .... End soweit nach rechts rückst das sie 'außerhalb' der Sichtbarkeit in der Basic-IDE sind, sieht es (nach meinem Empfinden) so aus als wäre die Case-Abschnitte einzelne Makros.

ist dies im Prinzip auch ein String.


Nö, denn es ist nicht per Anführungszeichen als String gekennzeichnet.

Welche Mechanismen des Interpreters greifen hier, damit er dies als Anweisung und nicht als String verarbeitet?
Der Interpreter muss im gesamten 'Gültigkeitsbereich' des Makros prüfen ob es keine Makros oder Funktionen gleichen Namens gibt. Da es zur Laufzeit, generell(*) aber auch abhängig von den aktuell geladenen Bibliotheken, hierbei 'Uneindeutigkeiten' geben kann ist es zweckmäßig den Modulnamen beim Aufruf eines Makros immer davor zu schreiben, also Call meinModul.meinMakro und nicht nur Call meinMakro.

(*)
denn es darf in unterschiedlichen Modulen gleichnamige Makros geben



Gruß
Stephan

Re: Mit einer String-Variablen eine Prozedur aufrufen

von Hiker » Fr, 27.11.2020 07:48

erikafuchs hat geschrieben: Fr, 27.11.2020 00:10 Ist den Python in OpenOffice implementiert oder benötigt man das extern? Mein Rechentrainer muss unabhängig von externem Zubehör laufen.
Ich kann mir aber nicht so recht vorstellen, was Python mehr zurückliefern könnte als eine Variable - ...
Hallo,

Ein eindeutiges sowohl als auch. Unter Windows wird eine Python-Umgebung "unterhalb" von AOO/LO mitgeliefert. Unter Linux gibt es eine solche schon extern und so wird daher teilweise das externe Python bei LO eingebunden. LO ist auch schon komplett bei Python3, ob AOO noch bei Python2 hängt, weiss ich nicht.
Egal wie: Es ist immer vorhanden.

Was die eigentliche Frage angeht, kommen wir hier in Bereiche, wo ich sagen würde, dass man das heute nicht mehr so macht. Wenn Eingabetext quasi direkt den Quelltext modifiziert/beeinflusst kommen wir direkt zu Bobby Tables https://xkcd.com/327/

Ich habe zu DOS-Zeiten auch Batch-Files geschrieben, die den Folgebefehl modifizierten, aber aber bei den damaligen eingeschränkten Möglichkeiten musste man halt kreativ werden. Ohne echte Notwendigkeit und Sicherheitsprüfungen ist ein

Code: Alles auswählen

CALL "Name"+Var
heute nicht zeitgemäß, sondern Basis für SQL- Injection und ähnliches.

Mfg, Jörn

Re: Mit einer String-Variablen eine Prozedur aufrufen

von erikafuchs » Fr, 27.11.2020 00:10

Ist den Python in OpenOffice implementiert oder benötigt man das extern? Mein Rechentrainer muss unabhängig von externem Zubehör laufen.
Ich kann mir aber nicht so recht vorstellen, was Python mehr zurückliefern könnte als eine Variable - der Code muss ja nun mal in Basic aufgerufen werden.
Ein Handbuch von Python habe ich, bin aber noch kaum über die ersten Seiten rausgekommen.
Aber ansonsten finde ich das ausergewöhnlich wie du dich hier reinkniest - wie gesagt, es geht auch ohne.

Re: Mit einer String-Variablen eine Prozedur aufrufen

von craig22 » Do, 26.11.2020 18:47

Vielleicht gibt es noch eine Möglichkeit den String mit einer andere Programmiersprache zu verarbeiten.
Python oder Java, diese sind ewas "schlauer" als Basic.
Ganz simpel gedacht:
  • Basic übergibt Python den String
  • Python konvertiert String in eine Anweisung
  • Python ruft per Anweisung die passende Routine auf.
  • weiter geht es in Basic
Habe hierzu aber auch noch nichts finden können. :(

Re: Mit einer String-Variablen eine Prozedur aufrufen

von erikafuchs » Do, 26.11.2020 18:30

Meine Idee war ja eigentlich, dass ich dem

Code: Alles auswählen

call Aufgabe
anstelle eines Parameters ein Art Anhängsel hinzufüge also

Code: Alles auswählen

call Aufgabe&Variable
und dieses variiere.
Ich habe vor 40 Jahren mal dBaselllPlus programmiert und hatte wage in Erinnerung dass das dort ging.
Aber das scheint nun mal hier nicht zu funktionieren. Dies ist ja auch kein Beinbruch, mein Code funktioniert ja, es sind jetzt halt etwa 100 Zeilen mehr.

Re: Mit einer String-Variablen eine Prozedur aufrufen

von craig22 » Do, 26.11.2020 18:12

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.

Re: Mit einer String-Variablen eine Prozedur aufrufen

von Stephan » Do, 26.11.2020 09:23

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

von Stephan » Do, 26.11.2020 00:15

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

von craig22 » Mi, 25.11.2020 23:28

Hallo Stephan,

wenn ich wie in Deinem Beispiel hier explizit .Test angeben, dann wird die Routine "Test" aufgerufen.

Code: Alles auswählen

Call Module2.Test
.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

von Stephan » Mi, 25.11.2020 21:41

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

von craig22 » Mi, 25.11.2020 21:29

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

von erikafuchs » Mi, 25.11.2020 18:50

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

von F3K Total » Mi, 25.11.2020 18:08

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

Nach oben