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



On 05/06/2013 05:21 AM, Vieri wrote:
Hi,

I have an odt writer document with 2 input text fields (added with the form designer toolbar). I 
manually type text into one of the fields. I copy/pasted a macro to see if I could grab the text 
within the input field but haven't had any luck. This is the test macro in Basic:

Sub EnumerateFields
   vEnum = ThisComponent.getTextFields().createEnumeration()
   If Not IsNull(vEnum) Then
     If vEnum.hasMoreElements() Then
       Print "OK"
     Else
       Print "NOT OK"
     End If
   End If
End Sub

If I manually run this macro I get the "NOT OK" message.

What am I doing wrong?
What is the correct way of getting the text field elements?

Thanks

Vieri



I grabbed these two routines from my test modules without running them first.... so I have no idea what state they are in, but without taking the time to create a test document and such..... Perhaps these will help you. I don't even know why I have them. Probably have better coverage in OOME_3.odt or AndrewMacro.odt (but I did not check).

REM Author: Andrew Pitonyak
Sub EnumerateTextFields(Optional oUseDoc)
  Dim oDoc      'Document to use.
  Dim oEnum     'Enumeration of the text fields.
  Dim oField    'Enumerated text field.
  Dim s$        'Generic string variable.
  Dim n%        'Count the number of text fields.
  Dim nUnknown% 'Count the unexpected field types.
  Dim bDisplayExpressions As Boolean
  bDisplayExpressions = True


  If IsMissing(oUseDoc) Then
    oDoc = ThisComponent
  Else
    oDoc = oUseDoc
  End If

  oEnum = oDoc.getTextFields().createEnumeration()
  If IsNull(oEnum) Then
    Print "getTextFields().createEnumeration() returns NULL"
    Exit Sub
  End If

  Do While oEnum.hasMoreElements()
    oField = oEnum.nextElement()
    If oField.supportsService("com.sun.star.text.TextField.Input") Then
      REM If you update Content, use oDoc.TextFields.refresh() afterwards.
      n = n + 1
      s = s & "Input (" & oField.getPropertyValue("Hint") & ", " & _
              oField.getPropertyValue("Content") & ")" & CHR$(10)
    ElseIf oField.supportsService("com.sun.star.text.TextField.User") Then
      REM You can update the text master field, but be certain to use
      REM oDoc.TextFields.refresh() afterwards.
      n = n + 1
      s = s & "User (" & oField.TextFieldMaster.Name & ", " & _
              oField.TextFieldMaster.Value & ", " & _
              oField.TextFieldMaster.InstanceName & ")" & CHR$(10)
ElseIf oField.supportsService("com.sun.star.text.TextField.PageNumber") Then
      REM Ignore page number fields
ElseIf oField.supportsService("com.sun.star.text.TextField.GetReference") Then REM Ignore references to Listings, Tables, and Figures because I want to. If oField.SourceName <> "Listing" AND oField.SourceName <> "Table" AND oField.SourceName <> "Figure" Then
        n = n + 1
s = s & "Reference (" & oField.SourceName & ", " & oField.getPresentation(False) & ")" & CHR$(10)
      End If
ElseIf oField.supportsService("com.sun.star.text.TextField.SetExpression") Then
      REM This includes things such as Tables, Listing, and Figures
      REM The values will be similar to "SetExpression (Table, Table + 1)"
      If bDisplayExpressions Then
        n = n + 1
s = s & "SetExpression (" & oField.VariableName & ", " & oField.Content & ")" & CHR$(10)
        Inspect oField
      End If
ElseIf oField.supportsService("com.sun.star.text.TextField.Chapter") OR _
oField.supportsService("com.sun.star.text.TextField.DocInfo.Title") OR _
oField.supportsService("com.sun.star.text.TextField.DocInfo.ChangeDateTime") OR _
oField.supportsService("com.sun.star.text.TextField.Bibliography") OR _
oField.supportsService("com.sun.star.text.TextField.Annotation") Then
      n = n + 1
s = s & oField.getPresentation(True) & " : " & oField.getPresentation(False) & CHR$(10)
    Else
      nUnknown = nUnknown + 1
      n = n + 1
      If nUnknown = 1 Then inspect(oField)
s = s & "Unknown : " & oField.getPresentation(True) & " : " & oField.getPresentation(False) & CHR$(10)
    End If
    If n > 50 Then
      MsgBox s, 0, "Text Fields"
      s = ""
      n = 0
    End If
  Loop
  If n > 0 Then
    MsgBox s, 0, "Text Fields"
    s = ""
    n = 0
  End If
If nUnknown > 0 Then Print "Found " & nUnknown & " unexpected field types"
  Print "Finished"
End Sub



Sub DisplayMasterFields(Optional oUseDoc)
  Dim oMasters     'Text field masters from the document.
  Dim sNames()     'Text field master names.
  Dim i%           'Generic loop variable.
  Dim sVal$
  Dim s$           'Generic string variable.
  Dim oMasterField 'A particular master field.
  Dim sUserType$   'Holds the name for a User defined text field master

  sUserType = "com.sun.star.text.FieldMaster.User"

  If IsMissing(oUseDoc) Then
    oMasters = ThisComponent.getTextFieldMasters()
  Else
    oMasters = oUseDoc.getTextFieldMasters()
  End If
  sNames() = oMasters.getElementNames()
  s = "===Text Field Masters==="
  For i = LBound(sNames()) to UBound(sNames())
    s = s & Chr$(13) & "(" & sNames(i)
    oMasterField = oMasters.getByName(sNames(i))
    If Not IsNull(oMasterField) Then
      s = s & "," & oMasterField.Name
      If (Left$(sNames(i),Len(sUserType)) = sUserType) Then
        REM If the user type is an expression, then you can access
        REM the Value property, which is a double.
        s = s & "," & oMasterField.Content

        REM In general, you will not get here You will
        REM have entries with names such as:
        REM com.sun.star.text.FieldMaster.SetExpression.Illustration
        REM com.sun.star.text.FieldMaster.SetExpression.Table
        REM com.sun.star.text.FieldMaster.SetExpression.Text
        REM com.sun.star.text.FieldMaster.SetExpression.Drawing
        REM com.sun.star.text.FieldMaster.User
      End If
    End If
    s = s & ")"
  Next i
  MsgBox s, 0, "Text Field Masters"
End Sub


--
Andrew Pitonyak
My Macro Document: http://www.pitonyak.org/AndrewMacro.odt
Info:  http://www.pitonyak.org/oo.php


--
To unsubscribe e-mail to: users+unsubscribe@global.libreoffice.org
Problems? http://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/
Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
List archive: http://listarchives.libreoffice.org/global/users/
All messages sent to this list will be publicly archived and cannot be deleted

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.