Seite 1 von 1

[Gelöst] loadComponentFromURI in eingebetten Frame

Verfasst: Fr, 13.01.2012 15:14
von jemies
Hallo

(Hinweis: Ich benutze LibreOffice 3.4.4. Ich erlaube mir dennoch, hier zu posten, weil ich alles, was ich für mein kleines Skript brauchte, hier bzw. bei den englischsprachigen KollegInnen dieser Seite zusammen gesammelt habe. Bitte um Nachsicht. Ich habe den Fehler bzw. Vorgang auch in meiner VirtualBox mit OpenOffice-3.3 auf WindowsXP untersucht. Dort stürzte OOO-3.3 bereits etwas früher ab.)

In einem Dokument mit einem Formular (Thema: "standalone-Form") habe ich einen Frame mit der Eigenschaft Name="Viewer" (per GUI) angelegt. Mit folgendem Code versuche ich ein file.odt, das ebenfalls ein Formular enthält, in den Frame mit der Eigenschaft Name="Viewer" zu laden:

Code: Alles auswählen

function fnOpenDoc(sFile)
	DIM sURL AS String
	DIM oFrame As Object
	sURL = ConvertToURL(sFile)
	fnOpenDoc = StarDesktop.CurrentComponent.CurrentController.Frame.loadComponentFromURL(sURL, oFrame, 0, Array())
end function


sub OpenDocToViewer
	Dim oDoc As Object
	Dim oFrame As Object
	Dim sFile As String
	Dim oDoc2 As Object
	
       ' Get the document that this macro is embedded into.
       oDoc = ThisComponent.CurrentController.Frame

       ' Get the Viewer-Frame within the Document.
       oFrame = oDoc.findFrame("Viewer",0)
  
	sFile = "pathtofile/file.odt"
	oDoc2 = fnOpenDoc(sFile)

end sub
Nachdem der Code ursprünglich zwei- oder dreimal funktioniert hat, erhalte ich nun regelmäßig einen Absturz mit folgender Fehlermeldung:

Code: Alles auswählen

SIGSEGV in framework::LockHelper::acquireReadAccess()
Die vermutlich mit diesem Bug zusammenhängt.

Muss ich das Ziel aufgeben, dass die per Button aufgerufenen Dokumente in einem Frame des übergeordneten Dokumentes angezeigt werden? Oder hat jemand eine bessere Idee?

Dank und Gruß
jemies

Re: loadComponentFromURI in eingebetten Frame führt zu SIGSE

Verfasst: Fr, 13.01.2012 16:28
von Frieder D.
Hallo jemies
jemies hat geschrieben:(Hinweis: Ich benutze LibreOffice 3.4.4. Ich erlaube mir dennoch, hier zu posten, weil ich alles, was ich für mein kleines Skript brauchte, hier bzw. bei den englischsprachigen KollegInnen dieser Seite zusammen gesammelt habe. Bitte um Nachsicht. Ich habe den Fehler bzw. Vorgang auch in meiner VirtualBox mit OpenOffice-3.3 auf WindowsXP untersucht. Dort stürzte OOO-3.3 bereits etwas früher ab.)
Dieses Forum ist nicht von Apache, sondern privat. Und solange OO und LO noch kompatibel sind ist dass kein Problem.
jemies hat geschrieben: Nachdem der Code ursprünglich zwei- oder dreimal funktioniert hat, erhalte ich nun regelmäßig einen Absturz mit folgender Fehlermeldung:

Code: Alles auswählen

SIGSEGV in framework::LockHelper::acquireReadAccess()
Die vermutlich mit diesem Bug zusammenhängt.

Muss ich das Ziel aufgeben, dass die per Button aufgerufenen Dokumente in einem Frame des übergeordneten Dokumentes angezeigt werden? Oder hat jemand eine bessere Idee?
Falls es wirklich mit dem oben genannten Bug zu tun hat, empfehle ich dir die(sowieso stabilere) Version LO3.3.4 manuell zu installieren.
Mit der Mitgelieferten Version von Ubuntu gibt es sowieso mehrere Probleme.
Die Installation ist in der readme -Datei gut erklärt. Vergiss aber nicht die Desktop-Integration nach der eigentlichen Installation zu installieren.
(das deutsche Sprachpaket muss auch manuell installiert werden.)
Du kannst vorher natürlich unter Windows XP die Portable Version testen, um zu schauen, ob es in der 3.3.4 läuft.

Gruß Frieder

Re: loadComponentFromURI in eingebetten Frame führt zu SIGSE

Verfasst: Sa, 14.01.2012 09:26
von F3K Total
Hallo,
ich bin kein "Frame"-Kenner, habe mal rumgestöbert. Im SDK steht unter
"constants group FrameSearchFlag"
AUTO
const long AUTO = 0;
Usage Restrictions
deprecated
Description
no longer supported
Using of this flag will do nothing. Use right combination of other flags instead of this one.
jemies hat geschrieben:oFrame = oDoc.findFrame("Viewer",0)
D.h., die 0 funktioniert nicht mehr.
Ich habe durch "try and error" folgende Lösung herausbekommen, sie ist auch "etwas" kürzer als die ursprüngliche:

Code: Alles auswählen

sub OpenDocToViewer
sFile = "pathtofile/file.odt"
oDoc2 = fnOpenDoc(sFile)
end sub

function fnOpenDoc(sFile) as object
sURL = ConvertToURL(sFile)
fnOpenDoc = StarDesktop.CurrentComponent.CurrentController.Frame.loadComponentFromURL(sURL, "_self", 2, Array())
end function
Gruß R

Re: loadComponentFromURI in eingebetten Frame führt zu SIGSE

Verfasst: Sa, 14.01.2012 10:50
von balu
Hallo jemies,

wenn Du schon Crossposting betreibst, dann sag das wenigstens. Das gehört sich so. Ist einfach nur höflicher so.

http://www



Gruß
balu


[edith]
link entfernt, da im anderen Forum der Thread vom OP gelöscht wurde.
[/edith]

Re: loadComponentFromURI in eingebetten Frame führt zu SIGSE

Verfasst: Sa, 14.01.2012 11:21
von jemies
Dank erst einmal für die Antworten.
@balu
Das ist mir sehr peinlich. Ich habe den Artikel - könnt ich schwören - im openoffice-forum vor der Veröffentichung hier gelöscht - hab ich aber scheinbar eben nicht. Habe ich jetzt nachgeholt. Bitte um Entschuldigung.

@Frieder D
Falls es wirklich mit dem oben genannten Bug zu tun hat, empfehle ich dir die(sowieso stabilere) Version LO3.3.4 manuell zu installieren.
Stimmt. Habe es ausprobiert, und LO3.3.4 stürzt nicht ab. Super.
Leider zeigt sich nun, dass der Code nicht tut, was es soll. Das Verhalten des Codes hängt sehr davon ab, an welcher Stelle sich zum Zeitpunkt des Aufrufes der sichtbare Curser befindet.

Auch die Versíon von F3K Total führt nicht zu dem gewünschten Ergebnis, denn sie öffnet ein komplett neues Fenster, anstatt in einem eingebetteten Frame.

Mein Ziel ist,
  • innerhalb einer TextDatei einen Frame einzufügen (als eingebetteten SubFrame sozusagen); habe ich per GUI getan
  • diesen Frame mit dem Namen "Viewer" zu versehen; habe ich ebenfalls über den Dialog in der GUI getan
  • um nun über Schaltflächen verschiedene Dokumente gezielt in diesem benannten Frame zu öffnen.
Wie erzeugt man einen Frame als subFrame innerhalb eines Dokumentes?
Weiß jemand Rat?

Dank und Gruß

Re: loadComponentFromURI in eingebetten Frame führt zu SIGSE

Verfasst: Sa, 14.01.2012 12:54
von balu
Hallo jemies,

Entschuldigung angenommen. Ich habe den Link hier auch gelöscht.

Sorry, das ich dir nicht helfen kann, aber das übersteigt momentan noch meine Kenntnisse. Aber hast Du schon mal bei Dannenhöfer vorbeigeschaut?. Vielleicht steht dort ja was dazu.



Gruß
balu

Re: loadComponentFromURI in eingebetten Frame führt zu SIGSE

Verfasst: Fr, 20.01.2012 13:03
von jemies
Ich habe nun eine Methode gefunden und will sie nicht vorenthalten:

Zunächst erzeugt man per GUI einen ganz normalen Rahmen (Nicht: Frame) und nennt ihn unter dem Register "Zusätze": Name = RahmenName.
Dann kann mit folgendem Makro der ggf. bestehende Text in diesem Rahmen ersetzt werden.
Das ganze macht Sinn, wenn man den Namen der Datei, deren TextContent eingefügt werden soll (in meinem Fall ein Formular), per Button-Eigenschaft "ZusatzInformationen" übergibt ( vgl.: http://user.services.openoffice.org/en/ ... 022#p82565. Das Makro muss dann dem Button als Ereignis zugewiesen werden.

Code: Alles auswählen

sub GetTextContentFromFileAndInsert(oEv)
           REM 	Ansatz dannenhöfer 
           REM 	http://www.dannenhoefer.de/faqstarbasic/DokumentEinfgen.html#DokumentEinf%FCgen
	Dim sPath AS String
	Dim sFile AS String
	DIM sURL AS String
	Dim sPrevFormName as String 
	DIM sButtonTag AS String	
	Dim oDoc
	Dim oTargetFrame 	
	Dim oFrameCursor
	DIM sFName as String
	
        oDoc = ThisComponent   
	sPath = "/home/jemies/01_Dokumente/02_springinsfeld/datenbank/"		
	
           REM  Get FileName From Button-Property "Tag"
	   REM 	See: http://user.services.openoffice.org/en/forum/viewtopic.php?f=39&t=18022

	cWhat = com.sun.star.text.GenericTextDocument	
	oModel = oEv.Source.getModel()
	sButtonTag = oModel.Tag

    sFile = Char10 & sPath & Char10 & sButtonTag & Char10 
    sURL = ConvertToURL(sFile)
    sFName = "RahmenName" 

  	Dim myInsertProps(0) as New com.sun.star.beans.PropertyValue
  		'	myInsertProps(0).name = "ReadOnly"
  		'	myInsertProps(0).value = true
  
 	oTargetFrame = oDoc.TextFrames.getByName ( sFName )	
  	oFrameCursor = oTargetFrame.Text.createTextCursor()
  	oFrameCursor.gotoend( true )
  	oFrameCursor.InsertDocumentFromUrl(sURL,myInsertProps())
  	oFrameCursor.gotoStart( true )
  	
  	    REM 	Damit das Display der Seite nach dem Laden längerer Texte nicht ans Seiten-Ende rutscht,
  	    REM	wird der Cursor an den Anfang des Viewer-Rahmens gesetzt

  	myViewCursor = oDoc.GetCurrentController.ViewCursor
	myViewCursor.gotoRange(oFrameCursor,false)
end sub
Dank auch noch einmal für den Verweis auf Dannenhöfer, der hat mir sehr geholfen.
Gruß
jemies