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

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

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

Beitrag 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.
Zuletzt geändert von craig22 am Fr, 27.11.2020 18:12, insgesamt 2-mal geändert.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag von erikafuchs »

???? Häh??
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag von craig22 »

Hallo Pit,
???? Häh??
Warum ???? Häh??

Hast Du den Code getestet?
  • Call sString → funktioniert nicht
  • Call Test → funktioniert
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Hiker
******
Beiträge: 591
Registriert: Mo, 08.09.2014 21:34
Wohnort: Berlin

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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
Libre Office 6.3.1 (Win 10 Pro) / Libre Office 6.0.7 (Win8.1 Pro, Win 7 Pro) / AOO (Win 7)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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 

Code: Alles auswählen

'Module2

Sub meinMakro
print "geht"
End Sub
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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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.
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag von craig22 »

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.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Mit einer String-Variablen eine Prozedur aufrufen

Beitrag 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.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Antworten