Dokument speichern

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

Moderator: Moderatoren

SteffenOOo
**
Beiträge: 49
Registriert: Mi, 22.09.2004 18:24

Dokument speichern

Beitrag von SteffenOOo »

Hallo!

ich möchte ein kleines Makro erstellen, welches das aktuelle Dokument in einem bestimmten Pfad speichert. Dabei soll der Speichername vorher über eine Inputbox abgefragt werden (später soll dann aus dem Text oder Spalte eine Auftragsnummer übernommen werden).

Ich weiß - ist sicher einfach. Ich bekomme es aber nicht hin.
Wer kann mir helfen?

MFG Steffen :roll:
Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Beitrag von Frank Lauer »

DIM URL as String

Docu = ThisComponent
URL = ConvertToUrl("C:\test\test.sxc") 'Wandelt den Pfad in eine URL um

'Zum Speichern giebt es dann folgende Methoden:

Docu.store() 'speichern

Docu.storeAsURL(URL, Dummy()) 'speichern unter

Statt Dummy() kann man auch einige Parameter, wie Passwörter übergeben

Genaueres findest du im StarBasic Programmierhandbuch etwa auf Seite 96,97,98 (hab nur die Englische Version, müsste aber in der Deutschen auch in der Gegend sein) (siehe Link von Stephan)
OOo 2.1 , Win XP
SteffenOOo
**
Beiträge: 49
Registriert: Mi, 22.09.2004 18:24

Hurra!

Beitrag von SteffenOOo »

Hallo!
vielen Dank für deine schnnelle Hilfe - es klappt!!!

Was bedeutet denn Doc=ThisComponent. Auch convertToURL kannte ich nicht. Hatte einfach für URL= "file:///c:/test.sxw" genommen. Das funktionierte nicht.

Jetzt habe ich aber noch eine Bitte: Ich möchte bei ConvertToURL eine Variable für den Speicherort angeben. Diese habe ich vorher über Eingabebox und einem konstantem Pfad festgelegt.

Ich übergebe Sie dem Befehl ConvertToUrl - doch es klappt nicht. Was mache ich falsch?

Hier das Listing:

REM ***** BASIC *****


sub Speichern
rem ----------------------------------------------------------------------
rem define variables
dim URL as string
dim Speicherort as string
dim Plattenort as string
Dim Dateiname as String
dim dummy()
rem ----------------------------------------------------------------------

Docu = ThisComponent

rem Dateipfad und Name der Datei werden bekannt gegeben
Dateiname = inputbox ("Geben Sie den Namen der Datei mit Endung ein")
Plattenort = "c:\"
Speicherort = Plattenort + Dateiname

rem Anzeige zur Kontrolle
msgbox Speicherort ' für Testzwecke

rem Speichervorgang
URL = ConvertToUrl("Speicherort")
Docu.storeAsURL(URL ,Dummy())


end sub


Vielen Dank für deine Mühe!

MFG Steffen
Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Beitrag von Frank Lauer »

Hallo,

mit Docu=ThisComponent weist du der Variable Docu das aktive Dokument zu. Alternativ kann man auch schreiben: Docu=StarDesktop.CurrentComponent , das ist mir aber meist zu viel Schreibarbeit :wink: .


Ich glaub ich hab den Fehler in deinem Listing gefunden:

Du schreibst:

URL = ConvertToUrl("Speicherort")

damit übergiebst du den String "Speicherort" anstatt den Inhalt der Variablen Speicherort.

richtig muss es heißen:

URL = ConvertToUrl(Speicherort) (also ohne ")

Gruß

Frank
OOo 2.1 , Win XP
SteffenOOo
**
Beiträge: 49
Registriert: Mi, 22.09.2004 18:24

"Speicherort"

Beitrag von SteffenOOo »

Ja stimmt - das ist der Fehler!

Vielen Dank für deine Hilfe. Es klappt wunderbar.


Fall ich dich nicht überstrapaziere - noch ein Wunsch. Hinter dem Dateinamen verbirgt sich eine Auftragsnummer. Diese würde ich - wenn ich das Dokument speicher vorher gern noch im Dokument ausgeben.
Die Variable Dateiname hat ja bereits den Wert übergeben bekomen.

Nun möchte ich es Z.B.: in der Form

Die Auftragsnummer lautet ...... ausgeben im Text.

Wie komme ich denn im Dokument genau an diese Stelle quasi bräuchte ich einen Platzhalter, den ich anspreche. Dieses Prinzip habe ich noch nicht begriffen.

Vielen Dank für deine Hilfe.

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

Beitrag von Stephan »

In das Dokument mittels Einfügen>Textmarke eine Textmarke einfügen. Der Name der Marke sei für das Beispiel "test".
Dann das laufen lassen:

Code: Alles auswählen

'weiß nicht woher Dein Dateiname kommt
Dateiname = "irgendwas"
ausgabe = "Die Auftragsnummer lautet: " & Dateiname 
thisComponent.getBookmarks().getByName("test").getAnchor.setString(ausgabe)

Gruß
Stephan
SteffenOOo
**
Beiträge: 49
Registriert: Mi, 22.09.2004 18:24

Klappt

Beitrag von SteffenOOo »

Hallo Stephan vielen Dank - es klappt wunderbar.

Habe jetzt versucht deine Idee nachzuvollziehen und im Starbasic Handbuch nachgeschaut.

Habe mir das so aufgebaut (Steht fast so drin) - funktioniert auch:

Sub Main
DIM Doc As Object
Dim Bookmark As Object
Dim Cursor as Object

Doc = Stardesktop.CurrentComponent
Bookmark = Doc.Bookmarks.getByName("TEST")

Cursor = Doc.Text.createTextCursorByRange(Bookmark.Anchor)
Cursor.String = "Auftragsnummer ersetzt das Lesezeichen"
End Sub

Aber ..... woher hast du die herzerfrischend einfachen Befehle?
z.: Doc = ThisComponent, get Bookmarks,....

ich finde dazu nichts.

Habe das Buch Starbasic (leider für 5.0 deshalb für Anfänger schwer auf die neue Version umzusetzen ==1.2)
Habe mir VB Buch gekauft - ist aber doch zu anders. Ich möchte es gern lernen nur wiee? :oops:

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

Beitrag von Stephan »

Aber ..... woher hast du die herzerfrischend einfachen Befehle?


Im Konkreten ThisComponent:
ThisComponent und StarDesktop.CurrentComponent sind im Deverlopersguide beschrieben. Beide können Gleiches bewirken oder sehr Unterschiedliches je nachdem in welchem Kontext Du sie benutzt.

Um die Sprache wirklich zu verstehen mußt Du Dich mit dem Developersguide auseinander setzen. Das ist zunächst abstoßend, weil kompliziert, so das der pragmatische Weg ist immer wieder Code zu lesen und zu analysieren. Sehr viel Code findest Du im englischen Forum.

Eine Grundfertigkeit beim Einarbeiten ist der Gebrauch von:
<Objekt>.dbg_properties
<Objekt>.dbg_methods
<Objekt>.dbg_supportedInterfaces
(Zur Vereinfachung dazu gibt es auch fertige "Analyse"makros)

Um ein Beispiel für getBookmarks zu nennen:

Code: Alles auswählen

Sub Main 
DIM Doc As Object 
Doc = Stardesktop.CurrentComponent 
MsgBox Doc.dbg_methods
End Sub
Das liefert folgende Ausgabe:

Methods of object "SwXTextDocument":
SbxEMPTY queryInterface ( SbxOBJECT ) ; SbxOBJECT getViewData ( void ) ; SbxVOID setViewData ( SbxOBJECT ) ; SbxEMPTY getTransferData ( SbxOBJECT ) ;
SbxARRAY getTransferDataFlavors ( void ) ; SbxBOOL isDataFlavorSupported ( SbxOBJECT ) ; SbxVOID addPrintJobListener ( SbxOBJECT ) ; SbxVOID removePrintJobListener ( SbxOBJECT ) ;
SbxOBJECT getEvents ( void ) ; SbxVOID addCloseListener ( SbxOBJECT ) ; SbxVOID removeCloseListener ( SbxOBJECT ) ; SbxARRAY getTypes ( void ) ;
SbxARRAY getImplementationId ( void ) ; SbxOBJECT getParent ( void ) ; SbxVOID setParent ( SbxOBJECT ) ; SbxOBJECT getDocumentInfo ( void ) ;
SbxVOID disposing ( SbxOBJECT ) ; SbxVOID dispose ( void ) ; SbxVOID addEventListener ( SbxOBJECT ) ; SbxVOID removeEventListener ( SbxOBJECT ) ;
SbxBOOL attachResource ( SbxSTRING, SbxARRAY ) ; SbxSTRING getURL ( void ) ; SbxARRAY getArgs ( void ) ; SbxVOID connectController ( SbxOBJECT ) ;
SbxVOID disconnectController ( SbxOBJECT ) ; SbxVOID lockControllers ( void ) ; SbxVOID unlockControllers ( void ) ; SbxBOOL hasControllersLocked ( void ) ;
SbxOBJECT getCurrentController ( void ) ; SbxVOID setCurrentController ( SbxOBJECT ) ; SbxOBJECT getCurrentSelection ( void ) ; SbxVOID addModifyListener ( SbxOBJECT ) ;
SbxVOID removeModifyListener ( SbxOBJECT ) ; SbxBOOL isModified ( void ) ; SbxVOID setModified ( SbxBOOL ) ; SbxARRAY getPrinter ( void ) ;
SbxVOID setPrinter ( SbxARRAY ) ; SbxVOID print ( SbxARRAY ) ; SbxBOOL hasLocation ( void ) ; SbxSTRING getLocation ( void ) ;
SbxBOOL isReadonly ( void ) ; SbxVOID store ( void ) ; SbxVOID storeAsURL ( SbxSTRING, SbxARRAY ) ; SbxVOID storeToURL ( SbxSTRING, SbxARRAY ) ;
SbxVOID initNew ( void ) ; SbxVOID load ( SbxARRAY ) ; SbxVOID close ( SbxBOOL ) ; SbxOBJECT getLibraryContainer ( void ) ;
SbxVOID createLibrary ( SbxSTRING, SbxSTRING, SbxSTRING, SbxSTRING ) ; SbxVOID addModule ( SbxSTRING, SbxSTRING, SbxSTRING, SbxSTRING ) ; SbxVOID addDialog ( SbxSTRING, SbxSTRING, SbxARRAY ) ; SbxVOID addEventListener ( SbxOBJECT ) ;
SbxVOID removeEventListener ( SbxOBJECT ) ; SbxOBJECT getText ( void ) ; SbxVOID reformat ( void ) ; SbxOBJECT getLineNumberingProperties ( void ) ;
SbxOBJECT getChapterNumberingRules ( void ) ; SbxOBJECT getFootnotes ( void ) ; SbxOBJECT getFootnoteSettings ( void ) ; SbxOBJECT getEndnotes ( void ) ;
SbxOBJECT getEndnoteSettings ( void ) ; SbxOBJECT createSearchDescriptor ( void ) ; SbxOBJECT findAll ( SbxOBJECT ) ; SbxOBJECT findFirst ( SbxOBJECT ) ;
SbxOBJECT findNext ( SbxOBJECT, SbxOBJECT ) ; SbxOBJECT createReplaceDescriptor ( void ) ; SbxLONG replaceAll ( SbxOBJECT ) ; SbxARRAY getPagePrintSettings ( void ) ;
SbxVOID setPagePrintSettings ( SbxARRAY ) ; SbxVOID printPages ( SbxARRAY ) ; SbxOBJECT getReferenceMarks ( void ) ; SbxOBJECT getTextTables ( void ) ;
SbxOBJECT getTextFrames ( void ) ; SbxOBJECT getBookmarks ( void ) ; SbxOBJECT getTextSections ( void ) ; SbxOBJECT getGraphicObjects ( void ) ;
SbxOBJECT getEmbeddedObjects ( void ) ; SbxOBJECT getTextFields ( void ) ; SbxOBJECT getTextFieldMasters ( void ) ; SbxOBJECT getStyleFamilies ( void ) ;
SbxSTRING getImplementationName ( void ) ; SbxBOOL supportsService ( SbxSTRING ) ; SbxARRAY getSupportedServiceNames ( void ) ; SbxOBJECT getDrawPage ( void ) ;
SbxOBJECT getDocumentIndexes ( void ) ; SbxOBJECT getPropertySetInfo ( void ) ; SbxVOID setPropertyValue ( SbxSTRING, SbxVARIANT ) ; SbxEMPTY getPropertyValue ( SbxSTRING ) ;
SbxVOID addPropertyChangeListener ( SbxSTRING, SbxOBJECT ) ; SbxVOID removePropertyChangeListener ( SbxSTRING, SbxOBJECT ) ; SbxVOID addVetoableChangeListener ( SbxSTRING, SbxOBJECT ) ; SbxVOID removeVetoableChangeListener ( SbxSTRING, SbxOBJECT ) ;
SbxLONG getPropertyState ( SbxSTRING ) ; SbxARRAY getPropertyStates ( SbxARRAY ) ; SbxVOID setPropertyToDefault ( SbxSTRING ) ; SbxEMPTY getPropertyDefault ( SbxSTRING ) ;
SbxOBJECT getLinks ( void ) ; SbxOBJECT getRedlines ( void ) ; SbxVOID refresh ( void ) ; SbxVOID addRefreshListener ( SbxOBJECT ) ;
SbxVOID removeRefreshListener ( SbxOBJECT ) ; SbxVOID updateLinks ( void ) ; Unknown Sbx-Type! getSomething ( SbxARRAY ) ; SbxLONG getRendererCount ( SbxVARIANT, SbxARRAY ) ;
SbxARRAY getRenderer ( SbxLONG, SbxVARIANT, SbxARRAY ) ; SbxVOID render ( SbxLONG, SbxVARIANT, SbxARRAY ) ; SbxOBJECT queryAdapter ( void ) ; SbxOBJECT getNumberFormatSettings ( void ) ;
SbxOBJECT getNumberFormats ( void ) ; SbxVOID setDelegator ( SbxOBJECT ) ; SbxEMPTY queryAggregation ( SbxOBJECT ) ; SbxOBJECT createInstance ( SbxSTRING ) ;
SbxOBJECT createInstanceWithArguments ( SbxSTRING, SbxARRAY ) ; SbxARRAY getAvailableServiceNames ( void )


und da findest Du diese Methode.
Wenn Du so Objekte immer wieder analysierst, wird Dir das Ganze vertraut weil Du ja nach und nach zu einer Codeschnipselsammlung kommst und nicht alles immer neu ermitteln mußt.


Gruß
Stephan
Frank Lauer
***
Beiträge: 88
Registriert: Mi, 30.07.2003 18:06
Wohnort: Wiesloch

Beitrag von Frank Lauer »

Hallo,

Stephan hat schon recht, das man über den Developersguide den komplettesten überblick bekommt. Alledings ist der extrem schwer zu lesen. Außerdem wird hier das meinste auf C++ und Java Basis erklärt, was das Lesen für einsteiger noch erschwert. Für einenen einfachen Überblick (sozusagen als einsteigerbuch) findest du im StarBasic Programmierhandbuch.

Schau auch mal unter http://www.openoffice.org/issues/show_bug.cgi?id=18327 nach. Da findest du eine Datei namen oooinspector.sxw. Die enthält ein Makro, dem du objecte in der Form doInspect(Object) übergeben kannst. Dann erhälst du eine Dialog, der die sämtliche Methoden und Eigenschaften (und Dienste) des Objektes übersichtlich ausgiebt. Mit den Informationen kannst du dann in der API Referenz dir den Rest zusammensuchen.

Zur Arbeit mit Writerdateien kann ich leider wenig sagen, dar ich mich von den Makros her eher mit Cals beschäftige.

Gruß Frank
OOo 2.1 , Win XP
SteffenOOo
**
Beiträge: 49
Registriert: Mi, 22.09.2004 18:24

Beitrag von SteffenOOo »

Hallo Frank hallo Stephan,

vielen Dank für eure Hilfe. Ja mit den Objekten, Eigenschaften, Methoden, und Anweiungen und deren Struktur habe ich so meine Probleme.

Objekte sind alle Sachen die in einem Dokument sind, Tabellen, Bilder,..... und das Textdokument selber.

Diese Objekte haben Eigenschaften (Farbe,.....) und alle diese Sachen kann ich manipulieren mit Methoden (Funktionen mit Rückgabewert und Anweisungen ohne Rückgabewert)

Das was Ihr mit

Code: Alles auswählen

Sub Main 
DIM Doc As Object 
Doc = Stardesktop.CurrentComponent 
MsgBox Doc.dbg_methods 
End Sub
ausgebt sind Methoden ? also die eigentlichen Befehle zur Manipulation von Staroffice?

Wo liegt der Unterschied zu Schnittstellen.

Ich bekomme einfach keine klare Struktur in den Kopf.
Also eine Art Organigramm, wie die einzelne Sachen zusammenhängen.
Im Moment lese ich aus dem Hanser Verlag Starbasic. Das Programmierhandbuch von Staroffice habe ich mir ausgedruckt und finde dort einige Sachen, wie z.B. oben den Code - der ist aber immer umständlicher beschrieben.

Also Thiscomponent giebt es dort nicht sondern: Doc = Stardesktop.CurrentComponent

und

Bookmark = Doc.Bookmarks.getByName("TEST")
Cursor = Doc.Text.createTextCursorByRange(Bookmark.Anchor)

lautet bei Stephan:
thisComponent.getBookmarks().getByName("test").getAnchor.setString(ausgabe)

Das ist mir zu undurchsichtig - aber ich kämpfe mich durch. Kenn Openoffice ganz gut aber die Programmierung habe ich mir dieses Jahr auf die Fahne geschrieben.
Bin also für jeden Tipp dankbar.
Vielen Dank Steffen
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Steffen,

Bloß mal ganz schnell:
Im Moment lese ich aus dem Hanser Verlag Starbasic.
Spende das der nächsten Bibliothek. Das ist zur Programmierung von StarOffice 5.2 geschrieben und zum Lernen für OOo völlig ungeeignet.
Nicht ungeeignet weil StarOffice, sondern weil seit StarOffice ab 6.0 und OpenOffice ab 1.0.x programmierungmäßig alles grundlegend geändert hat, was den Zugriff etc. betrifft.

Lesen mußt Du derzeitig das Buch von Pitoniak (siehe meine Links) in englisch und es gibt auch ein fränzösisches was ich nicht genauer kenne da ich kein Französisch spreche. Außerdem ist seit Monaten beim C&L Verlag eines angekündigt und im Herbst kommt eines von Galileo Computing, geschrieben von Thomas Krumbein, der hier im Forum den nick "Toxitom" hat.
Das Programmierhandbuch von Staroffice habe ich mir ausgedruckt und finde dort einige Sachen, wie z.B. oben den Code - der ist aber immer umständlicher beschrieben.

Also Thiscomponent giebt es dort nicht sondern: Doc = Stardesktop.CurrentComponent
Das (-->ThisComponent) steht da definitiv nicht beschrieben, deshalb hatte ich ja auf das Developersguide verwiesen. Klar ist das schwer, aber da sind auch solche Übersichten nach denen Du fragst enthalten.


Gruß
Stephan
SteffenOOo
**
Beiträge: 49
Registriert: Mi, 22.09.2004 18:24

Hallo! Vielen Dank

Beitrag von SteffenOOo »

Hallo!

vielen Dank für die Infos.
Ja das stimmt es handelt sich um ein altes Buch für eine ältere Sprache - hilft mir aber trotzdem die Zusammenhänge Objekte, Methoden,... Makrozuordnung und dergleichen mehr im Groben zu verstehen.

Es hilft mir mehr und mehr auch Programme besser lesen zu könen.

Ich versuche es dann mit dem aktuellen Programmierhandbuch von SUN umzusetzen und korrigiere dann im Hanser Buch.

So bekomme ich ein wenig Logik in`s Geschehen.
Auf das neue Buch warte ich schon - habe ich regsitriert.

Jetzt versuche ich gerade einen Dialog zu programmieren.
Falls ich Fragen habe - poste ich!
Vielen Dank Ersteinmal!
:)
Antworten