Kombinationsfeld / ComboBox – Auswahl in eine bestimmte Calc-Zelle schreiben/einfügen

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

Moderator: Moderatoren

Karl_der_Grosse
Beiträge: 3
Registriert: Do, 05.03.2020 17:01

Kombinationsfeld / ComboBox – Auswahl in eine bestimmte Calc-Zelle schreiben/einfügen

Beitrag von Karl_der_Grosse »

Hallo zusammen,

ich versuche meine ersten Schritte in der Makro-Programmierung in BASIC und habe mir ein kleines Projekt überlegt.

Ziel:
Ich möchte aus einem „Dialog“ heraus ein Kombinationsfeld verwenden, in dem es Einträge gibt. Der Benutzer soll einen Eintrag auswählen und abhängig davon soll eine Text-Eingabe in eine bestimmt Zelle einer bestimmten Spalte eines Calc-Dokumentes geschrieben werden. (z. B. Kombinationsfeld-Eintrag 1 soll in Spalte C geschrieben werden; Kombinationsfeld-Eintrag 2 soll in Spalte D geschrieben werden)

Als Lern-Einstieg habe ich u. a. das Skript von „ Andrew Pitonyak“ verwendet.
In dem – nach Anleitung – selbst erstellten „Modul“ „OOME_30“ von Andrew Pitonyak hat eine ähnliche Funktion bei mir auch funktioniert. (Kombinationsfeld mit Farb-Auswahl → z. B. Auswahl Kombinationsfeld-Eintrag „Rot“ → Hintergrundfarbe des Kombinationsfeld ändert sich entsprechend)
Dann wollte ich diesen Programm-Code in meinem Projekt übernehmen, modifizieren und für mein Projekt leicht anpassen, doch leider funktioniert dies nicht so, wie gewünscht. Selbst die ursprüngliche Funktionsweise mit dem Farbwechsel bekomme ich in meinem Projekt nicht ans Laufen.

Code: Alles auswählen

'S.635(637)
'Sub OOMEDlgColorBox
Sub ComboBoxOptionen

	Dim oModel As Object
	Dim s As String

'-->
	Dim oOOMEDlg003 				'Der zur Laufzeit erzeugte Dialog
	REM Deklaration der Hauptvariablen
	Dim oLib003 					'Bibliothek, die den Dialog enthält
	Dim oLibDlg003 				'Dialog, wie er in der Bibliothek gespeichert ist
	REM Laden der Bibliothek und des Dialogs.
	'DialogLibraries.loadLibrary("OOME_30")
	DialogLibraries.LoadLibrary("Standard")
	'oLib = DialogLibraries.getByName("OOME_30")
	oLib003 = DialogLibraries.getByName("Standard")
	'oLibDlg = oLib.getByName("OOMESample")
	oLibDlg003 = oLib003.getByName("DLG_ComboBox_002")
	oOOMEDlg003 = CreateUnoDialog(oLibDlg003)
'<--
		
	oModel = oOOMEDlg003.getModel().getByName("ColorBox")
	
	s = oModel.Text
	
	If s = "Rot" Then
'		REM Umstellung auf Rot.
		oModel.BackGroundColor = RGB(255, 0, 0)
'		oOOMEDlg003.getModel().getByName("lbl_Anzeige").Label = "Rot"
'		oOOMEDlg003.getModel().getByName("lbl_Anzeige").Title = "Rot"
'		oOOMEDlg003.getModel().getByName("txt_Anzeige").Text = "Rot"

	ElseIf s = "Grün" Then	
		REM Umstellung auf Grün.
		oModel.BackGroundColor = RGB(0, 255, 0)		
	ElseIf s = "Blau" Then	
		REM Umstellung auf Blau.
		oModel.BackGroundColor = RGB(0, 0, 255)
	Else
		REM Umstellung zurück auf Weiß.
		oModel.BackGroundColor = RGB(255, 255, 255)
	End If

End Sub
Falls dies noch als Information wichtig wäre:
Meine selbst erstellten „BASIC-Module“ und „BASIC-Dialoge“ befinden sich in „Meine Makros & Dialoge“ → „Standard“. Falls dies irgend welche Auswirkungen hat auf das Einbinden von Bibliotheken oder ähnliches, sei dies noch erwähnt.

Ich hoffe, ich habe alle nötigen Informationen für eine Hilfe zusammengestellt. ;-)

Wäre super, wenn jemand eine Idee hätte, woran es bei mir liegen könnte und mich unterstützen könnte.
Schonmal Danke im Vorfeld.

Viele Grüße

Karl_der_Grosse
Karl_der_Grosse

Win10; LO v6.3.3.2 (Stand: 2020-05-03)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Kombinationsfeld / ComboBox – Auswahl in eine bestimmte Calc-Zelle schreiben/einfügen

Beitrag von Stephan »

Du schreibst leider nicht WAS nicht funktioniert. Oder übersehe ich das?

Dem ersten Augenschein nach sind jedoch alle Ausdrücke der Form:

Code: Alles auswählen

DialogLibraries.LoadLibrary("Standard")
falsch, weil sie auf die Makrobibliothek im aktuellen Dokument verweisen.

Ein Verweis auf die zentralen Makrobibliotheken erfolgt mit vorangestelltem GlobalScope:

Code: Alles auswählen

GlobalScope.DialogLibraries.LoadLibrary("Standard") 

Gruß
Stephan
Karl_der_Grosse
Beiträge: 3
Registriert: Do, 05.03.2020 17:01

Re: Kombinationsfeld / ComboBox – Auswahl in eine bestimmte Calc-Zelle schreiben/einfügen

Beitrag von Karl_der_Grosse »

Hallo Stephan,

vielen Dank für Deine Antwort!
Ah ok, verstehe Deinen Hinweis auf das Einbinden der Bibliotheken und habe dies testweise geändert.

In meinem Code habe ich noch einmal versucht, die ursprüngliche Funktionsweise mit dem Farbwechsel nachzubauen.
Also, WAS genau nicht funktioniert:
- „Dialog“ mit Kombinationsfeld wird geöffnet.
- Kombinationsfeld-Einträge („Rot“;“Grün“;“Blau“) sind vorhanden und auswählbar.
- Wenn man nun im Kombinationsfeld z. B. den Eintrag „Rot“ auswählt, wird nicht die Hintergrundfarbe des Kombinationsfeld in rot geändert.
- Die Abfrage des aktuell ausgewählten Kombinationsfeld-Eintrags funktioniert nicht.
- Offenbar wird die IF-Abfrage nicht durchlaufen.
- Variable s bleibt leer. ( s = „“ ) auch nach Änderung der Auswahl.
D. h. nach der Auswahl eines Eintragt (z. B. „Rot“) („Text modifiziert“ → Aufruf der „Sub ComboBoxOptionen“) wird die Kombinationsfeld- Hintergrundfarbe nicht in rot geändert.

Ich vermute, hier liegt irgendwo der Fehler.

Code: Alles auswählen

...
	oModel = oOOMEDlg003.getModel().getByName("ColorBox")
	
	s = oModel.Text
...

Ich hoffe, ich konnte etwas deutlicher beschreiben, was nun nicht funktioniert. (Bin da nicht so geübt drin.)
Wie gesagt wundere ich mich, weil ich diese Funktionsweise nach der Anleitung von „Andrew Pitonyak“ ans Laufen bekommen hatte. („Meine Makros & Dialoge“ → „OOME_30“)

Nochmals Danke für Deine Antwort.

Viele Grüße

Karl_der_Grosse
Karl_der_Grosse

Win10; LO v6.3.3.2 (Stand: 2020-05-03)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Kombinationsfeld / ComboBox – Auswahl in eine bestimmte Calc-Zelle schreiben/einfügen

Beitrag von Stephan »

ich verstehe nicht was der Code überhaupt tun soll weil das Initialisieren des Dialogs und das Reagieren auf ein Ereignis des KOmbinationsfeldes innerhalb eines Makros stehen.

Wenn der Dialog gestartet IST, wäre folgendes Makro geeignet um die Umfärbung vorzunehmen:

Code: Alles auswählen

Sub farbwechsel(rueck)
	If rueck.Source.Model.Text = "Rot" Then
		rueck.Source.Model.BackGroundColor = RGB(255, 0, 0)
	ElseIf rueck.Source.Model.Text = "Grün" Then	
		rueck.Source.Model.BackGroundColor = RGB(0, 255, 0)		
	ElseIf rueck.Source.Model.Text = "Blau" Then	
		rueck.Source.Model.BackGroundColor = RGB(0, 0, 255)
	Else
		rueck.Source.Model.BackGroundColor = RGB(255, 255, 255)
	End If
End Sub
Hierzu muss es z.B. dem Ereignis "Text geändert" des Kombinationsfelds zugewiesen sein.


Gruß
Stephan
Karl_der_Grosse
Beiträge: 3
Registriert: Do, 05.03.2020 17:01

Re: Kombinationsfeld / ComboBox – Auswahl in eine bestimmte Calc-Zelle schreiben/einfügen

Beitrag von Karl_der_Grosse »

Hallo Stephan,

vielen Dank für Deine Antwort.

Nach dem ich die Deklaration der Variablen in die Sub verschoben habe, die auch den Dialog aufruft, hat Deine „Sub farbwechsel(rueck)“ wunderbar funktioniert. - Danke!
D. h. die Hintergrund-Farbe des Kombinationsfelds ändert sich mit dem entsprechenden Menü-Eintrag, wie gewünscht.
Jetzt muss ich noch nachvollziehen und verstehen, was genau „rueck.Source.Model“ bedeutet, damit ich mein eigentliches Vorhaben umsetzen kann.
„rueck“ ist wohl eine Rückgabe-Variable?

Mein Hauptziel ist es, in ein Textfeld im Dialog einen frei wählbaren Text einzugeben. Diese Texteingabe soll nach einer Auswahl im Kombinationsfeld und durch die Betätigung eines Button in eine bestimmt Zelle im Calc-Dokument eingefügt werden. Die entsprechende Spalte wird durch die Eintragsauswahl im Kombinationsfeld definiert bzw. bestimmt.

Diese Vorgehen erschien für mich als BASIC-Einsteiger noch etwas zu kompliziert. Daher mein „Umweg“/“Zwischenschritt“ mit dem Farbwechsel und der „angedeuteten“ Anzeige, die leider so auch nicht funktioniert hat. Wo liegt hier mein Fehler?

Code: Alles auswählen


...
	oOOMEDlg003.getModel().getByName("lbl_Anzeige").Label = "Rot"	'ev Anzeige im Beschriftungsfeld über Eigenschaft Label
	oOOMEDlg003.getModel().getByName("lbl_Anzeige").Title = "Rot"	'ev Anzeige im Beschriftungsfeld über Eigenschaft Title
	oOOMEDlg003.getModel().getByName("txt_Anzeige").Text = "Rot"	'ev Anzeige im Textfeld über Eigenschaft Text
...
Ich habe gehofft so mehr zu verstehen, wie die einzelnen Befehle und Befehlsketten logisch aufgebaut sind und funktionieren.
Fehlt mir in diesem Zusammenhang noch ein „Service“, den ich für die Funktion noch einbinden müsste?
z. B. in der folgenden Form:

Code: Alles auswählen

…
oComboBox = CreateUnoService(„com.sun.star.awt.???“)
…
Das Einfügen von einem Textinhalt in eine Zelle habe ich folgendermaßen hinbekommen:

Code: Alles auswählen

Sub ZellenInTabellenEinfuegen
	' Dieses Makro in einer geöffnetten Tabelle starten
	oCalc = ThisComponent
	oSheet = oCalc.sheets(0)	
	
	' (Spalte,Zeile)
	oCell = oSheet.getCellByPosition(5,0)	'(0,0) = A1; (5,0) = F1
	oCell.string = "Beispieltext 1"	

	oCell = oSheet.getCellRangeByName("$C$1")
	oCell.string = "Beispieltext 2"

End Sub
(Variablen werden vorher beim Dialog-Aufruf deklariert.)

Zusammengefasst meine Frage:
Wie kann ich den Inhalt bzw. die Benutzer-Eingabe eines „Textfelds“ in eine bestimmt Zelle schreiben? Dabei hängt die korrekte Spalte der Zelle von der entsprechenden Auswahl in einem „Kombinationsfeld“ ab.

Vorab vielen Dank

Viele Grüße
Karl_der_Grosse

Win10; LO v6.3.3.2 (Stand: 2020-05-03)
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Kombinationsfeld / ComboBox – Auswahl in eine bestimmte Calc-Zelle schreiben/einfügen

Beitrag von Stephan »

„rueck“ ist wohl eine Rückgabe-Variable?
Ja, aber der Name ist völlig beliebig. Diese Variable liefert den Bezug auf das Objekt das das betreffenbde EReignis (das EReignis dem das Makro zugeordnet wurde) ausgelöst wurde, mit .Source bekommst Du daraus das eigentliche Objekt.
oOOMEDlg003.getModel().getByName("lbl_Anzeige").Label = "Rot"
Funktioniert bei mir eigentlich einwandfrei, nur woher soll ich wissen denselben Code wie Du zu haben, wenn Du DEinen Code nur in Auszügen postest und auch keine Fehlermeldung?

Rein mutmaßlich könnte der Fehler sein das oOOMEDlg003 bei Dir nicht verfügbar ist, wärend die Codezeile läuft, weil oOOMEDlg003 nicht deklariert wurde oder nicht mit richtiger Gültiugkeit deklariert wurde, z.B.:

Code: Alles auswählen

Dim frm_x As Object
Dim dia_x As Object

Sub Main
'oOOMEDlg003.getModel().getByName("lbl_Anzeige").Label = "Rot"
	BasicLibraries.LoadLibrary("Standard")
	DialogLibraries.LoadLibrary("Standard")
	frm_x = DialogLibraries.Standard.Dialog1
	dia_x = CreateUnoDialog(frm_x)
	dia_x.execute()
End Sub

'Code für Schaltfläche
Sub beschriftung()
	dia_x.getModel().getByName("lbl_Anzeige").Label = "Rot"
End Sub
Die zwei Deklarationen außerhalb der Makros sind hier zwingend, damit der Code für eine Schaltfläche funktionieren kann.
Ich habe gehofft so mehr zu verstehen, wie die einzelnen Befehle und Befehlsketten logisch aufgebaut sind und funktionieren.
Du solltest Dir XRAY installieren nun nutzen:
http://www.prooo-box.org/live/software/ ... l60_de.odt


Gruß
Stephan
Antworten