Pagina 1 di 1

Macro per Writer

Inviato: sabato 29 aprile 2023, 13:33
da gino62
Allego link per file odt contenente varie macro per writer.
... per chi volesse iniziare ...
https://www.dropbox.com/t/Py9QzKwEvZ1aR6FU

Buon fine settimana

Re: Macro per Writer

Inviato: domenica 30 aprile 2023, 9:32
da charlie
Ciao @gino62, si intuisce che è un lavoro notevole.
Puoi dirci qualcosa di più?
Da cosa differisce dalla traduzione del lavoro di Andrew Pitonyak che avevi postato qui? viewtopic.php?p=64828#p64828

Re: Macro per Writer

Inviato: lunedì 1 maggio 2023, 10:16
da gino62
charlie ha scritto: domenica 30 aprile 2023, 9:32 ...Puoi dirci qualcosa di più?
Da cosa differisce dalla traduzione del lavoro di Andrew Pitonyak ...
Buongiorno a tutti,
il libro di Andrew Pitonyak avevo iniziato a tradurlo, qui ho modificato totalmente e preso da varie parti ...
non sono un programmatore e ho cercato di creare per uso personale un documento che mi consentisse quando avessi avuto la necessità di risolvermi qualche passaggio, da questo, per renderlo più usufruibile ad altri ho dovuto sistemarlo e ho cercato di approfondire il più possibile molti argomenti. Ho preso spunti ed esempi in varie parti, sia nella rete che nei libri (ovviamente è migliorabile ...). Mi ha tenuto occupato per quasi due anni, ho già trovato alcuni errori:
il listato 105 dovrebbe dare errore perchè nella Sub EnumerazioneParagrafi_Sottoparagrafi(oDoc) bisognerebbe commentare

Codice: Seleziona tutto

oDoc = IIf(IsMissing(oDoc), ThisComponent, oDoc)
e al suo posto mettere

Codice: Seleziona tutto

If Not IsNull (oDoc.Source.ImplementationName)  Then oDoc = ThisComponent 
poi devrebbe funzionare, probabilmente ho messo il parametro oDoc perchè forse la uso in altre parti (difficile ricordare tutto) e spero non dia errore oDoc.Source in altre parti che la richiamano. A seconda che una sub con parametro oDoc sia chiamata da un pulsante o da una altra sub il parametro passato è diverso. Bisognerebbe modificarla per includere i due casi.... - altrimenti bisognerà modificarla di nuovo. Bisognerebbe ricercare quali sub la richiamano (con la funzione cerca).

Nel listato 124 mi sono dimenticato di mettere il pulsante per l'esecuzione della macro.
ESEGUITE LA MACRO DIRETTAMENTE. Andate nella libreira LibWriter nel modulo Mdl_RefHeading_TOC ed eseguite la sub Indice_URL_Segnalibri__RefHeading__Tocnn-nn(), ma non tanto per l'esecuzione ma perchè si usano macro di questo documento e si esportano in un altro documento: da questo documento si apre un nuovo documento, si inserisce un pulsante cui accede a moduli importati ... spero di essermi fatto capire. ... oppure create voi un pulsante.
Se qualcuno vede questi errori e li risolve condividete.
TUTTA la libreria Lib_Esportare è fatta per questo: ogni modulo viene esportato in un nuovo documento:
ad esempio il listato 438
il listato 515 che è sbagliato, modificatelo così:

Codice: Seleziona tutto

'usa modulo "Mdl_Esportare1" della libreria "Lib_Esportare" del documento
Sub IdentificaNomiRiempimentoAreaBitmapDocumento()
  rem ----------------------------------------------------------------------
  rem definizione delle variabili
  Dim oDoc As Object
  Dim oCurrentController As Object
  Dim oText As Object
  Dim structSize As New com.sun.star.awt.Size
  Dim oRectangleShape As Object
  Dim strString As String
  Dim strTitoloDlg As String
  Dim strTestoEtichetta As String
  Dim oLibs As Object    'contenitore di Librerie Basic
  Dim oLib As Object     'una libreria
  Dim strLib As String   'Nome della libreria
  Dim strMdl As String   'Nome del modulo
  Dim strMacro As String 'codice della macro
  Dim oBasicLibrary_Document As Object
  Dim FileProperties(0) As New com.sun.star.beans.PropertyValue	'Un array (vuoto) di PropertyValues
  Dim oDoc_ThisComponent As Object
  Dim oBasicLibraries As Object   'contenitore di Librerie - ElementType=com.sun.star.container.XNameAccess
  Dim oLibraryContainer As Object 'contenitore di Librerie - com.sun.star.script.XStarBasicLibraryInfo
  Dim oModuleContainer As Object
  Dim oLib_ThisComponent As Object
  Dim i As Integer 
  Dim strScript As String
  Dim sScriptURL As String
  Dim oControlShape As Object 'un oggetto ControlShape
  Dim structPoint As Object 
  Dim oButtonModel As Object
  Dim oDrawPage As Object
  Dim oForm As Object
  Dim structEvent As Object
  rem ----------------------------------------------------------------------  
    strTitoloDlg = "apertura documento di esempio"
    strTestoEtichetta = "Per non modificare il documento principale" & Chr(13) &_
                        "apriamo un nuovo documento e" & Chr(13) &_
                        "inseriamo del testo ad inizio documento"
    Call Lbl_Finestre_di_Dialogo.Mdl_FinDlgNonModale_MsgBox.FinestraDialogoNonModale(strTitoloDlg, strTestoEtichetta, True, False )
    If Not Boolean_Dlg_Stop Then 
      Exit Sub
    End If
  oDoc = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, FileProperties())'crea l'oggetto documento
  oCurrentController = oDoc.CurrentController
  oCurrentController.Frame.ContainerWindow.toFront()
  oText = oDoc.getText()		'metodo dell'oggetto oDoc (com.sun.star.lang.XComponent) - oggetto di tipo SwXBodyText 		' 
  'inserimento testo
  strString  = Chr(13) & "Per identificare i nomi di riempimento area bitmap del rettangolo premere sul pulsante." & Chr(13) & _
                         "Per identificare un nome diverso cliccare con il tasto sinistro nella forma (selezionandola) " & _
                         "per poi cliccare con il destro e selezionare ""area"" per scegliere il riempimento bitmab da identificarne il nome." & Chr(13) & _
                         "Cliccare sul pulsante." & Chr(13) & _
                         "Potete anche cambiare sfumatura, motivo, tratteggio, colore, ecc... "
  oText.insertString(oText.getStart(), strString, false)	'metodo insertString dell'interfaccia com.sun.star.text.XSimpleText	
 
  'devo caricare la libreria prima di accedervi
  oBasicLibrary_Document = ThisComponent.BasicLibraries
  oBasicLibrary_Document.LoadLibrary("Lib_Esportare")
  'recupera il contenuto di un modulo
  oDoc_ThisComponent = ThisComponent
  oBasicLibraries = oDoc_ThisComponent.BasicLibraries    'com.sun.star.comp.sfx2.ScriptLibraryContainer
  oLib_ThisComponent = oBasicLibraries.getByName("Lib_Esportare")
  strScript = oBasicLibraries.getByName("Lib_Esportare").getByName("Mdl_Esportare1") 
  strLib = "Lib_Nuova"
  strMdl = "Mdl_Importato"
  strMacro = strScript
  'Crea Libreria, modulo e macro -> EnumeraOggettiDrawPage
  oLibs = oDoc.BasicLibraries   'com.sun.star.comp.sfx2.ScriptLibraryContainer (ContainerLocationName = "Basic")
  oLibs.createLibrary(strLib)
  oLib = oLibs.getByname(strLib)   'una libreria di nome strLib
  oLib.insertByName(strMdl,strMacro)
  'crea un pulsante e gli assegna la macro
  'macro da assegnare al pulsante
  sScriptURL = "vnd.sun.star.script:Lib_Nuova.Mdl_Importato.EnumeraOggettiRectangleShape?language=Basic&location=document" 'Was location=application
  oDrawPage = oDoc.getDrawPage()
  oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")
  structPoint = CreateUnoStruct("com.sun.star.awt.Point")
  structPoint.X = 1000
  structPoint.Y = 1000
  structSize.Width = 9000
  structSize.Height = 1000
  oControlShape.setPosition(structPoint)
  oControlShape.setSize(structSize)
  oButtonModel = CreateUnoService("com.sun.star.form.component.CommandButton")
  oButtonModel.Name = "Button_1"
  oButtonModel.Label = "Identifica Nomi Riempimento Area Bitmap"
  oControlShape.setControl(oButtonModel)
  oDrawPage.add(oControlShape)
  oForm = oDrawPage.getForms().getByIndex(0)
  structEvent = CreateUnoStruct("com.sun.star.script.ScriptEventDescriptor")
  With structEvent
    .AddListenerParam = ""
    .EventMethod = "actionPerformed"
    .ListenerType = "XActionListener"
    .ScriptCode = sScriptURL
    .ScriptType = "Script"
  End With
  oForm.registerScriptEvent(0, structEvent)
  rem disattivare la modalità di progettazione del form
  oCurrentController.setFormDesignMode(False)
  
   'RettangleShap    
  structSize.Width = 10000
  structSize.Height = 10000
  oRectangleShape = oDoc.createInstance("com.sun.star.drawing.RectangleShape")
  oRectangleShape.Size = structSize
  oRectangleShape.FillStyle = com.sun.star.drawing.FillStyle.BITMAP
  oText.insertTextContent(oText.End, oRectangleShape, False)
  oRectangleShape.FillBitmapName = "Lawn"
  oRectangleShape.FillBitmapMode = com.sun.star.drawing.BitmapMode.REPEAT
  'finestra di dialogo non modale   
  strTitoloDlg ="oDoc.createInstance (""com.sun.star.drawing.RectangleShape"")"
  strTestoEtichetta = "Possiamo modificare il riempimento per poi saperne il nome"
  Call Lbl_Finestre_di_Dialogo.Mdl_FinDlgNonModale_MsgBox.FinestraDialogoNonModale(strTitoloDlg, strTestoEtichetta, True, False )
  
End Sub 
Se si trovano errori postateli.

Buona giornata a tutti