Kombinationsfeld - Ausgewählten Eintrag in einen String schreiben

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

Moderator: Moderatoren

Jens aus Tornesch
Beiträge: 5
Registriert: Mi, 13.07.2016 21:13

Kombinationsfeld - Ausgewählten Eintrag in einen String schreiben

Beitrag von Jens aus Tornesch »

Moin,
seit mehreren Tagen brüte ich über dem Problem.

Ich habe folgendes erstellt:
Einen Dialog mit dem Namen: "Generationenschiessen"
Ein Kominationsfeld mit dem Namen: "cbbGanzerName"
Eine Schaltfläche mit dem Namen: "cmdHinzu"

Mit der Schaltfläche cmdHinzu rufe ich das folgende Makro auf:

Code: Alles auswählen

Sub Mannschaften
dim oFeld
dim oAuswahl
dim Starter as String	
DialogLibraries.loadLibrary("Standard")
oStandard = DialogLibraries.getByName("Standard")
oAuswahl = oStandard.getByName("Generationenschiessen")
oAuswahl = CreateUnoDialog(oAuswahl)
oFeld = oAuswahl.getModel().getbyname("cbbGanzerName")

Starter = oFeld.GetItemText()

MsgBox Starter
Das Problem ist nun, dass es einfach nicht funtioniert die Variable "Starter" mit dem im Kombinationsfeld ausgewälten Text zu füllen.
In dem Kombinationsfeld befinden sich etwa 130 Einträge.
Erstetze ich die Zeile:

Code: Alles auswählen

Starter = oFeld.GetItemText()
durch:

Code: Alles auswählen

Starter = oFeld.Text
so gibt mit die MsgBox den in den Eigenschaften vergebenen Namen des Kombinationsfeldes aus.
Lasse ich dieses Feld in den Eigenschaften leer, ist auch die MsgBox leer.

Ich habe auch schon andere Methoden, die ich mit der Methode dbg_methods ausgelesen habe versucht, bekomme aber nur Fehlermeldungen.
Meistens diese: arguments len differ

Wer kann mir helfen?
Viele Grüße Jens
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Kombinationsfeld - Ausgewählten Eintrag in einen Strimg schreiben

Beitrag von Stephan »

Das Problem ist nun, dass es einfach nicht funtioniert die Variable "Starter" mit dem im Kombinationsfeld ausgewälten Text zu füllen.
mmh, wenn es stimmt das DEin Makro "Sub Mannschaften" mit der Schaltfläche aufgerufen wird die auf dem Dialog ist der bereits vorher aufgerufen wurde ist doch der Code falsch, da der gepostete Code jetzt nochmals den Dialog initialisiert der bereits sichtbar ist.(?)
(Ich weiß auch nicht ob die Einträge für das Kombinationsfeld direkt eiungetragen sind (bei 130 wohl eher nicht) oder extra geladen werden)

Oder hast Du hier nur das falsche Makro gepostet?

Kannst Du eine Datei mit dem Makro und Dialog hochladen?



GRuß
Stephan
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Kombinationsfeld - Ausgewählten Eintrag in einen Strimg schreiben

Beitrag von balu »

Hallo Jens,

Code: Alles auswählen

dim oFeld
dim oAuswahl
Bei einem Dialog ist das gar nicht gut das Du diesen Variablen keinen Typ zuordnest.
Wenn ich das richtig sehe, dann müssten das wohl Objekte sein. Und da Du ja mit Dialog arbeitest, sollte die deklaration der Variablen ganz am Anfang im Modul oben eingetragen werden, und danach erst die eigentliche Sub. Das würde dann also so aussehen.

Code: Alles auswählen

dim oFeld as Object
dim oAuswahl as Object
dim Starter as String
Sub Mannschaften

Das nächste Problem, Fehler.

Code: Alles auswählen

DialogLibraries.loadLibrary("Standard")
oStandard = DialogLibraries.getByName("Standard")
oAuswahl = oStandard.getByName("Generationenschiessen")
oAuswahl = CreateUnoDialog(oAuswahl)
oFeld = oAuswahl.getModel().getbyname("cbbGanzerName")
oAuswahl = CreateUnoDialog(oAuswahl) <= Das geht nicht gut.

Versuchs mal so rum.

Code: Alles auswählen

    DialogLibraries.loadLibrary("Standard")
    oGenerationenDlg = CreateUnoDialog(DialogLibraries.Standard.Generationenschiessen)
    oGanzerName = oGenerationenDlg.getModel().getbyname("cbbGanzerName")
 
Jetzt müssten dann aber ein paar Variablen hinzugefügt, oder anders benannt werden. Wichtig, als Erfahrungswert, weise den Elementen einen aussagefähigeren Namen hinzu, und das am besten so, das Du auch sofort erkenst ob es sich um eine Variable für einen Dialogelement handelt.

Deshalb habe ich nicht oAuswahl, sondern oGenerationenDlg geschrieben.
Und auch nicht einfach oFeld, sondern oGanzerName.
Ist aber nur ein Vorschlag meinerseits. Aber probiere jetzt mal den geänderten Code aus.

Code: Alles auswählen

dim oGenerationenDlg as Object
dim oGanzerName as Object
dim Starter as String

Sub Mannschaften
    DialogLibraries.loadLibrary("Standard")
    oGenerationenDlg = CreateUnoDialog(DialogLibraries.Standard.Generationenschiessen)
    oGanzerName = oGenerationenDlg.getModel().getbyname("cbbGanzerName")

Starter = oGanzerName.GetItemText()

MsgBox Starter

Sollte das auch nicht funktionieren, dann häng bitte eine Beispieldatei hier an, damit wir uns den Code und den Dialog genauer anschauen können.



Gruß
balu
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 :D
Jens aus Tornesch
Beiträge: 5
Registriert: Mi, 13.07.2016 21:13

Re: Kombinationsfeld - Ausgewählten Eintrag in einen Strimg schreiben

Beitrag von Jens aus Tornesch »

Hallo,
vielen Dank für die Hilfe balu.
Mit dem von Dir geposteten Code bekomme ich die Fehlermeldung:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.lang.IllegalArgumentException
Message: arguments len differ!.

Ich poste die Dateien mal.
Die Datei "Start SV Tornesch" ruft beim Start das Makro "Startdialog" auf.
Damit startet der Dialog "Auswahl"
Auf diesem befindet sich die Schaltfläche mit dem Tiltel "Generationen", sie heißt "cmdGenSchiessen"
Hinterlegt ist das Makro "Generationenschiessen", das folgende Schritte ausführt:
1. Aufruf des Dialoges "Generationenschiessen"
2. Öffnen der Datei "Daten_SV-Tornesch.ods" und einlesen der Namen für die Kombobox "cbbGanzerName"
3. Öffnen einer weiteren Datei "Generation2016.ods" um eine weitere Combobox zu füllen. - Diese ist nicht gepostet
Dann wird der Dialog angezeigt.
Nun sollte eigentlich in der Combobox ein Name ausgewählt werden und dann mit der Schaltfläche in den String übertragen werden.


Dies ist der gesamte Code:

Code: Alles auswählen

REM  *****  BASIC  *****
Dim oDocument
Dim oAuswahl
Dim oFeld
Sub Startdialog REM Variablen zum Start des Dialoges "Auswahl" festlegen
REM 1. Auslesen Dialogname
REM 2. Zuweisen Dialogname an Variable
REM 3. Sub "dialogaufrufen" mit Variablen starten
REM Variablen = Dialogname

oDatei = thiscomponent
oBlatt = oDatei.sheets("Beschreibung")
oZelle = oBlatt.getcellrangebyname("H2")
Dialogname = oZelle.string
DialogLibraries.loadLibrary("Standard")
oStandard = DialogLibraries.getByName("Standard")
call dialogaufrufen(Dialogname)
End Sub

REM -----------------------------------------------------------------------------------------------------------------------------
Sub Generationenschiessen REM Variablen zum Start des Dialoges "Generationenschiessen" festlegen
REM 1. Auslesen Dialogname
REM 2. Zuweisen Dialogname an Variable
REM 3. Sub "dialogaufrufen" mit Variablen starten
REM Variablen = Dialogname

oDatei = thiscomponent
oBlatt = oDatei.sheets("Beschreibung")
oZelle = oBlatt.getcellrangebyname("H5")
Dialogname = oZelle.string
DialogLibraries.loadLibrary("Standard")
oStandard = DialogLibraries.getByName("Standard")
Call dialogaufrufen(Dialogname)
Call Datenbank


End Sub
REM -----------------------------------------------------------------------------------------------------------------------------

Sub Datenbank REM Variablen zum öfnnen der Datenbankdatei "Daten_SV-Tornesch.ods" festlegen und Datei öffnen
REM 1. Auslesen Dialogname
REM 2. Zuweisen Dialogname an Variable
REM 3. Sub "dialogaufrufen" mit Variablen starten
REM Variablen = Dialogname

oDatei = thiscomponent
oBlatt = oDatei.sheets("Beschreibung")
oZelle = oBlatt.getcellrangebyname("B2")
Dateipfad = oZelle.string
DialogLibraries.loadLibrary("Standard")
oStandard = DialogLibraries.getByName("Standard")
call DateiOeffnen(Dateipfad)

End Sub
REM -----------------------------------------------------------------------------------------------------------------------------
Sub ListeGen REM Variablen zum öfnnen der Datenbankdatei "Generation2016.ods" festlegen und Datei öffne
REM 1. Auslesen Dialogname
REM 2. Zuweisen Dialogname an Variable
REM 3. Sub "dialogaufrufen" mit Variablen starten
REM Variablen = Dialogname

oDatei = thiscomponent
oBlatt = oDatei.sheets("Beschreibung")
oZelle = oBlatt.getcellrangebyname("B4")
Dateipfad = oZelle.string
DialogLibraries.loadLibrary("Standard")
oStandard = DialogLibraries.getByName("Standard")
call DateiOeffnen(Dateipfad)

End Sub
REM -----------------------------------------------------------------------------------------------------------------------------
REM ---- Sub-Routinen die immer wieder benötigt werden --------


Sub dialogaufrufen(Dialogname)
Dim oAuswahl 'Dialog, wie er in der Bibliothek gespeichert ist.
REM Als erstes wird die Bibliothek geladen.
REM Wenn der Dialog in einer Bibliothek auf Anwendungsebene gespeichert ist
REM statt im Dokument, muss GlobalScope.DialogLibraries verwendet werden.
DialogLibraries.loadLibrary("Standard")
REM Holt die gesamte Bibliothek, nachdem sie geladen ist.
oStandard = DialogLibraries.getByName("Standard")
REM Holt den Dialog, wie er in der Bibliothek gespeichert ist.
REM Ich betrachte das Objekt als Dialogdefinition.
oAuswahl = oStandard.getByName(Dialogname)
REM Erzeugt einen ausführbaren Dialog aus der Dialogdefinition.
oAuswahl = CreateUnoDialog(oAuswahl)
REM ---- Namen des zuletzt aktiven Dialoges in die Tabelle "Start SV Tornesch / Beschreibungen" schreiben
oDatei = thiscomponent
oBlatt = oDatei.sheets("Beschreibung")
oZelle = oBlatt.getcellrangebyname("H22")
oZelle.string = Dialogname

if Dialogname = "Generationenschiessen" then

Call Datenbank
Dim Nachname(250) as String
Dim Vorname(250) as String
Dim GanzerName(250) as String

For einlesen = 1 to 250
oDocument.currentcontroller.frame.containerwindow.toFront 
oBlatt = oDocument.sheets("Mitglieder")
oZelle = oBlatt.getcellrangebyname("B" & einlesen +1)
Nachname(einlesen) = oZelle.string
oZelle = oBlatt.getcellrangebyname("C" & einlesen +1)
Vorname(einlesen) = oZelle.string
GanzerName(einlesen) = Vorname(einlesen) & " " & Nachname(einlesen)
oZelle = oBlatt.getcellrangebyname("B" & einlesen +2)
NaechsterName = oZelle.string
'oFeld = oAuswahl.getModel().getByName("cbbGanzerName") REM Namen eineln einlesen in die Combobox
'oFeld.StringaddItem = GanzerName(einlesen)
If NaechsterName = "" then
exit for

end if

Next einlesen
oFeld = oAuswahl.getModel().getByName("cbbGanzerName")
oFeld.StringItemList = GanzerName
oDocument.close(true)
call ListeGen

Dim Nummer(15)
For zweilesen = 1 to 15
oDocument.currentcontroller.frame.containerwindow.toFront 
oBlatt = oDocument.sheets("Tabelle1")
oZelle = oBlatt.getcellrangebyname("A" & zweilesen +1)
Nummer(zweilesen) = oZelle.string
Next zweilesen
oFeld = oAuswahl.getModel().getByName("cbbMann")
oFeld.StringItemList = Nummer
End if

oAuswahl.Execute() REM ----- Dialog ausführen --------


End Sub
REM -----------------------------------------------------------------------------------------------------------------------------
Sub DateiOeffnen(Dateipfad)

    url=converttourl(Dateipfad)
    dim myFileProp() as new com.sun.star.beans.PropertyValue
    oDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myFileProp() )
oDocument.currentcontroller.frame.containerwindow.toFront 

end sub   
REM -----------------------------------------------------------------------------------------------------------------------------
Sub DateiSchliessen(Dateipfad)

    url=converttourl(Dateipfad)
    dim myFileProp() as new com.sun.star.beans.PropertyValue
    oDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myFileProp() )

end sub   
REM -----------------------------------------------------------------------------------------------------------------------------

REM -----------------------------------------------------------------------------------------------------------------------------
REM ----------- Subs für das Generationenschiessen ------------

dim oGenerationenDlg as Object
dim oGanzerName as Object
dim Starter as String

Sub Mannschaften
    DialogLibraries.loadLibrary("Standard")
    oGenerationenDlg = CreateUnoDialog(DialogLibraries.Standard.Generationenschiessen)
    oGanzerName = oGenerationenDlg.getModel().getbyname("cbbGanzerName")

Starter = oGanzerName.GetItemText()

MsgBox Starter
end sub



REM -----------------------------------------------------------------------------------------------------------------------------
Dateianhänge
Start SV Tornesch.ods
(16.84 KiB) 115-mal heruntergeladen
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Kombinationsfeld - Ausgewählten Eintrag in einen Strimg schreiben

Beitrag von balu »

Hallo Jens,

ich bin seeehr Müde, will gleich ins Bett, deshalb jetzt nicht so ausführlich stattdessen ein paar Tipps.

Ich spreche aus Erfahrung, da ich mal ein sehr umfangreiches Dateienpaket erstellt hatte welches deinem schon in ein paar Dingen ähnelt, obwohl Du noch längst nicht all das machst was ich da gemacht habe. Und dieses Dateienpaket wurde von jemand anderem, dem ich nicht persönlich begegnet bin, auf Herz und Nieren geprüft, aber auch ich hatte extrem viel Zeit für die Überprüfung invstiert. Diese Paket dient ihnen um die Anwesenheit ihrer Kollegen festzuhalten.
Und von daher sind meine Tipps und Ratschläge sehr stark Praxisbezogen.

Da Du den Dialog ja so gesehen via Buttons steuerst, empfehle ich dir folgende Änderungen.

Deklarationen der Variablen: Teil 1
ALLE Variablen als erstes am Modulanfang zu deklarieren, wie schon erwähnt. Und die richtigen Typen zuordnen.
Auch die "dim myFileProp() as new com.sun.star.beans.PropertyValue" dort deklarieren.

Durch diese Methode stehen die Variablen allen Subs in diesem Modul zur Verfügung. (Kurzform Erklärung)


Allgemeines zu den Subs.
In den Subs
Sub Startdialog
Sub Generationenschiessen
etc.
...
Wiederholt sich folgendes immer wieder.

Code: Alles auswählen

oDatei = thiscomponent
oBlatt = oDatei.sheets("Beschreibung")
oZelle = oBlatt.getcellrangebyname("H2")
Dialogname = oZelle.string
DialogLibraries.loadLibrary("Standard")
oStandard = DialogLibraries.getByName("Standard")
 
Wobei in jeder betroffenen Sub oZelle sich immer auf eine andere Zelle im gleichen Tabellenblatt bezieht.

Und außerdem wird auch immer wieder der Dialog neu initialisiert (oder wie auch immer man das nennen will).

Das alles ist nicht nur nicht gut, sondern macht den Code viel länger und unübersichtlich.

Ich hatte es ja schon mal angesprochen, das die Elementnamen eindeutig sein sollten, und das gilt auch für die Zelle im Tabellenblatt. Und deshalb schlage ich dir folgendes vor, erste Ausbaustufe.

Code: Alles auswählen

Dim oDocument as Object, oAuswahl as Object, oFeld as Object
Dim oBlattBeschreibung as Object
Dim oZelle1 as Object, oZelle2 as Object, oZelle3 as Object, oZelle4 as Object
Dim oFeld1 as Object, oFeld2 as Object
Dim myFileProp() as new com.sun.star.beans.PropertyValue
REM
REM weitere Variablen deklarieren
REM

Sub Startdialog
oDatei = thiscomponent
oBlattBeschreibung= oDatei.sheets("Beschreibung")
oZelle1 = oBlattBeschreibung.getcellrangebyname("H2")
oZelle2 = oBlattBeschreibung.getcellrangebyname("H5")
oZelle3 = oBlattBeschreibung.getcellrangebyname("B2")
oZelle4 = oBlattBeschreibung.getcellrangebyname("B4")

DialogLibraries.loadLibrary("Standard")
oStandard = DialogLibraries.getByName("Standard")
oFeld1 = oStandard .getModel().getByName("cbbGanzerName")
oFeld2 = oStandard .getModel().getByName("cbbMann")
oGanzerName = oGenerationenDlg.getModel().getbyname("cbbGanzerName")

End Sub
Muss mich beeilen, sonst fallen mir die Augen vorher zu.

Mein Vorschlag zielt darauf hinaus, das in der Haupt-Sub "Startdialog" alles was definiert werden muss dort definiert wird. Und wenn das erledigt ist, wird der Dialog gestartet.

Dann erstellst Du weitere Subs wo dann irgendwelche Berechnungen oder Aktionen ausgeführt werde. Die werden dann aber nicht von der Haupt-Sub aus aufgerufen, sondern, wie Du es ja schon teilweise gemacht hast, durch Buttons im Dialog aufgerufen.

Eine Ausnahme gibt es aber dabei, und zwar die Sub zum Einlesen der externen Daten. Dazu sage ich jetzt aber nichts mehr, da ich ins Bett verschwinde.


Gute Nacht

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

Re: Kombinationsfeld - Ausgewählten Eintrag in einen Strimg schreiben

Beitrag von Stephan »

Auch wenn Du meine Hilfe scheinbar nicht willst, ist das Problem genau das was ich anfangs nannte, Du hast einen Dialog der bereits läuft (Generationenschiessen) versuchst aber diesen Dialog neu zu initialisieren um dann aus dem neu initialisiereten Dialog die Combobhox auszulesen.
Das kann nicht gehen weil (abgesehen von zusätzlichem Durcheinander bei den Variablennamen bzw. dahinterstehenden Objekten) im neu initialisierten Dialog die Combobox keinerlei Inhalt hat, denn der wird ja nicht einmal eingelesen (was auch sinnlos wäre da ja in dem neuen Dialog nicht die Auswahl erfolgt ist).

kurz gesagt:
-der Dialog "Generationenschiessen" ist geöffnet (ich nenne ihn hier einmal "Dialog1")
-Du wählst auf Dialog1 bei der Combobox etwas aus
-Du klickst auf die Schaltfläche von Dialog1

nun läuft der Code:

Code: Alles auswählen

DialogLibraries.loadLibrary("Standard")
oGenerationenDlg = CreateUnoDialog(DialogLibraries.Standard.Generationenschiessen)
der bewirkt das eine weitere 'Instanz' den Dialogs "Generationenschiessen" initialisiert aber noch nicht sichtbar angezeigt wird (ich nenne sie hier einmal "Dialog2")

nun läuft:

Code: Alles auswählen

oGanzerName = oGenerationenDlg.getModel().getbyname("cbbGanzerName")

oGanzerName enthält nun den Bezug auf die Combobox "cbbGanzerName" im nicht sichtbaren Dialog2

Folglich versucht nun:

Code: Alles auswählen

Starter = oAuswahl.oGanzerName.GetItemText()
eine Eintrag der combobox zu lesen der überhaupt nicht da ist, denn die Combobox in Dialog2 wurde weder mit Einträgen gefüllt noch wurde dort etwas ausgewählt (es geht garnicht denn Dialog2 ist ja überhaupt nicht sichtbar).



Lösung:
zunächst einmal musst Du Ordnung in die Objektvariablen der Dialoge bringen (das hat schon Balu angesprochen), da ich die Datei "Generation2016.ods" nicht habe schalte ich damit die Makros erstmal überhaupt durchlaufen Folgendes durch Auskommentieren ab:

Code: Alles auswählen

'...
oFeld = oAuswahl.getModel().getByName("cbbGanzerName")
oFeld.StringItemList = GanzerName
oDocument.close(true)
'call ListeGen

'Dim Nummer(15)
'For zweilesen = 1 to 15
'oDocument.currentcontroller.frame.containerwindow.toFront 
'oBlatt = oDocument.sheets("Tabelle1")
'oZelle = oBlatt.getcellrangebyname("A" & zweilesen +1)
'Nummer(zweilesen) = oZelle.string
'Next zweilesen
'oFeld = oAuswahl.getModel().getByName("cbbMann")
'oFeld.StringItemList = Nummer
End if

oAuswahl.Execute()
nun korrigiere ich die Namen des Dialog-Objektes hilfsweise so:

Code: Alles auswählen

Sub dialogaufrufen(Dialogname)
'Dim oAuswahl 'Dialog, wie er in der Bibliothek gespeichert ist.
REM Als erstes wird die Bibliothek geladen.
REM Wenn der Dialog in einer Bibliothek auf Anwendungsebene gespeichert ist
REM statt im Dokument, muss GlobalScope.DialogLibraries verwendet werden.
DialogLibraries.loadLibrary("Standard")
REM Holt die gesamte Bibliothek, nachdem sie geladen ist.
oStandard = DialogLibraries.getByName("Standard")
REM Holt den Dialog, wie er in der Bibliothek gespeichert ist.
REM Ich betrachte das Objekt als Dialogdefinition.
oAuswahlx = oStandard.getByName(Dialogname)
REM Erzeugt einen ausführbaren Dialog aus der Dialogdefinition.
oAuswahl = CreateUnoDialog(oAuswahlx)
REM ---- Namen des zuletzt aktiven Dialoges in die Tabelle "Start SV Tornesch / Beschreibungen" schreiben
oDatei = thiscomponent
oBlatt = oDatei.sheets("Beschreibung")
oZelle = oBlatt.getcellrangebyname("H22")
oZelle.string = Dialogname

if Dialogname = "Generationenschiessen" then

'...
und ändere das Makro für die Schaltfläche:

Code: Alles auswählen

Sub Mannschaften
    'DialogLibraries.loadLibrary("Standard")
    'oGenerationenDlg = CreateUnoDialog(DialogLibraries.Standard.Generationenschiessen)
    'oGanzerName = oGenerationenDlg.getModel().getbyname("cbbGanzerName")

'Starter = oAuswahl.oGanzerName.GetItemText()
Starter = oAuswahl.getModel().getByName("cbbGanzerName").Text

MsgBox Starter
end sub 
Das funktioniert nun wie gewünscht.


Da das momentan etwas 'hemdsärmelig' gelöst ist muss Du selbst den Code noch so ändern das Du für alle Dialogobjekte jeweils eine separate Objektvariable hast, diese Objektvariablen müssen dabei im Kopf des Moduls deklariert werden NICHT innerhalb eines Makros, sonst passiert was bei Dir passiert, nämlich:

Code: Alles auswählen

REM  *****  BASIC  *****
Dim oDocument
Dim oAuswahl '(A)

'...

Sub dialogaufrufen(Dialogname)
Dim oAuswahl 'Dialog, wie er in der Bibliothek gespeichert ist. '(B)
REM Als erstes wird die Bibliothek geladen.
REM Wenn der Dialog in einer Bibliothek auf Anwendungsebene gespeichert ist
REM statt im Dokument, muss GlobalScope.DialogLibraries verwendet werden.
DialogLibraries.loadLibrary("Standard")
REM Holt die gesamte Bibliothek, nachdem sie geladen ist.
oStandard = DialogLibraries.getByName("Standard")
REM Holt den Dialog, wie er in der Bibliothek gespeichert ist.
REM Ich betrachte das Objekt als Dialogdefinition.
oAuswahl = oStandard.getByName(Dialogname) '(C)
REM Erzeugt einen ausführbaren Dialog aus der Dialogdefinition.
oAuswahl = CreateUnoDialog(oAuswahl) '(D)
REM ---- Namen des zuletzt aktiven Dialoges in die Tabelle "Start SV Tornesch / Beschreibungen" schreiben
Erläuerung:
(A) - deklariert "oAuswahl" so das diese Variable für alle Makros des Moduls zur Verfügung steht
(B) - deklariert "oAuswahl" erneut, die erste Deklaration (A) ist damit hinfällig und "oAuswahl" wieder ohne Inhalt
(C)/(D) - sollten beispielsweise lauten:

Code: Alles auswählen

tmp = oStandard.getByName(Dialogname)
oAuswahl = CreateUnoDialog(tmp)
ich bin dabei garnicht vollends sicher das Dein Code formal falsch ist, aber diese Art mit einem Variablennamen für ein Objekt (bei einer Stringvariable etc. wäre das anders) zu hantieren ist zumindest riskant und ich würde dass vermeiden, denn es birgt allenfalls Risiken hat aber keinen erkennbaren Vorteil

Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Kombinationsfeld - Ausgewählten Eintrag in einen Strimg schreiben

Beitrag von Stephan »

Noch ein Hinweis:

Das Makro "Sub dialogaufrufen(Dialogname)" ist eigentlich sinnvoll, das Problem dabei ist nur das immer dieselbe Variable benutzt wird.
Um dieses Problem mit wenig Aufwand zu vermeiden gehe z.B. so vor:

im Kopf des Moduls deklariere oAuswahl und für jeden zu öffnenden Dialog eine zusätzliche Objektvariable:

Code: Alles auswählen

Dim oAuswahl
Dim meinDialog1
Dim meinDialog2
'...
ändere "Sub dialogaufrufen(Dialogname)" so:

Code: Alles auswählen

Sub dialogaufrufen(Dialogname)
Dim oAuswahlx 'Dialog, wie er in der Bibliothek gespeichert ist.
REM Als erstes wird die Bibliothek geladen.
REM Wenn der Dialog in einer Bibliothek auf Anwendungsebene gespeichert ist
REM statt im Dokument, muss GlobalScope.DialogLibraries verwendet werden.
DialogLibraries.loadLibrary("Standard")
REM Holt die gesamte Bibliothek, nachdem sie geladen ist.
oStandard = DialogLibraries.getByName("Standard")
REM Holt den Dialog, wie er in der Bibliothek gespeichert ist.
REM Ich betrachte das Objekt als Dialogdefinition.
oAuswahlx = oStandard.getByName(Dialogname)
REM Erzeugt einen ausführbaren Dialog aus der Dialogdefinition.
oAuswahl = CreateUnoDialog(oAuswahlx)
'...
rufe nun "Sub dialogaufrufen(Dialogname)" jeweil nicht so:

Code: Alles auswählen

Call dialogaufrufen(Dialogname)

sondern so (Beispiel) auf:

Code: Alles auswählen

dialogaufrufen(Dialogname)
meinDialog1 = oAuswahl 
(Hinweis: per Function ginge das noch 'schöner' aber Obiges erfüllt seinen Zweck und macht wenig Änderungsaufwand.)


Gruß
Stephan
Jens aus Tornesch
Beiträge: 5
Registriert: Mi, 13.07.2016 21:13

Re: Kombinationsfeld - Ausgewählten Eintrag in einen String schreiben

Beitrag von Jens aus Tornesch »

Hallo,

und vielen Dank, dass ihr euch so ausführlich mit meiner Fragestellung beschäftigt, das finde ich großartig!!
Stephan, es tut mir leid, den Eindruck erweckt zu haben, dass ich Deinen ersten Eintrag von gestern Abend nicht beachtet hätte. Das war nicht meine Absicht. Ich bin für jede Hilfe dankbar.

Nun beginne ich mal meine Makros "aufzuräumen" und eure Hinweise umzusetzten. Ich melde mich später nochmal.

Gruß Jens
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Kombinationsfeld - Ausgewählten Eintrag in einen String schreiben

Beitrag von balu »

Hallo!

Sodele!
Ich habe die "Start SV Tornesch.ods" mal aufgeräumt und umgebaut.

Umbau:
Die Dialoge anstatt einzeln mit ihren Namen, jetzt zusammen in einen Dialog reingepackt. Dieser Dialog heißt jetzt "HauptDialog" und beinhaltet jetzt die Elemete des *Auswahl*, *Generationenschiessen* und des *Mitgliederverwaltung*. Der HauptDialog hat jetzt 3 Seiten.

Und ferner befindet sich jetzt der Dialog direkt neben dem Makro-Modul *Routinen*.


Aufgeräumt:
Um wenigstens die ComboBox praktisch zu befüllen, habe ich alles rausgeschmissen was nicht im Code benötigt wird. Und ferner habe ich auch das was benötigt wird nach meinen Vorstellungen programmiert. Dabei ist jetzt auch mein zuerst genannter Vorschlag mit der definierung des Dialogs

Code: Alles auswählen

    DialogLibraries.loadLibrary("Standard")
    oGenerationenDlg = CreateUnoDialog(DialogLibraries.Standard.Generationenschiessen)
    oGanzerName = oGenerationenDlg.getModel().getbyname("cbbGanzerName")
 
in ähnlicher Weise mit eingeflossen.

Das Du Probleme mit dem befüllen der ComboBox hast, sah ich erst beim genauern inspizieren der *Sub dialogaufrufen(Dialogname)*.
Denn einerseits kam wohl das zum tragen was Stephan schon wegen Dialog angesprochen hatte, und anderseits ist er auch "unglücklich" programmiert.

Ein kleines Beispiel:

Code: Alles auswählen

oZelle = oBlatt.getcellrangebyname("B" & einlesen +1)
Nachname(einlesen) = oZelle.string
Nicht gut. Da zu kompliziert.
Einfacher.

Code: Alles auswählen

Nachname = oBlatt.getcellrangebyname("B" & einlesen +1).string
Du hast die Sub Generationenschiessen aufgerufen, die aber durch 'Call dialogaufrufen(Dialogname)' in die 'Sub dialogaufrufen' verzweigt. Und die 'Sub dialogaufrufen' ist eigentlich die richtige 'Sub Generationenschiessen'. Hört sich verwirrend an, was es aber auch wirklich ist. Und deshalb heißt jetzt die neue 'Sub Generationenschiessen' nicht nur so, sondern sie macht das was die alte 'Sub dialogaufrufen' gemacht hat.

So, und jetzt noch mal zur 'Sub Generationenschiessen'.
Ich habe da ein paar Kommentare eingetragen. Bitte lesen!

Hier jetzt mal der gesamte Code.

Code: Alles auswählen

Dim Dateipfad as string

Dim oBlatt as Object, oExterneDatei as Object
Dim oHptDialog as Object, oNamensListe_ComBo as Object
Dim myFileProp(0) as new com.sun.star.beans.PropertyValue

Sub Startdialog

    oDatei = thiscomponent
    oBlatt = oDatei.sheets("Beschreibung")
    oZelle = oBlatt.getcellrangebyname("H2")
    Dialogname = oZelle.string

    DialogLibraries.loadLibrary("Routinen")
    oHptDialog = CreateUnoDialog(DialogLibraries.Routinen.HauptDialog)
    oNamensListe_ComBo = oHptDialog.getControl("ComboBox1")
    
    oHptDialog.Model.Step = 1
    oHptDialog.execute
    
End Sub



Sub Generationenschiessen 
    Dateipfad = oBlatt.getcellrangebyname("B2").string

    url=converttourl(Dateipfad)
    myFileProp(0).name = "Hidden"
    myFileProp(0).Value = FALSE ' TRUE  Wenn TRUE gegen FALSE getauscht wird, dann sieht man nicht das die'
                                       ' ExterneDatei geladen wird.'
                                       ' ABER ACHTUNG!'
                                       ' Grad beim experimentieren ist besondere Vorsicht geraten!'
                                       ' Denn wenn es zu einer Fehlermeldung kommt, und das Programm'
                                       ' abgebrochen ist, sieht man nicht das die ExterneDatei geöffnet ist.'
                                       ' Deshalb erst den Status FALSE auf TRUE ändern, wenn alles läuft.'
                                       
    oExterneDatei = starDesktop.loadComponentfromURL(url, "_blank", 0, myFileProp())

        For einlesen = 1 to 10'250  Zu testzwecken anstatt 250 erstmal nur 10 Einträge.'
                                   ' Diese Schleife ist für lange Listeneinträge wirklich nicht geeignet,'
                                   ' da muss später mal eine andere Routine her. Einfach im Forum mal fragen.'
                                           
            oMitglieder_DB = oExterneDatei.sheets.getByName("Mitglieder")

            sNachname = oMitglieder_DB.getcellrangebyname("B" & einlesen +1).string
            sVorname = oMitglieder_DB.getcellrangebyname("C" & einlesen +1).string

            sGanzerName = sVorname & " , " & sNachname            

            oNamensListe_ComBo.additem(sGanzerName,einlesen)

        Next einlesen

    oExterneDatei.close(true)

    oHptDialog.Model.Step = 3    
End Sub
Schaus dir an, mach dich damit vertraut, und bei Fragen weißt Du ja wo wir sind :-)


Gruß
balu



P.s.
Ich sehe grad eben das in der 'Sub Startdialog' 2 überflüssige Zeilen drin sind.
oZelle und Dialogname.
Ich lasse sie jetzt drin, da ich keine Lust mehr zum ändern habe.
Dateianhänge
Start SV Tornesch_v3.3.ods
(18.06 KiB) 118-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 :D
Jens aus Tornesch
Beiträge: 5
Registriert: Mi, 13.07.2016 21:13

Gelöst: Kombinationsfeld - Ausgewählten Eintrag in einen String schreiben

Beitrag von Jens aus Tornesch »

Hallo,
nun habe ich die Tipps von euch beiden umgesetzt. Durch diese "Umbauten" funktioniert das Programm.

Als ich, stolz wie Oscar, das Posten wollte fand ich die weiteren Ergänzugen von balu. Die sind hier noch nicht
mit eingeflossen.

Da ich mir vorstellen kann, dass es euch interressiert was ich aus euren Vorschlägen gemacht habe hier der ganze Code:

Code: Alles auswählen

REM  *****  BASIC  *****
REM --------- Deklaration aller Variablen sortiert nach den Subs in denen sie zuerst benötigt werden ------
REM Sub Startdialog
Dim oDocument as Object, oFeld as Object, oDatei as Object
Dim oBlattBeschreibung as Object

REM ---- dies sind die Namen für die Dialoge
Dim oAuswahldlg as Object, oGenerationenDlg as Object, oTrainingsbetriebDlg as Object, oMitgliederverwaltungDlg as Object
REM ---- dies sind die Orte für die Datei- und Dialognamen
Dim oZelledlg1 as Object, oZelledlg2 as Object, oZelledlg3 as Object, oZelledlg4 as Object
Dim oZelledat1 as Object, oZelledat2 as Object, oZelledat3 as Object, oZelledat4 as Object
REM ---- dies sind die Comboboxen
Dim oFeld1 as Object, oFeld2 as Object 
REM ---- dies sind die Textboxen
Dim oTextF1 as Object,oTextF2 as Object,oTextF3 as Object,oTextF4 as Object,oTextF5 as Object,_
	oTextF6 as Object,oTextF7 as Object,oTextF8 as Object,oTextF9 as Object,oTextF10 as Object,_
	oTextF11 as Object,oTextF12 as Object,oTextF13 as Object,oTextF14 as Object,oTextF15 as Object,_
	oTextF16 as Object,oTextF17 as Object,oTextF18 as Object,oTextF19 as Object,TextF20 as Object
Dim myFileProp() as new com.sun.star.beans.PropertyValue

REM Sub Generationenschiessen

Dim Nachname(250) as String
Dim Vorname(250) as String
Dim GanzerName(250) as String
Dim Nummer(15) as String
Dim Starter as String
Dim Mannsch as String
REM Sub Trainigsbetrieb 

REM Sub Mitgliederverwaltung

REM Sub dlgMitglstart

REM Sub Datenbank

REM Sub ListeGen

REM Sub dialogaufrufen(Dialogname)

REM Sub DateiOeffnen(Dateipfad)

REM Sub DateiSchliessen(Dateipfad)

REM sub aktiverDialog

REM sub FensterWechseln(Fenstername)

REM Sub Mannschaften 

Sub Startdialog REM Variablen zum Start des Dialoges "Auswahl" und alle Steuerelemente festlegen

oDatei = thiscomponent
oBlattBeschreibung = oDatei.sheets("Beschreibung")
oZelledlg1 = oBlattBeschreibung.getcellrangebyname("H2") REM Dialogname "Auswahl"
oZelledlg2 = oBlattBeschreibung.getcellrangebyname("H3") REM Dialogname "Trainingsbetrieb"
oZelledlg3 = oBlattBeschreibung.getcellrangebyname("H4") REM Dialogname "Mitgliederverwaltung"
oZelledlg4 = oBlattBeschreibung.getcellrangebyname("H5") REM Dialogname "Generationenschiessen"
oZelledat1 = oBlattBeschreibung.getcellrangebyname("B2") REM Pfad für "Datenbank" Dateiname: "Daten_SV_Tornesch.ods"
oZelledat2 = oBlattBeschreibung.getcellrangebyname("B3") REM Pfad für "_____" Dateiname: noch nicht vergeben
oZelledat3 = oBlattBeschreibung.getcellrangebyname("B4") REM Pfad für "Generationenschiessen" Dateiname: "Generation2016.ods"
oZelledat4 = oBlattBeschreibung.getcellrangebyname("B5") REM Pfad für "_____" Dateiname: noch nicht vergeben
DialogLibraries.loadLibrary("Standard")
oAuswahlDlg = CreateUnoDialog(DialogLibraries.Standard.Auswahl)
oGenerationenDlg = CreateUnoDialog(DialogLibraries.Standard.Generationenschiessen)
oTrainingsbetriebDlg = CreateUnoDialog(DialogLibraries.Standard.Trainingsbetrieb)
oMitgliederverwaltungDlg = CreateUnoDialog(DialogLibraries.Standard.Mitgliederverwaltung)
oFeld1 = oGenerationenDlg.getModel().getByName("cbbGanzerName")
oFeld2 = oGenerationenDlg.getModel().getByName("cbbMann")
oTextF1 = oGenerationenDlg.getModel().getByName("Tln1")
oTextF2 = oGenerationenDlg.getModel().getByName("Tln2")
oTextF3 = oGenerationenDlg.getModel().getByName("Tln3")
oTextF4 = oGenerationenDlg.getModel().getByName("Tln4")
oTextF5 = oGenerationenDlg.getModel().getByName("Tln5")
oTextF6 = oGenerationenDlg.getModel().getByName("Tln6")
oTextF7 = oGenerationenDlg.getModel().getByName("txtLG")
oTextF8 = oGenerationenDlg.getModel().getByName("txtGS")
oTextF9 = oGenerationenDlg.getModel().getByName("txtKK")
oTextF10 = oGenerationenDlg.getModel().getByName("txtBogen")
oTextF11 = oGenerationenDlg.getModel().getByName("txtDis5")
oTextF12 = oGenerationenDlg.getModel().getByName("txtDis6")
oTextF13 = oGenerationenDlg.getModel().getByName("txtGesamt")

oAuswahlDlg.execute()

End Sub

REM -----------------------------------------------------------------------------------------------------------------------------

Sub Generationenschiessen REM Variablen zum Start des Dialoges "Generationenschiessen" festlegen
REM Füllen der Comboboxen im Dialog oGenerationenDlg

Call Datenbank
Rem ---- Einlesen der Namen aus Daten_SV:Tornesch.ods
For einlesen = 1 to 250
oBlatt = oDocument.sheets("Mitglieder")
oZelle = oBlatt.getcellrangebyname("B" & einlesen +1)
Nachname(einlesen) = oZelle.string
oZelle = oBlatt.getcellrangebyname("C" & einlesen +1)
Vorname(einlesen) = oZelle.string
GanzerName(einlesen) = Vorname(einlesen) & " " & Nachname(einlesen)
'oFeld1.additem(GanzerName)
oZelle = oBlatt.getcellrangebyname("B" & einlesen +2)
NaechsterName = oZelle.string

If NaechsterName = "" then
exit for
end if

Next einlesen
oFeld1.StringItemList = GanzerName
oDocument.close(true)

call ListeGen
Rem ---- Einlesen der Startnummern aus Generation2016.ods
For zweilesen = 1 to 15
oBlatt = oDocument.sheets("Tabelle1")
oZelle = oBlatt.getcellrangebyname("A" & zweilesen +1)
Nummer(zweilesen) = oZelle.string
Next zweilesen
oFeld2.StringItemList = Nummer
oDocument.close(true)
oGenerationenDlg.execute
End sub

REM -----------------------------------------------------------------------------------------------------------------------------

REM -------- Dateien öffnen - Variablen zuweisen ------

Sub Datenbank REM Dateipfad für Datenbankdatei "Daten_SV-Tornesch.ods" festlegen und Datei öffnen aufrufen

Dateipfad = oZelledat1.string
call DateiOeffnen(Dateipfad)

End Sub

REM -----------------------------------------------------------------------------------------------------------------------------
Sub ListeGen REM Variablen zum öfnnen der Datenbankdatei "Generation2016.ods" festlegen und Datei öffne

Dateipfad = oZelledat3.string
call DateiOeffnen(Dateipfad)

End Sub

REM -----------------------------------------------------------------------------------------------------------------------------
REM ---- Sub-Routinen die immer wieder benötigt werden --------


REM -----------------------------------------------------------------------------------------------------------------------------
Sub DateiOeffnen(Dateipfad)

    url=converttourl(Dateipfad)
    oDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myFileProp() )
    oDocument.currentcontroller.frame.containerwindow.toFront 

end sub   

REM ----------- Subs für das Generationenschiessen ------------

Sub Mannschaften
Starter =  oFeld1.Text
MsgBox Starter
Mannsch = oFeld2.Text
oTextF1.Text = Starter

end sub

Die letzten Vorschläge sind sehr schön. Das macht das Programm natürlich schlanker und damit übersichtlicher.
Vielen Dank für eure Hilfe!!

Ihr bekommt ganz viele Fleißsternchen von mir!

Gruß Jens
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Kombinationsfeld - Ausgewählten Eintrag in einen String schreiben

Beitrag von balu »

Moin moin.
Als ich, stolz wie Oscar, das Posten wollte
Du darfst auf dich Stolz sein. Denn Du hast schon einiges dazu gelernt. :D

Was mir sofort sehr Positiv auffiel, ist die Tatsache das Du die Variablen deklaration "Gruppiert" hast. Also in der Form von: "REM ---- dies sind die Namen für die Dialoge" etc.
Hätte ich irgendwann auch mal vorgeschlagen, aber um so schöner das Du selber auf die Idee gekommen bist. Pluspunkt für dich.

Und mach dir nix draus das mein Code halt anders aussieht. Sei erstmal zufrieden das Du etwas geschafft hast.
Früher oder Später wirst Du noch auf reichlich Probleme stoßen, kenne mich damit sehr gut aus (leider).

Und schon sind wir bei einem Punkt der dich regelmäßig begleiten wird. Denn das ansprechen eines Elements in einem Dialog hält so manche Überraaaaschung parat. Und das ist schon jetzt der Fall.

Beispiel:
Du hast ein Element wie folgt definiert.

Code: Alles auswählen

oFeld1 = oGenerationenDlg.getModel().getByName("cbbGanzerName")
Und wenn ich das jetzt richtig sehe, dann ist das wohl eine Combox. Aber so wirst Du im weiteren Verlauf nicht mit ihr arbeiten können, was natürlich anfangs nicht so einfach zu verstehen ist.
Richtig ist nämlich.

Code: Alles auswählen

oFeld1 = oGenerationenDlg.getControl("cbbGanzerName")
 
Man kann das nicht alles auswendig kennen, aber manche Eigenschaften (mal ganz einfach ausgedrückt) können nur über das getControl angesprochen werden, während andere nur über das getModel ansprechbar sind. Und um dies selber herauszufinden ist ein Inspektionstool wie XRAY oder aber MRI eine unverzichtbare Hilfe. Und deshalb installiere dir entweder das eine oder andere oder beide, es sei denn Du hast das schon gemacht.

In meinem Code habe ich das eben erklärte ja schon angwendet, da ich bei getModel eine Fehlermeldung bekam, die mir nicht unbekannt war. Und deshalb habe ich getControl genommen, was ich aber aus Sicherheitsgründen mit XRAY gegengeprüft hatte.

So, und nun viel Spaß mit den Dateien.


Gruß
balu
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 :D
Jens aus Tornesch
Beiträge: 5
Registriert: Mi, 13.07.2016 21:13

Re: Kombinationsfeld - Ausgewählten Eintrag in einen String schreiben

Beitrag von Jens aus Tornesch »

Hallo nochmal,

ich habe in der Sub "Startdialog" die Einträge "getModel().getByName" durch "getControl" ersetzt.
Siehe da, es erübrigt sich wieder etwas Arbeit, denn das "getControl" hätte ich sonst ja immer wieder
schreiben müssen.
Das Inspektionstool werde ich mir besorgen.
Danke und Gruß
Jens
Antworten