[gelöst] Sub mittels Array 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] Sub mittels Array aufrufen

Re: [gelöst] Sub mittels Array aufrufen

von TrueColor » Di, 30.07.2013 16:45

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")
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.
[...]denn sonst kann es zu komplikationen kommen die man auf dem ersten Blick nicht sieht und versteht.
Wo wären weitere Stolpersteine? Ich könnt mir nur die Situation vorstellen, wenn Controls und Daten in unterschiedlichen
Blättern liegen.
DPunch hat geschrieben: ist es wirklich sinnvoll / nachvollziehbar, diese simple Änderung gleich an vier Stellen im Quellcode machen zu müssen?
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.

- 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.
Ah, ich sehe, oCell (bei dir: TestBlatt1) hätte ich auch noch als PUBLIC definieren können, das habe ich übersehen.
ein Dreifach-Toggle ist IMO besser als 3 einzelne Buttons, die eine ähnliche Funktionalität haben.
Du weisst schon, das das Markierfeld den 3-Fach status beherrscht?
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.

Ich hab etwas gesucht, was sich irgendwo zwischen Checkbox und Pulldown bewegt.
Viel Erfolg und Spaß beim Basic lernen :).
Danke :-) Wenn sich langsam aber sicher der Erfolg einstellt, dann macht's auch noch Spaß!
Ich werde über die Zeit sich noch öfters mehr oder weniger kluge Fragen stellen :D

Grüße
Robert

Re: [gelöst] Sub mittels Array aufrufen

von balu » Di, 30.07.2013 14:25

Hallo True,
ich stehe erst am Anfang, mich in die Programmierung einzuarbeiten
Und da muss ich dich gleich mal Fragen:

Code: Alles auswählen

ThisComponent.getCurrentController.getActiveSheet.getCellRangeByName("A1")
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")
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.


DPunch hat geschrieben: ist es wirklich sinnvoll / nachvollziehbar, diese simple Änderung gleich an vier Stellen im Quellcode machen zu müssen?
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.

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

ein Dreifach-Toggle ist IMO besser als 3 einzelne Buttons, die eine ähnliche Funktionalität haben.
Du weisst schon, das das Markierfeld den 3-Fach status beherrscht?


Viel Erfolg und Spaß beim Basic lernen :).



Gruß
balu
Dateianhänge
Demo_MultiStateToggleButton_v01_20130730_v2.ods
(9.86 KiB) 120-mal heruntergeladen

Re: Sub mittels Array aufrufen

von TrueColor » Di, 30.07.2013 08:53

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.
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:ist es wirklich sinnvoll / nachvollziehbar, diese simple Änderung gleich an vier Stellen im Quellcode machen zu müssen?
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.

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) 140-mal heruntergeladen

Re: Sub mittels Array aufrufen

von DPunch » Mo, 29.07.2013 19:16

Servus
TrueColor hat geschrieben:Die Arrays stehen für Macro-Pfad, Language und Location?
Nichts dergleichen, diese Informationen werden nur für den qualifizierten URI-Pfad benötigt, um an die Prozedur herankzukommen.
Genaueres zu invoke gibt es hier: API -> Interface XScript -> invoke.
TrueColor hat geschrieben:Dein Vorschlag?
Alternativ könnte man das mit die Fallunterscheidung einbauen(...)
Genau das - 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.
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

von TrueColor » Mo, 29.07.2013 08:49

Hallo DPunch,

nur für mein Verständnis:

Code: Alles auswählen

aCall(i).invoke(Array(),Array(),Array())
Die Arrays stehen für Macro-Pfad, Language und Location?
für sonderlich sinnvoll halte ich die Herangehensweise aber so oder so nicht.
Dein Vorschlag?

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) 133-mal heruntergeladen

Re: Sub mittels Array aufrufen

von DPunch » So, 28.07.2013 18:45

Servus
TrueColor hat geschrieben:Wo liegt der Fehler?
Der Fehler liegt darin, dass eine solche Konstruktion in OOo-Basic nicht existiert, Du kannst nicht einfach so Prozeduren / Funktionen in einem Array speichern.

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) 127-mal heruntergeladen

Re: Sub mittels Array aufrufen

von TrueColor » Fr, 26.07.2013 10:03

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!
Dateianhänge
Demo_MultiStateToggleButton_v00-02_20130726.ods
(10.08 KiB) 109-mal heruntergeladen

Re: Sub mittels Array aufrufen

von Karolus » Do, 25.07.2013 15:00

Hallo
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
Karolus

[gelöst] Sub mittels Array aufrufen

von TrueColor » Do, 25.07.2013 14:23

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!
Dateianhänge
Demo_MultiStateToggleButton_20130725.ods
(9.6 KiB) 128-mal heruntergeladen

Nach oben