Verknüpfung von Bereichen beim Speichern lösen

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

Moderator: Moderatoren

hvb
****
Beiträge: 137
Registriert: Mo, 06.09.2004 14:54

Verknüpfung von Bereichen beim Speichern lösen

Beitrag von hvb »

Hallo
ich habe diese Frage schon im Writer-Forum gestellt (viewtopic.php?f=1&t=51991) und Stephan hat die Möglichkeit einer Lösung des Problems mit Makros angesprochen. Da ich mich kaum mit Starbasic auskenne, versuche ich mich hier einmal:

Ich habe in mehreren Dokumentvorlagen verknüpfte Bereiche. Die Bereiche sind mit einem Bereich in einem anderen Dokument verknüpft, in dem die Namen und Adressen der Vorstandsmitglieder unseres Vereins hinterlegt sind. Sinn der ganzen Sache: bei Änderungen in der Vorstandschaft muss nur dieses eine Dokument aktualisiert werden.
Bei der Erstellung eines neuen Dokuments aus der Vorlage wird dann der Bereich aktualisiert und im neuen Dokument sind dann die Daten der neuen Vorstandschaft.
Lassen sich beim Speichern des aus der Vorlage erstellten Dokuments die Verknüpfung bzw. alle Verknüpfungen automatisch zu lösen, damit beim Öffnen dieses neuen Dokuments keine Aktualisierung mehr möglich ist?

Vielen Dank im Voraus
Martin

OOo 3.3.0 auf Win 7 32 bit & 64 bit
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Verknüpfung von Bereichen beim Speichern lösen

Beitrag von Frieder D. »

Hallo Martin

Ja das geht per Makro:
Kopiere einfach den unten stehenden Code in ein Modul der Standard-Bibliothek der Vorlage,
und verknüpfe das Makro mit dem Ereignis :"Dokument wurde gesichert als"
Extras-> anpassen->Ereignisse->wähle aus: "Dokument wurde gesichert als" ->Wähle bei "Speichern in" die Vorlag
->Klicke dann auf "Makro...", und weise es dem Sub "remove_AreaLinks" zu

hier der code:

Code: Alles auswählen

REM  *****  BASIC  *****
' Dises Makro entfernt alle Verknüpfungen in einem Dokument, 
'sofern das Dokument schon einmahl gespeichert wurde,
'und es keine Calc-Vorlage (ots) ist.
Sub remove_AreaLinks
dim oDoc as Object
dim oLinks as Object
Dim sExtension As String
'die Bibliothek "Tools" wird für die Funktion " GetFileNameExtension(oDoc.Title)" benötigt
GlobalScope.BasicLibraries.LoadLibrary("Tools")'Bibliothek "Tools" ladem
  oDoc=thisComponent 'Aktuelles Dokument
  If oDoc.haslocation()Then 'ünerprüfen, ob es schon abgespeichert wurde
  sExtension = GetFileNameExtension( oDoc.Title) 'Endung herausfinden
    if sExtension <> "ots" Then 'Wenn es die Vorlagen-Eendung ist abbrechen
      oLinks = oDoc.AreaLinks 'verknüpfte Bereiche 
      for n = 0 To oLinks.getcount-1 'Schleife über alle verknüpften Bereiche
        oLinks.removeByIndex(0) 'Verknüpfung löschen
      Next 'ende der Schleife
    end if 
  end if
End Sub
Gruß Frieder
P.S. ich hatte vorhin das Falsche Ereignis angegeben:"Dokument wurde gesichert"
Stadt dessen muss es mir dem Ereignis "Dokument wurde gesichert als" verknüpft werden.
Sur Sicherheit kann man das Makro auch mit beiden Ereignissen verknüpfen.
hvb
****
Beiträge: 137
Registriert: Mo, 06.09.2004 14:54

Re: Verknüpfung von Bereichen beim Speichern lösen

Beitrag von hvb »

Hallo Frieder,
vielen Dank für Deine Mühe.
Leider meldet sich OOo beim Speichern mit einem Laufzeitfehler:

"Eigenschaft oder Methode nicht gefunden: AreaLinks."

Weißt Du vielleicht auch hier Rat?
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Verknüpfung von Bereichen beim Speichern lösen

Beitrag von Frieder D. »

Hallo Martin,

welche Version von OpenOffice verwendest du?
Ich verwende LibreOffice3.3.4 hier tritt kein Fehler auf.
Ich weiß natürlich nicht,
ab welcher Version von OO oder LO das Object "AreaLinks" verfügbar ist.
Vielleicht ist deine Version von OO einfach zu alt, oder die Syntax ist dort leicht anders.
Ich kann dir also im Moment nicht sagen, an was es genau liegt.

Ich kann dir allerdings Empfehlen LibreOffice 3.3.4 zu installieren (alle neueren Versionen sind im Moment nicht zu empfehlen).
(alle Einstellungen aus deiner OO-Version werden automatisch übernommen.)

Vielleicht kann ja aber auch jemand, der sich ein bisschen mit Makros auskennt, und OO installiert hat das noch einmahl überprüfen.
Denn ich möchte jetzt nicht eine aufwendige parallel Installation von OO auf meinen Rechner ziehen,
bei der eventuell meine Libreoffice-Installation doch kaputt geht.

Gruß Frieder
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Verknüpfung von Bereichen beim Speichern lösen

Beitrag von Frieder D. »

Hallo Martin,

ich habe gerade in der Openoffice-API für OO 3.3.x nachgesehen, dort ist ist das Interface "AreaLinks" aufgeführt, und zwar genauso wie in der LO-API .
Ich weiß natürlich nicht, ob es in älteren Versionen auch schon vorhanden war, aber soweit ich mich erinnern kann, war es in der 3.1 auf jeden Fall schon vorhanden.
Vielleicht liegt auch ein Bug in deiner Version vor.

Gruß Frieder
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Verknüpfung von Bereichen beim Speichern lösen

Beitrag von Frieder D. »

Hallo Martin

mir ist soeben aufgefallen, dass es bei dir um ein Writer Dokument geht.
mein Makro ist für ein Calc-Dokument. Es kann also so leider nicht gehen.
Ich schaue gerade, ob ich das auch für ein Writer Dokument hinbekommen.
Im Moment weiß ich aber noch nicht wie es geht.

Gruß Frieder
hvb
****
Beiträge: 137
Registriert: Mo, 06.09.2004 14:54

Re: Verknüpfung von Bereichen beim Speichern lösen

Beitrag von hvb »

Hallo Frieder,
ich wollte gerade schreiben, dass ich auf Grund Deiner Links vermute, dass Du mit einem Calc-Dokument arbeitest. -> Verdacht bestätigt.

Ich habe auch in der API ein Wenig herum gesucht (TextSection), werde aber nicht ganz schlau daraus, wie ich die Verknüpfung lösen und den Inhalt des Bereichs einbetten kann.

Noch einmal vielen Dank für Deine Mühe & Gruß
Martin
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Verknüpfung von Bereichen beim Speichern lösen

Beitrag von Frieder D. »

Hallo Martin

Ich konnte leider keine Methode finden,
die nur die Verknüpfungen löscht.

Aber ich habe eine Methode gefunden, alle Bereiche löscht.
Der Inhalt der Bereiche bleibt dabei unverändert erhalten, nur die Bereiche selber,
und somit auch die Verknüpfungen, verschwinden.
Es ist nicht 100% das was du wolltest, aber ich hoffe es hilft dir trotzdem weiter.

Kopiere den Code in ein Modul der Standard Bibliothek des ott -Dokument, und verknüpfe das
Makro "bereiche_entfernen" wie oben geschildert mit dem Ereignis "Dokument wurde gesichert als"

Code: Alles auswählen

REM  *****  BASIC  *****
'Entfernt alle Bereiche eines Writerdokuments,
'wenn das dokument nicht als Vorlage(*.*.ott) abgespeichert ist. 
'Dabei bleibt der Inhalt der Bereiche  erhalten, 
'aber er ist somit nicht mehr in den Bereiche, 
'und die Verknüpfungen sind auch gelöscht.
Sub bereiche_entfernen
dim oDoc as Object
dim oBereiche as Object
dim i As Integer
Dim sExtension As String
dim aNames() As String
'die Bibliothek "Tools" wird für die Funktion " GetFileNameExtension(oDoc.Title)" benötigt
GlobalScope.BasicLibraries.LoadLibrary("Tools")'Bibliothek "Tools" ladem
  oDoc=thisComponent 'Aktuelles Dokument
  If oDoc.haslocation()Then 'ünerprüfen, ob es schon abgespeichert wurde
  sExtension = GetFileNameExtension( oDoc.Title) 'Endung herausfinden
    if sExtension <> "ott" Then 'Wenn es die Vorlagen-Eendung ist abbrechen
      oBereiche =oDoc.getLinks().getByName("Bereiche") 'alle Bereiche
      aNames()= obereiche.getElementNames 'Namen aller Bereiche
      for i=0 To UBound(aNames()) 'Schleife über alle Bereiche
        oBereiche.getByName(aNames(i)).dispose 'Alle Bereiche löschen.
        ' Dabei wird der Inhalt der Bereiche nicht gelöscht.
      Next
    end if 
  end if
End Sub
Gruß Frieder
hvb
****
Beiträge: 137
Registriert: Mo, 06.09.2004 14:54

Re: Verknüpfung von Bereichen beim Speichern lösen

Beitrag von hvb »

Hallo Frieder,
vielen Dank - funktioniert tadellos! Dass die Bereiche nicht erhalten bleiben ist zu verschmerzen. Wesentlich wichtiger ist, dass alte Dokumente, die auf der Vorlage basieren, nicht mehr aus Versehen aktualisiert werden können. (Ich habe gestern auch noch in diese Richtung getüftelt und mich prompt mit meinen TextSections verrannt.)

Anmerkung:
Ich habe die Abfrage, ob die Datei schon gespeichert ist und welche Endung sie hat auskommentiert und das Makro dem Ereignis "Neues Dokument" zugewiesen, da ich mir so das zweite Speichern nach dem Entfernen der Bereiche spare. Letztlich ist es für mich unerheblich, ob der Inhalt der Bereiche beim Erzeugen oder Abspeichern eines Dokuments "fixiert" wird. (Sollte es nötig sein hierarchische Dokumentvorlagen zu erstellen, in denen die Bereiche erhalten bleiben, könnte man das Löschen der Bereiche ja mit einer einfachen Abfrage mit einer msgbox unterbinden - brauch ich aber in diesem Fall nicht.)

Langer Rede kurzer Sinn: Vielen Dank, Frieder, für Deine Mühe!

Gruß
Martin
Antworten