Date: prev next · Thread: first prev next last
2017 Archives by date, by thread · List index


Hallo Dieter, Robert. *,

als ich das Makro mal auf ein eigenes Dokument anwenden wollte, bekam ich Fehlermeldungen. Der Grund war, dass das Verfolgen von Änderungen angeschaltet war und damit auch bereits gelöschteTextfelder wegen des Vergleichs noch vorhanden waren, aber nicht selektiert werden konnten (das Dokument war ein Kapitel eines LibreOffice-Handbuchs). Ich habe das Makro entsprechend angepast und außerdem einen Dialog zur Anzeige des "Fortschritts" (einfach die fortlaufende Nummer des untersuchten Textfelds) hinzugefügt, weil das Programm doch eine Weile läuft und man sonst nicht weiß, dass es noch aktiv ist. Das scheint ein nützliches Werkzeug zu sein, aber ich weiß nicht so recht, wie man das elegant der Allgemeinheit zur Verfügung stellt.

Hier der Code (Deklarationen fehlen meist noch):

Sub fehlendeReferenz

dim prop(), zaehl as long

oDoc = ThisComponent
oText = oDoc.Text

' create dialog
oDialog = CreateUnoService("com.sun.star.awt.UnoControlDialog")
oDialogModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
oDialogModel.setPropertyValues( _
    Array("Height", "PositionX", "PositionY", "Width","Title"), _
    Array(30, 50, 50, 100, "Nummer des Textfelds") )
oDialog.setModel(oDialogModel)
oFTextModel = oDialogModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel") oFTextModel.setPropertyValues(Array("Height", "Label", "PositionX", "PositionY", "Width"), _
     Array(13, "A", 35, 10, 10))
oDialogModel.insertByName("CountTextFields", oFTextModel)
oDialog = CreateUnoService("com.sun.star.awt.UnoControlDialog")
oDialog.setModel(oDialogModel)
oDialog.setVisible(TRUE)
oTextFields = oDoc.Textfields.createEnumeration
do while oTextFields.hasMoreElements
    oTextField = oTextFields.nextElement
    zaehl = zaehl + 1
    wait 1    'otherwise many numbers will not be displayed, resulting in a seemingly frozen state
    oDialog.getControl("CountTextFields").Text = zaehl
    if oTextField.isFieldDisplayed = TRUE then
        prop = oTextField.PropertySetInfo.getProperties
        for i = 0 to UBound(prop) - 1
            if prop(i).Name = "CurrentPresentation" then
                    if oTextField.CurrentPresentation = "Fehler: Referenz nicht gefunden" then
                    msgbox "fehlende Referenz gefunden, wird angezeigt"
                    oCtrler.select(oTextField.Anchor)
                    exit sub
                end if
            end if
        next
    end if
loop
msgbox "keine fehlende Referenz gefunden"
oDialog.setVisible(FALSE)

End Sub

Wie gesagt: So funktioniert es nur, wenn man es z.B. über eine Tastenkombination im Dokument selbst aufruft.

Gerhard

Am 06.07.2017 um 22:50 schrieb Gerhard Weydt:
Hallo Dieter, Robert, *,

ich kann euch ein Makro anbieten, das in dieser einfachen Form die "erste" Referenz findet, zu der das referenzierte Objekt nicht mehr vorhanden ist. "Erste" dürfte nicht der von der Reihenfolge erste, sondern der am frühesten angelegte Verweis sein.

Sub Main

oDoc = ThisComponent
oCtrler = oDoc.CurrentController
oTextFields = oDoc.Textfields.createEnumeration
do while oTextFields.hasMoreElements
    oTextField = oTextFields.nextElement
    if oTextField.CurrentPresentation = "Fehler: Referenz nicht gefunden" then
        oCtrler.select(oTextField.Anchor)
    end if
loop

End Sub

Das Makro darf man nicht von der Makro-IDE aus starten, dann klappt zwar der Select, aber die Seite mit dem ausgewählten Verweis wird nicht angezeigt. Aber es geht, wenn man das Makro über eine Tastenkombination startet, ich habe z.B. Alt+R verwendet. Das ist nur ein einfaches Modell, man kann damit arbeiten, wenn man jeweils eine fehlerhafte Referenz sucht, sie korrigiert oder beseitigt und dann nach der nächsten sucht. Vielleicht fällt jemand eine Verbesserung ein.

Gruß

Gerhard

Am 06.07.2017 um 20:42 schrieb Robert Großkopf:
Hallo Dieter,
der Umweg über PDF ist mir noch gar nicht in den Sinn gekommen. Ist zwar
umständlich, aber immerhin stellt das sicher, dass keine fehlenden
Querverweise übersehen werden. Vielleicht weiß aber doch noch jemand
eine elegantere Variante.

Dazu habe ich auch schon vor einiger Zeit eine Bugmeldung aufgegeben.
Weißt du noch die Bug-Nummer? Ich hatte auch schonmal in Bugzilla
nachgeschaut, aber auf die Schnelle nichts entdeckt.
Ist dieser hier:
https://bugs.documentfoundation.org/show_bug.cgi?id=58920

Gruß

Robert




--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.