[gelöst] Sub mittels Array aufrufen
Moderator: Moderatoren
[gelöst] Sub mittels Array aufrufen
Hallo,
erstmals Sorry für den schlechten Titel, aber ich habe keine Ahnung, wie ich das besser ausdrücken soll (deshalb bekomme ich wohl auch keine tauglichen Suchergebnisse).
Wie kann ich Subs aufrufen, deren Namen in einem Array gelistet sind?
call aCall(i) bringt immer "Eigenschaft oder Methode nicht gefunden". Das deutet wohl darauf hin, dass die Werte aus dem Array nicht oder nicht richtig mit dem Call verarbeitet werden.
Ich hab die Datei mal angehängt, hat keinen tieferen Sinn, wollte nur ne fixe Idee ausprobieren.
Vielen Dank!
erstmals Sorry für den schlechten Titel, aber ich habe keine Ahnung, wie ich das besser ausdrücken soll (deshalb bekomme ich wohl auch keine tauglichen Suchergebnisse).
Wie kann ich Subs aufrufen, deren Namen in einem Array gelistet sind?
call aCall(i) bringt immer "Eigenschaft oder Methode nicht gefunden". Das deutet wohl darauf hin, dass die Werte aus dem Array nicht oder nicht richtig mit dem Call verarbeitet werden.
Ich hab die Datei mal angehängt, hat keinen tieferen Sinn, wollte nur ne fixe Idee ausprobieren.
Vielen Dank!
- Dateianhänge
-
- Demo_MultiStateToggleButton_20130725.ods
- (9.6 KiB) 127-mal heruntergeladen
Zuletzt geändert von TrueColor am Di, 30.07.2013 08:53, insgesamt 1-mal geändert.
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
Re: Sub mittels Array aufrufen
Hallo
Ohne mir deinen Code angeschaut zu haben, folgendes tut was ich erwarte:
Karolus
Ohne mir deinen Code angeschaut zu haben, folgendes tut was ich erwarte:
Code: Alles auswählen
Sub Main
container = array(blah, spam, ham)
for i = 0 to ubound(container)-1
container(i)
next
End Sub
sub blah
msgbox( "hallo")
end sub
sub spam
msgbox( "spam")
end sub
sub ham
msgbox ( "ham ")
end sub
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Re: Sub mittels Array aufrufen
Ok, mein Fehler war, dass ich das Array nicht als Array dimensioniert und den Inhalt des Arrays als String gehandhabt hatte. Jetzt ist die Fehlermeldung weg.
Nachdem ich jetzt noch MsgBoxes in die über das Array aufzurufenden Subs eingebaut habe, konnte ich feststellen, dass nicht nur die Prozedur mit dem entsprechendem Index, sondern alle nacheinander aufgerufen werden, obwohl ich keine einzige Schleife drin habe. Wo liegt der Fehler?
Ich habe die neue Datei drangehängt.
Vielen Dank!
Nachdem ich jetzt noch MsgBoxes in die über das Array aufzurufenden Subs eingebaut habe, konnte ich feststellen, dass nicht nur die Prozedur mit dem entsprechendem Index, sondern alle nacheinander aufgerufen werden, obwohl ich keine einzige Schleife drin habe. Wo liegt der Fehler?
Ich habe die neue Datei drangehängt.
Vielen Dank!
- Dateianhänge
-
- Demo_MultiStateToggleButton_v00-02_20130726.ods
- (10.08 KiB) 108-mal heruntergeladen
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
Re: Sub mittels Array aufrufen
Servus
Du hast die Möglichkeit, per Umweg über den SciptProvider an Deine Prozeduren zu kommen (siehe Anhang), für sonderlich sinnvoll halte ich die Herangehensweise aber so oder so nicht.
Der Fehler liegt darin, dass eine solche Konstruktion in OOo-Basic nicht existiert, Du kannst nicht einfach so Prozeduren / Funktionen in einem Array speichern.TrueColor hat geschrieben:Wo liegt der Fehler?
Du hast die Möglichkeit, per Umweg über den SciptProvider an Deine Prozeduren zu kommen (siehe Anhang), für sonderlich sinnvoll halte ich die Herangehensweise aber so oder so nicht.
- Dateianhänge
-
- Demo_MultiStateToggleButton_v00-02_20130726.ods
- (10.22 KiB) 126-mal heruntergeladen
Re: Sub mittels Array aufrufen
Hallo DPunch,
nur für mein Verständnis:
Alternativ könnte man das mit die Fallunterscheidung einbauen. Ich hielt den Weg mit den Arrays aber für lesbarer und einfacher anzupassen. Aber jetzt, nachdem ich nochmal drüber nachgedacht habe, ist das nicht so schlecht, muss ich nicht mal mit dem Index rummachen.
Danke!
nur für mein Verständnis:
Die Arrays stehen für Macro-Pfad, Language und Location?Code: Alles auswählen
aCall(i).invoke(Array(),Array(),Array())
Dein Vorschlag?für sonderlich sinnvoll halte ich die Herangehensweise aber so oder so nicht.
Alternativ könnte man das mit die Fallunterscheidung einbauen. Ich hielt den Weg mit den Arrays aber für lesbarer und einfacher anzupassen. Aber jetzt, nachdem ich nochmal drüber nachgedacht habe, ist das nicht so schlecht, muss ich nicht mal mit dem Index rummachen.
Danke!
- Dateianhänge
-
- Demo_MultiStateToggleButton_v00-03_20130729.ods
- ohne Arrays
- (9.75 KiB) 132-mal heruntergeladen
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
Re: Sub mittels Array aufrufen
Servus
Genaueres zu invoke gibt es hier: API -> Interface XScript -> invoke.
Fass die Prozeduren zusammen und mach dort eine Fallunterscheidung bezüglich der zu setzenden Werte.
Denk mal einen Schritt weiter und stell Dir vor, Du würdest gerne in Zelle A2 statt A1 schreiben (oder noch besser: jemand anderes sitzt an Deinem Code und möchte nun in Zelle A2 statt A1 schreiben)... ist es wirklich sinnvoll / nachvollziehbar, diese simple Änderung gleich an vier Stellen im Quellcode machen zu müssen?
Nichts dergleichen, diese Informationen werden nur für den qualifizierten URI-Pfad benötigt, um an die Prozedur herankzukommen.TrueColor hat geschrieben:Die Arrays stehen für Macro-Pfad, Language und Location?
Genaueres zu invoke gibt es hier: API -> Interface XScript -> invoke.
Genau das - Du hast nun vier Prozeduren, die alle den gleichen Zweck erfüllen und sich lediglich darin unterscheiden, welche Werte gesetzt werden sollen.TrueColor hat geschrieben:Dein Vorschlag?
Alternativ könnte man das mit die Fallunterscheidung einbauen(...)
Fass die Prozeduren zusammen und mach dort eine Fallunterscheidung bezüglich der zu setzenden Werte.
Denk mal einen Schritt weiter und stell Dir vor, Du würdest gerne in Zelle A2 statt A1 schreiben (oder noch besser: jemand anderes sitzt an Deinem Code und möchte nun in Zelle A2 statt A1 schreiben)... ist es wirklich sinnvoll / nachvollziehbar, diese simple Änderung gleich an vier Stellen im Quellcode machen zu müssen?
Re: Sub mittels Array aufrufen
Die 4 Prozeduren sind in diesem Fall nur Platzhalter, damit ich die Funktionalität des Buttons testen konnte. Hier könnten dann durchaus völig unterschiedliche Prozeduren stehen.DPunch hat geschrieben:Du hast nun vier Prozeduren, die alle den gleichen Zweck erfüllen und sich lediglich darin unterscheiden, welche Werte gesetzt werden sollen.
Fass die Prozeduren zusammen und mach dort eine Fallunterscheidung bezüglich der zu setzenden Werte.
Da stimme ich dir zu! Habe jetzt eine Public Variable verwendet, in der das Target hinterlegt ist. Die Subs komplett zusammenzufassen würde meiner Meinung nach den Zweck des Ganzen unterlaufen. Für mich war das Projekt zum Einen, um diese Idee überhaupt auszuprobieren (ich stehe erst am Anfang, mich in die Programmierung einzuarbeiten), zum Anderen, eine Vorlage zu schaffen, von der ich später mal abschreiben kann, wenn ich das benötige. Z.B ein Dreifach-Toggle ist IMO besser als 3 einzelne Buttons, die eine ähnliche Funktionalität haben.DPunch hat geschrieben:ist es wirklich sinnvoll / nachvollziehbar, diese simple Änderung gleich an vier Stellen im Quellcode machen zu müssen?
Hab die Datei nochmal angehängt. Konnte noch ein wenig optimieren, indem ich das Tag rausgeworfen habe. Da ich das Label eh ändere, kann ich das auch damit arbeiten.
Vielen Dank für eure Hilfe, DPunch und Karolus!
- Dateianhänge
-
- Demo_MultiStateToggleButton_v01_20130730.ods
- (9.75 KiB) 139-mal heruntergeladen
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
Re: [gelöst] Sub mittels Array aufrufen
Hallo True,
Weisst Du was Du da machst, beziehungsweise warum arbeitest Du mit dem ActiveSheet?
Warum machst Du das nicht so rum?
Beide Methoden führen zum Ziel. Und beide haben ihre Daseinsberechtigung. Aber man sollte schon wissen wann man was anwendet, denn sonst kann es zu komplikationen kommen die man auf dem ersten Blick nicht sieht und versteht.
- Deklariere die Variable ganz am Anfang des Moduls.
- Defeniere die Variable in der Haupt-Sub, so das Du in den aufgerufenen Subs das ganze nicht noch mal machen musst, was Du ja wiederum gemacht hattest.
Schau dir meine Änderungen an, und dann müsstest Du verstehen wie das gemeint ist.
Viel Erfolg und Spaß beim Basic lernen
.
Gruß
balu
Und da muss ich dich gleich mal Fragen:ich stehe erst am Anfang, mich in die Programmierung einzuarbeiten
Code: Alles auswählen
ThisComponent.getCurrentController.getActiveSheet.getCellRangeByName("A1")
Warum machst Du das nicht so rum?
Code: Alles auswählen
ThisComponent.sheets.getByName("Sheet1").getCellRangeByName("A1")
Und was DPunch damit meinte ist eigentlich wohl doch etwas anders gemeint als Du es jetzt in die Tat umgesetzt hast. Ich seh das nämlich so.DPunch hat geschrieben: ist es wirklich sinnvoll / nachvollziehbar, diese simple Änderung gleich an vier Stellen im Quellcode machen zu müssen?
- Deklariere die Variable ganz am Anfang des Moduls.
- Defeniere die Variable in der Haupt-Sub, so das Du in den aufgerufenen Subs das ganze nicht noch mal machen musst, was Du ja wiederum gemacht hattest.
Schau dir meine Änderungen an, und dann müsstest Du verstehen wie das gemeint ist.
Du weisst schon, das das Markierfeld den 3-Fach status beherrscht?ein Dreifach-Toggle ist IMO besser als 3 einzelne Buttons, die eine ähnliche Funktionalität haben.
Viel Erfolg und Spaß beim Basic lernen

Gruß
balu
- Dateianhänge
-
- Demo_MultiStateToggleButton_v01_20130730_v2.ods
- (9.86 KiB) 119-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.
wehr rächtschraipfähler findet khan si behalden
wehr rächtschraipfähler findet khan si behalden

Re: [gelöst] Sub mittels Array aufrufen
Weil bei mir i.d.R. die Macros in dem Sheet ausgeführt werden, wo die Buttons liegen. UNd das Projekt, wo ich das neue Macro als Erstes einbauen will, enthält 2 ähnliche Sheets, mit den gleichen Controls, die sich nur in den Daten unterscheiden. In diesem Fall ist es IMHO unsinnig, noch eine Abfrage des Blattnamens einzubauen.balu hat geschrieben:Weisst Du was Du da machst, beziehungsweise warum arbeitest Du mit dem ActiveSheet?
Warum machst Du das nicht so rum?Code: Alles auswählen
ThisComponent.sheets.getByName("Sheet1").getCellRangeByName("A1")
Wo wären weitere Stolpersteine? Ich könnt mir nur die Situation vorstellen, wenn Controls und Daten in unterschiedlichen[...]denn sonst kann es zu komplikationen kommen die man auf dem ersten Blick nicht sieht und versteht.
Blättern liegen.
Ah, ich sehe, oCell (bei dir: TestBlatt1) hätte ich auch noch als PUBLIC definieren können, das habe ich übersehen.Und was DPunch damit meinte ist eigentlich wohl doch etwas anders gemeint als Du es jetzt in die Tat umgesetzt hast. Ich seh das nämlich so.DPunch hat geschrieben: ist es wirklich sinnvoll / nachvollziehbar, diese simple Änderung gleich an vier Stellen im Quellcode machen zu müssen?
- Deklariere die Variable ganz am Anfang des Moduls.
- Defeniere die Variable in der Haupt-Sub, so das Du in den aufgerufenen Subs das ganze nicht noch mal machen musst, was Du ja wiederum gemacht hattest.
Schau dir meine Änderungen an, und dann müsstest Du verstehen wie das gemeint ist.
Ja, die TriState-Checkbox hätte sogar für meinen ersten Anwendungsfall gereicht, hatte ich aber verworfen, weil 8 Checkboxen und die neunte als TriState sah... naja... nicht so toll aus.Du weisst schon, das das Markierfeld den 3-Fach status beherrscht?ein Dreifach-Toggle ist IMO besser als 3 einzelne Buttons, die eine ähnliche Funktionalität haben.
Ich hab etwas gesucht, was sich irgendwo zwischen Checkbox und Pulldown bewegt.
DankeViel Erfolg und Spaß beim Basic lernen.

Ich werde über die Zeit sich noch öfters mehr oder weniger kluge Fragen stellen

Grüße
Robert
System:
LibO 6 + LibO 7
LibO 6 + LibO 7