Calc Tabelle in ein Makro einbinden

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

Moderator: Moderatoren

martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Calc Tabelle in ein Makro einbinden

Beitrag von martin11 »

Diese Calc Tabelle in ein Makro einfügen oder dazu konvertieren wie kann das gelingen?
Ich habe einige Muster.
Die basieren auf einer Calc Tabelle, in die sind Felder eingefügt, die mit Code hinterlegt sind.
Dient die Tabelle als Dialog oder wie muss ich das verstehen?
_Kopfzeilen_berechnet_Kürzt_1.ods
(18.92 KiB) 117-mal heruntergeladen

Martin
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag von mikeleb »

Hallo,
was willst du uns damit sagen oder fragen?
Gruß,
mikeleb
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Tabelle in ein Makro einbinden

Beitrag von Stephan »

Diese Calc Tabelle in ein Makro einfügen oder dazu konvertieren wie kann das gelingen?
Das was dasteht kann garnicht gelingen, wahrscheinlich meinst Du aber etwas Anderes. Nur was?
Ich habe einige Muster.
Die basieren auf einer Calc Tabelle, in die sind Felder eingefügt, die mit Code hinterlegt sind.
Dient die Tabelle als Dialog oder wie muss ich das verstehen?


Eine Tabelle mit (zusätzlichen) Feldern versteht sich in OO/LO als Formular. Das ist nicht Dasselbe wie ein Dialog, weder optisch (was ja zu sehen ist) noch hinsichtlich de Programmierung, weil Formularfelder anders angesprochen werden müssen als Dialogfelder und teils (z.B. Radio-Buttons) auch programmiermäßig anders behandelt werden.


Gruß
Stephan
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Calc Tabelle in ein Makro einbinden

Beitrag von martin11 »

Danke Stephan,
ich werde in dem Buch jetzt wegen Formulare nachschlagen.
Martin
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Calc Tabelle in ein Makro einbinden

Beitrag von martin11 »

Nun habe ich mich auch mit Formularen befasst.
In meinem Buch gibt es nur eine Anleitung auf der Basis Base.
Ist das so?
In meinem vorhandenen Makro werden aber Calc-Tabellen verendet.
In dem Makro gibt es eine starre Formel, die 240 Seiten voraussetzt.
Die möchte ich aber mit der hochgeladenen Formel ersetzen.
Erbarmt sich, jemand eines Schriftstellers?

Code: Alles auswählen

REM  *****  BASIC  *****
REM
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????	
REM  				Die Haupt-/ Startroutine heisst: StartKopfzeile
REM Es wird ein Dialog mit Steuerlementen und einem Textfeld mit weiteren Informationen 
REM zur Programmbenutzung per Code erzeugt.
REM 
REM Einlesen der Kopfzeilen-Texte aus einer Calc-Tabelle. Die Texte MÜSSEN im Zellbereich B1:B20 stehen!
REM Seitenberechnungen von Seite 2 - nSeite (siehe const nSeite=240) gleich hier oben am Anfang des Programms.
REM Formatierung jeder ersten Zeile einer Seite per Absatzvorlage, 
REM dabei Differenzierung zwischen linker und rechter Seite.
REM Eintragen der entsprechenden Texte, in Abhängigkeit der Seitenberechnung und Seite links/rechts
REM Rücksprung in die Hauptroutine
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????

REM Konstante für die zu bearbeitenden Seiten
Const nSeite=240

REM Deklaration der Varaiblen
Dim oDocW as Object			' Writer-Dokument
Dim oDocC as Object			' Calc-Dokument (wird versteckt geöffnet)
Dim oCC as Object			' CurrentController
Dim oVC as Object			' ViewCursor
Dim mArray1 				' Array für die Kopfzeilen-Texte (linke Seite)
DIm mArray2 				' Array für die Kopfzeilen-Texte (rechte Seite)
Dim sUrl					' URL-Pfad Calc-Datei
Dim bTrue as Boolean

REM Deklaration der Objektvariablen des Programmdialogs
Dim oDlg as Object

REM Start der Hauptroutine
Sub StartKopfzeile
Dim oDlgM as Object 	' das Modell des Dialogs
Dim oMod as Object 		' nimmt jeweils das Modell der Objekte auf

REM das Dialogmodell erzeugen
	oDlgM = createUnoService("com.sun.star.awt.UnoControlDialogModel")
REM Eigenschaften zuweisen
	With oDlgM
		.setPropertyValue("PositionX", 100)
		.setPropertyValue("PositionY", 100)
		.setPropertyValue("Width", 350)
		.setPropertyValue("Height", 195)
		.setPropertyValue("BackgroundColor", RGB(255,255,255)	'Hintergrundfarbe
		.setPropertyValue("Title", "Programm zur Bearbeitung der Pseudo-Kopfzeilen innhalb des Writer-Dokuments")
	End With
REM Textlabel erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
	With oMod
		.setPropertyValue("Name", "Text2")
		.setPropertyValue("PositionX", 20)
		.setPropertyValue("PositionY", 10)
		.setPropertyValue("Width", 310)
		.setPropertyValue("Height", 140)
		.setPropertyValue("BackgroundColor", RGB(250,230,0)	'Hintergrundfarbe
		.setPropertyValue("Border", 1)	
		.setPropertyValue("Label", chr(10) & " Die regulären Kopfzeilen sind in diesem Writer-Dokument, innerhalb der Seitenvorlagen absichtlich deaktiviert." & chr(10) & _
							" Anstelle der regulären Kopfzeilen, wird auf jeder Seite per Makro die erste Zeile"  & chr(10) & _
								" mittels Absatzvorlagen formatiert und der jeweilige Text eingefügt."  & chr(10) &  chr(10) & _
									" Das Makro erwartet eine Calc-Datei namens >>> Kopfzeilen_Texte.ods <<<" & chr(10) & _
										" Jede andere Datei-Auswahl führt zu einem Fehler und zu einem Programmabbruch!"  & chr(10) & chr(10) &_
											" Die Datei >>> Kopfzeilen_Texte.ods <<< enthält die Texte für die Pseudokopfzeilen." & chr(10) & _
												" Änderungen der Texte können nur in der Calc-Datei vorgenommen werden." & chr(10) & _
													" Die Zeilen 1-10 enthalten die Texte für die linken Seiten des Dokuments." & chr(10) & _
														" Die Zeilen 11-20 enthalten die Texte für die rechten Seiten des Dokuments." & chr(10) & _
															" Mehr als zwanzig Einträge, werden vom Makro nicht berücksichtigt!"& chr(10) & chr(10) &_
																" Wenn das Programm zur Bearbeitung der Writer-Datei gestartet werden soll," & chr(10) &_
																	" dann klicken Sie bitte auf den Button 'Start', ansonsten 'Abbruch'" & chr(10))
	End With
	oDlgM.insertByName("Text2", oMod)
	
REM Button erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlButtonModel")
	With oMod
		.setPropertyValue("Name", "btn")
		.setPropertyValue("PositionX", 260)
		.setPropertyValue("PositionY", 160)
		.setPropertyValue("Width", 65)
		.setPropertyValue("Height", 20)
		.setPropertyValue("Label", "Abbruch/ Beenden" )
	End With
	oDlgM.insertByName("btn", oMod)

REM den eben erzeugten Button klonen (vor der Anzeige des Dialogs)
	oMod = oMod.CreateClone
	With oMod
		.Setpropertyvalue("PositionX",25)
		.Setpropertyvalue("PositionY",160)
		.Setpropertyvalue("Name","btnStart")
		.SetpropertyValue("Label", "Start"
	End With
	oDlgM.insertByName("btnStart", oMod)

REM den eben erzeugten Button klonen (vor der Anzeige des Dialogs)
	oMod2 = oMod.CreateClone
	With oMod2
		.Setpropertyvalue("PositionX",115)
		.Setpropertyvalue("PositionY",160)
		.setPropertyValue("Width", 120)
		.Setpropertyvalue("Name","btnStart")
		.SetpropertyValue("Label", "Texte der Pseudo-Kopfzeilen löschen"
	End With
	oDlgM.insertByName("btnDelete", oMod2)

REM Dialog ertellen 
	oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
	oDlg.setModel(odlgM)
	
REM Listener für Abbruch-Button
	oListenerClone = CreateUnoListener("btn_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btn")
	oControl.addActionListener(oListenerClone)
	
REM Listener für den geklonten Button
	oListenerClone = CreateUnoListener("btnStart_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnStart")
	oControl.addActionListener(oListenerClone)
	
REM Listener für den geklonten Button
	oListenerClone2 = CreateUnoListener("btnDelete_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnDelete")
	oControl.addActionListener(oListenerClone2)	
	
REM Dialog anzeigen
	oWin = createUnoService("com.sun.star.awt.Toolkit")
	oDlg.createPeer(oWin, null)
	oDlg.execute
End Sub

'Aktion bei Klick auf 'Abbrechen'
Sub btn_actionPerformed(oEvent)
	oDlg.EndExecute
End Sub

REM Aktion Pseudo-Kopfzeilen eintragen und formatieren
Sub btnStart_actionPerformed(oEvent)
	'Listener für geklonten Button
	oListenerClone = CreateUnoListener("btnStart_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnStart" & cStr(iMax))
	oControl.addActionListener(oListenerClone)
		Dateidialog
End Sub

REM Aktion Pseudo-Kopfzeilen löschen
Sub btnDelete_actionPerformed(oEvent1)
	oListenerClone2 = CreateUnoListener("btnDelete_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnDelete" & cStr(iMax))
	oControl.addActionListener(oListenerClone2)
'Dim nResult As Integer

'	If bTrue=True then Exit Sub
'	' 1= OK  2 = Cancel
'	nResult = MsgBox("Wollen Sie wirklich alle Texte in den Pseudo-Kopfzeilen löschen?", 305, "WARNUNG!")
'	
'	If nResult = 1 then
'			Msgbox "Die Texte der Kopfzeilen werden gelöscht", 64, "Texte werden gelöscht!"
'				bTrue=True
'					Kopfzeileloeschen
'	ElseIf nResult = 2 then
'			Msgbox "Die Aktion wird abgebrochen!", 48, "Texte werden nicht gelöscht!"
'				bTrue=True
'					Exit Sub
'	End If

	Kopfzeileloeschen

End Sub
REM ???????????????????????? ENDE DIALOG-ROUTINE ??????????????????????????????????????????????????????????

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
Sub Dateidialog
On Error GoTo ErrorHandler
REM Laden der Bibliothek "Tools" mit den Hilfsfunktionen
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )

		MsgBox "Der nachfolgende Dateidialog fordert sie zum Öffnen dieser Datei auf:" & chr(10) & _ 
					">>> Kopfzeilen_Texte.ods <<<" & chr(10) & _ 
					"Wählen Sie zunächst den korrekten Pfad zu dieser Datei aus." ,64,"Hinweis"
	' Filepicker (Datei-Dialog
	ChooseAFileName
		
		sExt=getFileNameExtension(sUrl)
			' Fehlermeldung für den Fall, dass kein Calc-Dokument ausgewählt wurde
			if sExt <> "ods" then 
				MsgBox("Bitte wählen Sie ein Calc-Dokument aus!" & chr(10) & _
							"Das Programm wird beendet!"  & chr(10)   & chr(10) & _
								"Starten Sie das Programm erneut.", 48, "Fehler: Dateiauswahl")
					exit sub
			end if
REM Calc-Datei im Hintergrund öffnen
Call FileOperation

REM Routine für die Pseudo-Kopfzeilen aufrufen
Call Seite
Exit Sub
REM ErrorHandler für den Fall, dass im Dateidialog auf "ABRUCH" geklickt wurde
ErrorHandler:
Msgbox "Sie haben den Dateidialog abgebrochen!" & chr(10) & _
			"Starten Sie das Programm erneut und wählen eine Calc-Datei aus!", 48, "Fehler: Anwender hat Dateiauswahl abgebrochen!"
End Sub

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
REM Calc-Datei im Hintergrund öffnen
REM Dateioperation: Datei öffnen und auslesen
Sub FileOperation
n = FreeFile                  		' Immer nötig. Nächste freie Dateinumer
Open sUrl For Input As #n  			' Datei zum Lesezugriff öffnen
Do While NOT EOF(n)            		' Solange NOT End Of File
  Input #n, s                  		' Daten werden gelesen

REM Hier werden die Daten verarbeitet

	' Objekt-Eigenschaften
	Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
	
	' Dokument im Hintergrund öffnen
	FileProperties(0).Name = "Hidden"
	FileProperties(0).Value = true

	FileProperties(1).Name = "AsTemplate"
	FileProperties(1).Value = true
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
		' Datei öffnen
		oDocC = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, FileProperties())
'mri oDocC
			' Daten aus Tabelle einlesen und in die Arrays verteilen
			' mArray1() = Daten für die linke Seite (gerade Seitenzahl)
			mArray1()=oDocC.Sheets().getByName("KopfZeilenTexte").getCellRangeByName("A1:B10").getDataArray()

			' mArray2() = Daten für die rechte Seite (ugerade Seitenzahl)
			mArray2()=oDocC.Sheets().getByName("KopfZeilenTexte").getCellRangeByName("A11:B20").getDataArray()
			
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????		
			' Datei nur einmal öffnen			
			x="true"
			if x = "true" then exit do
Loop
	' Calc-Datei korrekt schließen
	CloseDocC
End Sub

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
REM Datei mit Filepicker öffnen
Function ChooseAFileName() As String
  Dim vFileDialog         			' Instanz des Service FilePicker
  Dim vFileAccess         			' Instanz des Service SimpleFileAccess
  Dim iAccept as Integer  			' Rückgabe vom FilePicker
  Dim sInitPath as String 			' Der Startpfad

  ' Achtung: Die folgenden Services müssen in dieser Reihenfolge
  ' aufgerufen werden, sonst wird Basic den vFileDialog nicht wieder entfernen.
  vFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
  vFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")

  ' Jetzt wird der Startpfad gesetzt.
  sInitPath = ConvertToUrl(CurDir)
  If vFileAccess.Exists(sInitPath) Then
    vFileDialog.SetDisplayDirectory(sInitPath)
  End If
  
  iAccept = vFileDialog.Execute()       		' Der Dateiauswahldialog wird ausgeführt.
  If iAccept = 1 Then                   		' Prüfung des Rückgabewerts des Dialogs.
    ChooseAFileName = vFileDialog.Files(0) 		' Rückgabe des Dateinamens, falls
                                         		' der Dialog nicht abgebrochen wurde.
	sUrl = ChooseAFileName
  End If
  vFileDialog.Dispose()                 		' Der Dialog wird entfernt.
End Function
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
REM Datei korrekt schließen
Sub CloseDocC
	If HasUnoInterfaces(oDocC, "com.sun.star.util.XCloseable") Then
	  oDocC.close(true)
	Else
	  oDocC.dispose()
	End If
End Sub
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????


REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
Sub Seite
'Dim oStar as Object
'Dim oDocW as Object
Dim oCC as Object
Dim oVC as Object
Dim oText as Object
Dim oEndCursor as Object
Dim oStartCursor as Object
Dim nDiv%
'mri oStar	
	oDocW=ThisComponent
	oCC=oDocW.CurrentController
	oVC = oCC.getViewCursor
	oVC.jumpToPage(2)
'mri oVC

' Berechnung der erforderlichen Durchläufe
nDiv=nSeite/10			' 10 = Anzahl der Arrayfelder

	' Schleife über je 10 Arrayfelder
	for i = 0 to 9
		' 
		for j = 0 to nDiv
		
			' gerade Seitenzahl	= linke Seite
			if oVC.Page mod 2 = 0 then			
				With oVC
					.jumpToStartOfPage(False)
					.ParaStyleName="_Gl_Text-8_pt_Kopf_Gerade_Rechts bündig"
					.String=mArray1(i)(1)
'					.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
					.collapseToEnd
					.collapseToStart
					.jumpToNextPage					
				End With

			' ungerade Seitenzahl = rechte Seite
			else
				With oVC
					.jumpToStartOfPage(False)
					.ParaStyleName="_Gl_Text-8_pt Kopf_Ungerade_Links bündig"
					.String=mArray2(i)(1)
'					.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
					.collapseToEnd
					.collapseToStart
					.jumpToNextPage					
				End With
			end if
		
		next j
	next i

	MsgBox("Die Kopfzeileninhalte wurden ab Seite 2 bis zur Seite " & nSeite & " eingetragen!", 64, "Programmende: Kopfzeilen-Einträge")
End Sub

REM ???????????????????????????????????????????????????????????????????????????????????????????????????????
Sub Kopfzeileloeschen
Dim oCC as Object
Dim oVC as Object
Dim oText as Object
Dim oEndCursor as Object
Dim oStartCursor as Object
Dim nDiv%	

	oDocW=ThisComponent
	oCC=oDocW.CurrentController
	oVC = oCC.getViewCursor
	oVC.jumpToPage(2)
'mri oVC

' Berechnung der erforderlichen Durchläufe
nDiv=nSeite/10			' 10 = Anzahl der Arrayfelder

	' Schleife über je 10 Arrayfelder
	for i = 0 to 9
		for j = 0 to nDiv
		
			' gerade Seitenzahl	= linke Seite
			if oVC.Page mod 2 = 0 then			
				With oVC
					.jumpToStartOfPage(False)
					.ParaStyleName="_Gl_Text-8_pt_Kopf_Gerade_Rechts bündig"
					.gotoEndOfLine(true)
					.String="" 'mArray1(i)(1)
'					.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
					.collapseToEnd
					.collapseToStart
					.jumpToNextPage					
				End With
		
			' ungerade Seitenzahl = rechte Seite
			else
				With oVC
					.jumpToStartOfPage(False)
					.ParaStyleName="_Gl_Text-8_pt Kopf_Ungerade_Links bündig"
					.gotoEndOfLine(true)
					.String="" 'mArray2(i)(1)
'					.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE
					.collapseToEnd
					.collapseToStart
					.jumpToNextPage					
				End With
			end if
		
		next j
	next i

		MsgBox("Die Kopfzeileninhalte wurden von Seite 2 bis " & nSeite & " gelöscht!", 15, "Programmende: Kopfzeilen-Löschung")

End Sub
REM ???????????????????????????????????????????????????????????????????????????????????????????????????????


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

Re: Calc Tabelle in ein Makro einbinden

Beitrag von Stephan »

In meinem Buch gibt es nur eine Anleitung auf der Basis Base.
Ist das so?
In meinem vorhandenen Makro werden aber Calc-Tabellen verendet.
DU SELBST hast bereits geschrieben das:

"Ich habe einige Muster. Die basieren auf einer Calc Tabelle, in die sind Felder eingefügt, die mit Code hinterlegt sind."

darauf habe ich Dir geantwortet das das ein Formular ist.

Ob es dafür Anleitungen gibt weiß ich nicht, ein kleines Beispiel gibt es in http://de.openoffice.info/viewtopic.php?f=18&t=1553 ziemlich weit unten unter "Beispieldateien" die Datei "ComboBox_in_a_Sheet_En.ods"

In dem Makro gibt es eine starre Formel, die 240 Seiten voraussetzt.
In Deinem Beispielcode ist keine Formel ersichtlich, nur eine Konstante die den Wert 240 hat.
Die möchte ich aber mit der hochgeladenen Formel ersetzen.
Welche Formel soll das sein?
In der Datei aus dem ersten Post ("_Kopfzeilen_berechnet_Kürzt_1.ods") gibt es zwar einige Formeln, aber ich sehe da keinen Zusammenhang.

genauer gesagt:
Wenn Du statt einer Konstante im Makro einen flexiblen Wert verwenden willst musst Du diesen irgendwie eingeben/einlesen, bei einem einzelnen Wert zweckmäßigerweise mit einer INPUT-Box oder auch, eleganter, per Dialog. Es kann aber auch erwünscht sein den Wert erst in einer Calc-Tabelle, aus anderen Werten, auszurechnen und dann einzulesen.
Was für Deinen Zweck der beste Weg ist, kann Dir aber niemand 'vom grünen Tisch aus' beantworten.

Der einfachste Weg wäre, wie schon geschrieben, eine INPUT-Box, was sich allgemein so einbauen liesse:

Code: Alles auswählen

'...
Global nSeite As Integer
'...

Sub DeinMakro()
  '...
  nSeite = 240
  nSeite = InputBox("Bitte Seitenzahl eingeben/anpassen:", "Seitenzahl", nSeite)
  '...
End Sub
Auf den Beispielcode bezogen, also so:

Code: Alles auswählen

REM  *****  BASIC  *****
REM
REM ═══════════════════════════════════════════════════════════════════════════════════════════════════════	
REM  				Die Haupt-/ Startroutine heisst: StartKopfzeile
REM Es wird ein Dialog mit Steuerlementen und einem Textfeld mit weiteren Informationen 
REM zur Programmbenutzung per Code erzeugt.
REM 
REM Einlesen der Kopfzeilen-Texte aus einer Calc-Tabelle. Die Texte MÜSSEN im Zellbereich B1:B20 stehen!
REM Seitenberechnungen von Seite 2 - nSeite (siehe const nSeite=240) gleich hier oben am Anfang des Programms.
REM Formatierung jeder ersten Zeile einer Seite per Absatzvorlage, 
REM dabei Differenzierung zwischen linker und rechter Seite.
REM Eintragen der entsprechenden Texte, in Abhängigkeit der Seitenberechnung und Seite links/rechts
REM Rücksprung in die Hauptroutine
REM ═══════════════════════════════════════════════════════════════════════════════════════════════════════

REM Konstante für die zu bearbeitenden Seiten
'Const nSeite=240

REM Deklaration der Varaiblen
Dim oDocW as Object			' Writer-Dokument
Dim oDocC as Object			' Calc-Dokument (wird versteckt geöffnet)
Dim oCC as Object			' CurrentController
Dim oVC as Object			' ViewCursor
Dim mArray1 				' Array für die Kopfzeilen-Texte (linke Seite)
DIm mArray2 				' Array für die Kopfzeilen-Texte (rechte Seite)
Dim sUrl					' URL-Pfad Calc-Datei
Dim bTrue as Boolean

Global nSeite As Integer

REM Deklaration der Objektvariablen des Programmdialogs
Dim oDlg as Object

REM Start der Hauptroutine
Sub StartKopfzeile
Dim oDlgM as Object 	' das Modell des Dialogs
Dim oMod as Object 		' nimmt jeweils das Modell der Objekte auf

nSeite = 240
nSeite = InputBox("Bitte Seitenzahl eingeben/anpassen:", "Seitenzahl", nSeite)

REM das Dialogmodell erzeugen
	oDlgM = createUnoService("com.sun.star.awt.UnoControlDialogModel")
REM Eigenschaften zuweisen
	With oDlgM
		.setPropertyValue("PositionX", 100)
		.setPropertyValue("PositionY", 100)
		.setPropertyValue("Width", 350)
		.setPropertyValue("Height", 195)
		.setPropertyValue("BackgroundColor", RGB(255,255,255)	'Hintergrundfarbe
		.setPropertyValue("Title", "Programm zur Bearbeitung der Pseudo-Kopfzeilen innhalb des Writer-Dokuments")
	End With
REM Textlabel erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
	With oMod
		.setPropertyValue("Name", "Text2")
		.setPropertyValue("PositionX", 20)
		.setPropertyValue("PositionY", 10)
		.setPropertyValue("Width", 310)
		.setPropertyValue("Height", 140)
		.setPropertyValue("BackgroundColor", RGB(250,230,0)	'Hintergrundfarbe
		.setPropertyValue("Border", 1)	
		.setPropertyValue("Label", chr(10) & " Die regulären Kopfzeilen sind in diesem Writer-Dokument, innerhalb der Seitenvorlagen absichtlich deaktiviert." & chr(10) & _
							" Anstelle der regulären Kopfzeilen, wird auf jeder Seite per Makro die erste Zeile"  & chr(10) & _
								" mittels Absatzvorlagen formatiert und der jeweilige Text eingefügt."  & chr(10) &  chr(10) & _
									" Das Makro erwartet eine Calc-Datei namens >>> Kopfzeilen_Texte.ods <<<" & chr(10) & _
										" Jede andere Datei-Auswahl führt zu einem Fehler und zu einem Programmabbruch!"  & chr(10) & chr(10) &_
											" Die Datei >>> Kopfzeilen_Texte.ods <<< enthält die Texte für die Pseudokopfzeilen." & chr(10) & _
												" Änderungen der Texte können nur in der Calc-Datei vorgenommen werden." & chr(10) & _
													" Die Zeilen 1-10 enthalten die Texte für die linken Seiten des Dokuments." & chr(10) & _
														" Die Zeilen 11-20 enthalten die Texte für die rechten Seiten des Dokuments." & chr(10) & _
															" Mehr als zwanzig Einträge, werden vom Makro nicht berücksichtigt!"& chr(10) & chr(10) &_
																" Wenn das Programm zur Bearbeitung der Writer-Datei gestartet werden soll," & chr(10) &_
																	" dann klicken Sie bitte auf den Button 'Start', ansonsten 'Abbruch'" & chr(10))
	End With
	oDlgM.insertByName("Text2", oMod)
	
REM Button erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlButtonModel")
	With oMod
		.setPropertyValue("Name", "btn")
		.setPropertyValue("PositionX", 260)
		.setPropertyValue("PositionY", 160)
		.setPropertyValue("Width", 65)
		.setPropertyValue("Height", 20)
		.setPropertyValue("Label", "Abbruch/ Beenden" )
	End With
	oDlgM.insertByName("btn", oMod)

REM den eben erzeugten Button klonen (vor der Anzeige des Dialogs)
	oMod = oMod.CreateClone
	With oMod
		.Setpropertyvalue("PositionX",25)
		.Setpropertyvalue("PositionY",160)
		.Setpropertyvalue("Name","btnStart")
		.SetpropertyValue("Label", "Start"
	End With
	oDlgM.insertByName("btnStart", oMod)

REM den eben erzeugten Button klonen (vor der Anzeige des Dialogs)
	oMod2 = oMod.CreateClone
	With oMod2
		.Setpropertyvalue("PositionX",115)
		.Setpropertyvalue("PositionY",160)
		.setPropertyValue("Width", 120)
		.Setpropertyvalue("Name","btnStart")
		.SetpropertyValue("Label", "Texte der Pseudo-Kopfzeilen löschen"
	End With
	oDlgM.insertByName("btnDelete", oMod2)

REM Dialog ertellen 
	oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
	oDlg.setModel(odlgM)
	
REM Listener für Abbruch-Button
	oListenerClone = CreateUnoListener("btn_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btn")
	oControl.addActionListener(oListenerClone)
	
REM Listener für den geklonten Button
	oListenerClone = CreateUnoListener("btnStart_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnStart")
	oControl.addActionListener(oListenerClone)
	
REM Listener für den geklonten Button
	oListenerClone2 = CreateUnoListener("btnDelete_", "com.sun.star.awt.XActionListener")
	oControl = oDlg.getControl("btnDelete")
	oControl.addActionListener(oListenerClone2)	
	
REM Dialog anzeigen
	oWin = createUnoService("com.sun.star.awt.Toolkit")
	oDlg.createPeer(oWin, null)
	oDlg.execute
End Sub

'... 
Erbarmt sich, jemand eines Schriftstellers?
Das tun hier seit Wochen etliche Forumsteilnehmer.
Wenn möglicherweise inzwischen die Antworten spärlicher werden, dann wohl weil in zwischen Einige davor kapitulieren Fragen zu beantworten, deren Zusammenhang man kaum versteht.



Gruß
Stephan
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Calc Tabelle in ein Makro einbinden

Beitrag von martin11 »

Hallo Stephan,
mit dem verstehen ist das für mich so eine Sache.
Offensichtlich habe ich eine ganz andere Sprache als Programmierer.
Dass die 240 und was dazu gehört, nicht als Formel bezeichnet, war mir nicht klar.
Ich werde nochmal versuchen, meine gedachte Aufgabenstellung anders zu beschreiben.
Martin
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc Tabelle in ein Makro einbinden

Beitrag von Stephan »

@Alle Teilnehmer
Ich versuche nochmals etwas Klarheit in die Materie zu bringen. ...
ja, danke, aber ich verabschiede mich hier jetzt aus dem Thema. Ich habe mir Martins Problem vor Wochen angesehen, über Wochen habe ich danach wieder und wieder Fragen beantwortet und jetzt erlebe ich das wir faktisch wieder am Anfang stehen.
Mein "On the fly" programmiertes Dialogfenster, muss nicht zwingend als Formular aufgebaut sein!
In der Tat, das hatte ich inzwischen auch vermutet, also war der komplette Thread von Anfang an wieder völlig sinnlos. Ein Eindruck der bei mir auch bei etlichen anderen Threads in den letzten Wochen aufkam.



Gruß
Stephan
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Calc Tabelle in ein Makro einbinden

Beitrag von Toxitom »

Hallo zusammen,

auch wenn schon viel über diese Thema diskutiert und geholfen wurde und es bereits umfangreiche Makros gibt, würde ich gerne noch mal eine grundsätzliche Empfehlung geben:

Überdenkt den kompletten Prozess!

Ich verstehe den Hintergrund und den Wunsch von Martin, halte aber den Weg mit dem "Einfügen eines zusätzlichen Ansatzes etc" für falsch. Dieser zerstört den Textfluss des Buches und den Sinn der Textverarbeitung. Eine Kopfzeile ist nie Teil des Textflusses und sollte es auch nicht werden!

Wenn man die eingebauten Möglichkeiten nicht nutzen möchte ( die Gründe wurden ja dargelegt - ich will sie nicht diskutieren ) wäre meiner Ansicht die korrekte Realisierung durch Einfügen eines Textrahmens. Diesen würde ich an der Seite verankern, porrekt plazieren, mit entsprechenden Abständen zum Text ausstatten sowie den Textfumlauf auf "kein" stellen.

Ein solcher Rahmen stört nicht den Textfluss, lässt sich aber korrekt platzieren - auch auf Seiten mit Index-Einträgen oder Verzeichnissen.

@Martin: Makro Buch Band 2, kapitel 9.3.4 Textrahmen - ab S. 89 ff

Der Rahmen kann durch Schleifen auf jede Seite eingetragen und dann mit Inhalt gefüllt werden - sollte also die Anforderunge erfüllen und hätte noch Potential, die (noch kommenden) Wünsche zu erfüllen.

Soll als Denkanstoss dienen ... ich schreibe das Makro nicht;)

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag von mikeleb »

Hallo,
so etwas ähnliches habe ich hier https://www.libreoffice-forum.de/viewto ... 836#p32836 schon einmal gelöst (in der Art, wie Toxitom empfiehlt).
Gruß,
mikeleb
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag von mikeleb »

Hallo,
wenn es klare Kriterien gibt, auf welchen Seiten eine solche "Kopfzeile" (mit variablem Text) erscheinen soll, dürfte das kein Problem darstellen. grundsätzlich muss auf allen solchen Seiten die reguläre Kopfzeile aktiviert werden, um Platz für den Textrahmen zu schaffen.
Für die Verteilung der Kopfzeilentexte auf die Seiten muss ebenfalls eine klare Festlegung her. Aus den bisherigen Beschreibungen werde ich nicht schlau:
Wenn es z. B. n=257 Seiten gibt und dafür a=10 Kopfzeilentexte rechts und a=10 Kopfzeilentexte links. Dann gibt es für je 257/20=12,85 Seiten denselben Kopfzeilentext. Da das natürlich nicht geht, heißt es ein bisschen rechnen und kommt auf 3x12 Seiten mit je einem Text und 17x13 Seiten mit je einem Text. Ist es so gemeint? Nun muss man sich nur noch entscheiden, ob man mit den 13er Blöcken oder den 12er Blöcken anfängt.
Dazu bedarf es etwas mehr an Informationen.
Gruß,
mikeleb
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Calc Tabelle in ein Makro einbinden

Beitrag von martin11 »

Hier noch mal mit ergänzenden Texte eine Erklärung für meine Idee
von der festen Seitenzahl 240 in dem Modul wegzukommen.
Martin
_Kopfzeilen_berechnet_Kürzt_1.ods
(22.12 KiB) 101-mal heruntergeladen
Faol hat das Modul ja noch mal beschrieben.
Der mir das dankenswerterweise erstellt hat.

Aber so ist das, die Wünsche der User sind unermesslich.
Martin
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag von mikeleb »

Hallo,
auch nach mehrfachem Lesen verstehe ich es nach wie vor nicht.
@Faol: Nach dieser Berechnung bedeutet es, dass die Anzahl der Abschnitte ein Teiler der Anzahl der Seiten sein muss. Wenn die Anzahl der Seiten nun eine Primzahl ist, geht es gar nicht(z. B. 241 Seiten). Bei z. B. 262 Seiten gäbe es nur zwei Abschnitte. Soll das so?
Nach den Fehlermeldungen, die du im Makro einbaut hast, vermute (???) ich, dass es so nicht sein soll.
Ich kann mir aber auch nicht vorstellen, dass es bei 240 Seiten 12 Abschnitte geben soll und bei 244 Seiten nur noch 4 ...
---
Daher noch einmal die Frage: Nach welcher Regel/Prinzip sollen die Kopfzeilentexte (Wie viele sind es? Variabel?) auf die Buchseiten (Alle außer der ersten? Nur im "eigentlichen" Textbereich"? Auch in Verzeichnissen? Auf leeren Seiten? ...) verteilt werden? Immer links und rechts? Sind auch ungeradzahlige Abschnittslängen möglich/zulässig? ...
Gruß,
mikeleb
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag von mikeleb »

Hallo Faol,
soweit ist das klar. Nur sehe ich das Problem nicht.
Es sind n Seiten. Es gibt k Kopfzeilentexte (für links und für rechts). Die Frage ist nun eigentlich nur noch, wie die Abschnitte entstehen sollen - nach inhaltlicher Vorgabe, gleichmäßig verteilt, ...
Müssen alle Kopfzeilentexte verwendet werden? Werden so viele kreiert, wie notwendig werden? ...
Gruß,
mikeleb
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Calc Tabelle in ein Makro einbinden

Beitrag von mikeleb »

Hallo,
wenn 20 Texte möglichst gleichmäßig auf 252 Seiten verteilt werden sollen: 8 Abschnitte á 12 Seiten und 12 Abschnitte á 13 Seiten.
252:20=12,6 -> also müssen es pro Abschnitt 12 oder 13 Seiten sein. Es muss also 12·a+13·b=252 gelten, wobei a+b=20 ist.
12·a+13·(20-a)=252 oder 260-252=13a-12a und somit: a=260-252
Ist m der aufgerundete Werte von 252:20 (Seiten n:Texte k), dann gilt allgemein a=m·k-n und b=k-a
Soweit die Theorie ...
Das geht soweit immer. Allerdings ist dann immer eine Seitenanzahl (eines Abschnittes) ungeradzahlig. Darf das sein? Gibt es weitere Bedingungen ...?
Die Bedingung, dass jeder Abschnitt eine gerade Anzahl von Seiten hat, lässt sich auch lösen:
12·a+14·b=252 mit a+b=20 -> a=14 und b=6, also 14 Abschnitte á 12 Seiten und 6 Abschnitte á 14 Seiten )geht auch immer, wenn die Gesamtseitenanzahl ganzzahlig ist.
Bleibt immer noch die Frage (an Martin) ob das so sein soll?
Gruß,
mikeleb
Antworten