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