Laufen OO 1.x Macros auch unter OO 2.0?

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

Moderator: Moderatoren

Mandalor
*
Beiträge: 16
Registriert: Mi, 12.01.2005 13:01
Wohnort: Gohrisch

Laufen OO 1.x Macros auch unter OO 2.0?

Beitrag von Mandalor »

Hallo,

ja meine Frage steht reigentlich schon komplett in der Überschrift^^

Ich habe dazu aber nichts genaues im inet gefunden. Ich habe da ein paar und die laufen eben nicht richtig unter 2.0 nun wollte ich wissen ob ich sie nicht richtig eingebunden habe, oder ob sie echt nicht laufen können???
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

hey Mandalor,

Hmm, so einfach nicht zu beantworten. Zwischen OOo 1.0.x und OOo 1.1.x gab es schon diverse Anpassungen der API - da gab es schon Änderungen, und manche Makros dürften nicht mehr laufen.
Zwischen 1.1.x und 2.0 gab es API-Erweiterungen (sowie geringfügige Korrekturen), normalerweise laufen aber alle Makros von Version 1.1 auf der 2.0 Version.
Änderungen habe ich festgestellt bei Formularen und Dialogen - die Texteigenschaft mancher Obkjekte ist geändert worden - ansonsten gab es Änderungen bie Impress (und somit auch Draw) - aber in der Summe....

Poste einfach die Fehlermeldungen und die entsprechenden Code-Stücke, dann finden wir schon die Fehler.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mandalor
*
Beiträge: 16
Registriert: Mi, 12.01.2005 13:01
Wohnort: Gohrisch

Beitrag von Mandalor »

Toxitom ich würde hiermit gern auf dein Angebot zurückkommen:

in einem der Macros wird folgende Funktion aufgerufen:

function isMember(value as String, array() as String) as boolean

...

end function

direkt beim Aufruf wird die Zeile function isMember... Markiert und es kommt der Fehler "Basic Laufzeitenfehler Objektvariable nicht belegt"

Hast du oder einer von euch anderen eine Idee???
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Mandalor,
Hast du oder einer von euch anderen eine Idee???
Na ja, der erste Blick zeigt scon einen Fehler:
... isMember(value as String, array() as String)...
eine Array-Variable kannst du nicht als String definieren. Lass die Klammern hinter "array" weg, dann ist der Fehler erst mal behoben.
Ob die Funktionalität aber noch wie gewünscht gegeben ist, kann ich nicht sagen - da fehlen mir Infos.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mandalor
*
Beiträge: 16
Registriert: Mi, 12.01.2005 13:01
Wohnort: Gohrisch

Beitrag von Mandalor »

Hi, wollte die Frage gerade zurückziehen:

Ich habe selbst etwas programmiert äh ich meine eher experimentiert:

function isMember( value as String , array as variant) as boolean

so funktioniert es^^

trotzedm danke, ich habe den code jetzt fast komplett oo2.0 fähig gemacht, ich hänge nur noch an einem punkt:

zur vorgeschichte: ich lasse über einen dialog einen Wert aus einer liste auswählen. Beim druck auf einen Button wird dann eine Funktion aufgerufen, welche daraus ein Benutzerdefiniertes Feld im Dokument erstellen soll:

Code: Alles auswählen

sub insertDocField(byVal sName as String, byVal value as String)
dim document   as object
	dim dispatcher as object
	'msgbox sName + "=" + value

	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

	dim args1(5) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "Type"
	args1(0).Value = 20
	' 6 - Statistik
	' 7 Benutzer ??
	' 21 Notiz
	' 22 Dokumentenvorlage
	args1(1).Name = "SubType"
	args1(1).Value = 0
	args1(2).Name = "Name"
	args1(2).Value = sName 
	args1(3).Name = "Content"
	args1(3).Value = value
	args1(4).Name = "Format"
	args1(4).Value = 0
	args1(5).Name = "Separator"
	args1(5).Value = " "

	dispatcher.executeDispatch(document, ".uno:InsertField", "", 0, args1())
end sub
Wenn ich diese Funktion aus einer sub mit stratischen werten aufrufe, funktioniert alles, aber wenn ich über die dialogbox gehe, fügt er nichts ein (wirft aber auch keinen fehler).
Ich vermute, dass es am Focus liegt, welcher noch nicht wieder im Document liegt.

Daher bedarf diese Zeile eine Änderung???:

document = ThisComponent.CurrentController.Frame

aber da gehen mir im Moment die Ideen aus, ich versuchs weiter, aber wenn du ne Idee hast, wäre ich froh!


MfG und Danke für die Unterstützung:

der Markus

edit: unter 1.x hat es so schon funktioniert
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Mandalor,
Ich vermute, dass es am Focus liegt, welcher noch nicht wieder im Document liegt.
Da hast du sicher recht - wenngleich es warscheinlich nicht der Fokus ist - sondern der Controller und der durch diesen gesteuerte Veiwcursor.
Wo hast du denn den Dispatcher-Code her? Über den Makrorekorder generiert?
Also, ich hätte da zwei Ideen:
1. die Sauberste: Dispatcher-Code raus und nativ programmieren. OK, macht etwas Arbeit und bedarf etwas Recherche.
2. Variante: Brauchst du die Dialogbox noch nachdem der Wert ausgelesen wurde? Wenn nicht, beende den Dialog zunächst (.endexecute()) und übergib dann erst die Werte der neuen Sub insertDocField().
Dadurch sollte der Fokus wieder auf dem ürsprünglichen Dokument landen und der Dispatcher kann seine Arbeit erledigen.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mandalor
*
Beiträge: 16
Registriert: Mi, 12.01.2005 13:01
Wohnort: Gohrisch

Beitrag von Mandalor »

Ja der Code is aus dem Macrorecorder und wurde danach angepasst.

ICh versuche das mal mit dem schliessen der Dialogbox (wird im moment erst danach geschlossen), danach folgt dann die 2. Varianle )-:

THX


PS.: Nettes Buch, habe ich auf meinen Wunschzettel fürs bevorstehende Fest gesetzt.
Mandalor
*
Beiträge: 16
Registriert: Mi, 12.01.2005 13:01
Wohnort: Gohrisch

Beitrag von Mandalor »

ok erstmal: dialog vorher schließen funzt leider nicht! (Arrrrrrrr wäre auch zu schön gewesen)

document = ThisComponent.CurrentController.Frame

--> kann ich mir das document auch anders holen? (Sorry bin absoluter ooMacroanfänger)

das muss ja meiner Meinung nach der Schlüssel zum erfolg sein! oder kann ich den Focus vorher nochma Programmatisch aufs doc setzen?

Was ich mir auch überlegt habe ist die Auswahl anders zu gestallten, aber da sind für mich die Dialoge die einzige Möglichkeit, oder gibts da noch was anderes? --> im Doc selber so ne auswahl einzubauen, ist leider keine alternative für dieses Projekt.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Mandalor,
kann ich mir das document auch anders holen?
Na ja, normalerweise holt du dir dein Dokument nur mit

Code: Alles auswählen

oDocument = thisComponent
Du holst dir ja eigentlich den aktuelle Frame des Dokumentes - über den Controller. Sollte aber eigenlich auch funktionieren.

Aber... poste doch mal deinen kompletten Code - soweit relevant. Und sag, warum du ein Feld anlegen willst? Gibt es möglicherweise auch andere Alternativen?
Was wilst du eigentlich genau erreichen?

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Mandalor
*
Beiträge: 16
Registriert: Mi, 12.01.2005 13:01
Wohnort: Gohrisch

Beitrag von Mandalor »

In einer Notesdatenbank werden OO-Dokumente gehalten. Per button wird eines ins Filesystem ausgelagert und geöffnet. Das OO-Dok diehnt als eine Art Vorlage, welche man nun editieren und eben auch FELDER einfügen kann. Danach wir per OOMacro das zurückschreiben nach Notes gestartet. Später kann in notes Das OO-Dok geöffnet und die Felder mit Notesdaten gefüllt werden.


Hat alles Funktioniert (habe ich nicht geschrieben, war ein Kollege) nun habe ich aber die Aufgabe das OO 2.0 fähig zu machen. Das funktioniert nun auch alles wieder außer eben das einfügen der Felder, wobei der Name des Feldes eben aus dem Dialog ausgewählt wird.

Code habe ich nicht bei mir, den schieb ich morgen aus der Firma nach.

PS.: mir das Dokument mal vor dem öffnen der Dialogbox geholt (um das mit dem Focus zu umgehen) aber das hat auch nicht funktionier (warf aber auch keinen Fehler)
Mandalor
*
Beiträge: 16
Registriert: Mi, 12.01.2005 13:01
Wohnort: Gohrisch

Beitrag von Mandalor »

Ok, das wird per button aus der Symbolleiste gestartet:

Code: Alles auswählen

sub createDocField
	if readField("cmd") <> "edit" then
		msgbox(getText(MSG_FUNCTION_ONLY_TEMPLATE), 32, DLG_TITLE)
	else
		call showDlgField
	end if	
end sub
hierbei springt die Funktion, wie sie auch sollte in den else zweig

nun wird folgendes ausgeführt:

Code: Alles auswählen

Sub showDlgField
	DialogLibraries.LoadLibrary("Notes_Office")
	dlgField = CreateUnoDialog(DialogLibraries.Notes_Office.DialogNewField)
	listBox = dlgField.getControl("ListBox1")
	listBox.multipleMode = false

	Dim array
	'msgbox exchangeFields
	array = explode(exchangeFields, ";")
	for i=ubound(array) to 0 step -1
		if array(i)<>"" then call addFieldItem(array(i), array(i))
	next
	listBox.selectItem("Name", true)
	dlgField.Model.Title = DLG_TITLE_ADDFIELDS
	
	dlgField.execute()

End Sub
nach druck auf den ok button im dialog kommt dann das hier:

Code: Alles auswählen

sub addField

'	listBox = dlgField.getControl("ListBox1")
	'Xray.Xray dlgField
'	listBox.add("UHU")
	dim st$
	
	st = listBox.selectedItem

	if listBox.selectedItem <> "" then
		'closeDialog
	   insertDocField(st, st)
	   SetDocumentVariable_temp(st,st)
	end if	

	'RefreshDocField
'	MsgBox "Ein Feld hinzufügen" + listBox.selectedItem
	closeDialog

end sub
Die Funktion insertDocField sieht so aus:

Code: Alles auswählen

sub insertDocField(byVal sName as String, byVal value as String)
dim document   as object
	dim dispatcher as object
	'msgbox sName + "=" + value

	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

	dim args1(5) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "Type"
	args1(0).Value = 20
	' 6 - Statistik
	' 7 Benutzer ??
	' 21 Notiz
	' 22 Dokumentenvorlage
	args1(1).Name = "SubType"
	args1(1).Value = 0
	args1(2).Name = "Name"
	args1(2).Value = sName 
	args1(3).Name = "Content"
	args1(3).Value = value
	args1(4).Name = "Format"
	args1(4).Value = 0
	args1(5).Name = "Separator"
	args1(5).Value = " "
	dispatcher.executeDispatch(document, ".uno:InsertField", "", 0, args1())
end sub
und closeDialog:

Code: Alles auswählen

sub closeDialog
	dlgField.endExecute()
'	dlgField.dispose() --> wenn ich diese Zeile im Code lasse schmiert OpenOffice ab!!!!!!!!!
end sub
Mandalor
*
Beiträge: 16
Registriert: Mi, 12.01.2005 13:01
Wohnort: Gohrisch

Beitrag von Mandalor »

Wollte nur bescheid sagen das sich das Problem erledigt hat (habs gelöst)

die funktion zum einfügen muss direkt nach dem Aufruf des Dialogs erfolgen
Antworten