Laufen OO 1.x Macros auch unter OO 2.0?
Moderator: Moderatoren
Laufen OO 1.x Macros auch unter OO 2.0?
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???
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???
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
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
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
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???
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???
Hey Mandalor,
Ob die Funktionalität aber noch wie gewünscht gegeben ist, kann ich nicht sagen - da fehlen mir Infos.
Gruss
Thomas
Na ja, der erste Blick zeigt scon einen Fehler:Hast du oder einer von euch anderen eine Idee???
eine Array-Variable kannst du nicht als String definieren. Lass die Klammern hinter "array" weg, dann ist der Fehler erst mal behoben.... isMember(value as String, array() as String)...
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
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
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:
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
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
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
Hey Mandalor,
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
Da hast du sicher recht - wenngleich es warscheinlich nicht der Fokus ist - sondern der Controller und der durch diesen gesteuerte Veiwcursor.Ich vermute, dass es am Focus liegt, welcher noch nicht wieder im Document liegt.
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
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
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.
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.
Hey Mandalor,
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
Na ja, normalerweise holt du dir dein Dokument nur mitkann ich mir das document auch anders holen?
Code: Alles auswählen
oDocument = thisComponent
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
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
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)
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)
Ok, das wird per button aus der Symbolleiste gestartet:
hierbei springt die Funktion, wie sie auch sollte in den else zweig
nun wird folgendes ausgeführt:
nach druck auf den ok button im dialog kommt dann das hier:
Die Funktion insertDocField sieht so aus:
und closeDialog:
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
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
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
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
Code: Alles auswählen
sub closeDialog
dlgField.endExecute()
' dlgField.dispose() --> wenn ich diese Zeile im Code lasse schmiert OpenOffice ab!!!!!!!!!
end sub