[Risolto] Assegnare Macro con Macro
[Risolto] Assegnare Macro con Macro
Tanto per cominciare (è il mio primo 'post' ...) un Saluto a tutto il Forum e a tutta la Comunità!
Sarei molto felice se qualcuno mi aiutasse a trovare il modo di modificare "globalmente" l'assegnazione della stessa Macro a 15 Caselle di Controllo (da "CC_1" a "CC_15") in un Formulario di Calc (all'Evento "Stato Modificato"), senza cioè dover ripetere per 15 volte da desktop la trafila Proprietà>Eventi>Azione>Selettore>Libreria>Modulo>Macro ...
Il tutto potrebbe presentarsi così:
Sub RE_ASS
Dim oFormulario As Object
Dim obj As Object
Dim co1 As Integer
Dim sCC_N As String
oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName("Formulario")
For co1 = 1 To 15
sCC_N = "CC_" & co1
obj = oFormulario.getByName(sCC_N)
' Codice che reindirizzi l'assegnazione per l'evento "Stato Modificato"
' da Standard.OPZ_CC.OPZ_CC (document, Basic)
' a LamLib.B_Run.OPZ_CC (document, Basic)
Next co1
End Sub
... ma nemmeno nelle "Bibbie" di Andrew D. Pitonyak e di Mauricio Baeza Servin ho trovato qualcosa che potesse rimpiazzare le righe sotto apice...
Grazie ...
Sarei molto felice se qualcuno mi aiutasse a trovare il modo di modificare "globalmente" l'assegnazione della stessa Macro a 15 Caselle di Controllo (da "CC_1" a "CC_15") in un Formulario di Calc (all'Evento "Stato Modificato"), senza cioè dover ripetere per 15 volte da desktop la trafila Proprietà>Eventi>Azione>Selettore>Libreria>Modulo>Macro ...
Il tutto potrebbe presentarsi così:
Sub RE_ASS
Dim oFormulario As Object
Dim obj As Object
Dim co1 As Integer
Dim sCC_N As String
oFormulario = ThisComponent.getCurrentController.getActiveSheet.getDrawPage.getForms.getByName("Formulario")
For co1 = 1 To 15
sCC_N = "CC_" & co1
obj = oFormulario.getByName(sCC_N)
' Codice che reindirizzi l'assegnazione per l'evento "Stato Modificato"
' da Standard.OPZ_CC.OPZ_CC (document, Basic)
' a LamLib.B_Run.OPZ_CC (document, Basic)
Next co1
End Sub
... ma nemmeno nelle "Bibbie" di Andrew D. Pitonyak e di Mauricio Baeza Servin ho trovato qualcosa che potesse rimpiazzare le righe sotto apice...
Grazie ...
Ultima modifica di fizapol il lunedì 11 novembre 2013, 18:46, modificato 1 volta in totale.
OpenOffice4 .0 su Windows 8
Re: Assegnare Macro con Macro
seguirò questa discussione con molta attenzione, perchè durante lo sviluppo di un progetto che adopera numerose macro ho il vizio di iniziare a scriverle tutte all'interno di un modulo e/o con nomi bizzarri, poi quando inizio a rinominare le singole macro e ordinarle in moduli, sistematicamente mi sale lo sconforto perchè devo riassegnare le macro agli eventi.
Al momento ho fatto una finestra di dialogo multi-step, per esempio, con numerosi checkbox per pagina,ciascuno dei quali ha assosciato la stessa identica macro e anch'io mi chiedo...c'è un modo per implementare un algoritmo che agevoli l'assegnazione della macro rinominata all'evento?
Al momento ho fatto una finestra di dialogo multi-step, per esempio, con numerosi checkbox per pagina,ciascuno dei quali ha assosciato la stessa identica macro e anch'io mi chiedo...c'è un modo per implementare un algoritmo che agevoli l'assegnazione della macro rinominata all'evento?
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Re: Assegnare Macro con Macro
Prendendo spunto da queste guide:
https://wiki.openoffice.org/wiki/Docume ... /Listeners
https://wiki.openoffice.org/wiki/Docume ... ent_Events
credo che la strada sia quella di creare un ascoltatore per ciascun evento, cioè una cosa del genere:
se per controlli differenti devi associare macro differenti allo stesso tipo di evento, allora l'ascoltatore deve distinguere il campo di controllo, quindi devi usare una cosa del tipo:
per risalire al campo di controllo che ha "attivato" l'evento
Sono sicuro al 99% che la strada sia questa, peccato che ho trovato solo il servizio degli eventi del documento
Se qualcuno ha idee migliori o suggerimenti si faccia vivo
https://wiki.openoffice.org/wiki/Docume ... /Listeners
https://wiki.openoffice.org/wiki/Docume ... ent_Events
credo che la strada sia quella di creare un ascoltatore per ciascun evento, cioè una cosa del genere:
Codice: Seleziona tutto
Sub RegisterListener
oListener = CreateUnoListener( "DocumentListener_","com.sun.star.document.XEventListener" )
ThisComponent.com_sun_star_document_XEventBroadcaster_addEventListener( oListener )
End Sub
Sub DocumentListener_notifyEvent( o as object )
IF o.EventName = "OnPrepareUnload" THEN
print o.Source.URL
ENDIF
end sub
Sub DocumentListener_disposing()
End Sub
Codice: Seleziona tutto
o.Source.Model.Name
Sono sicuro al 99% che la strada sia questa, peccato che ho trovato solo il servizio degli eventi del documento
Codice: Seleziona tutto
http://www.openoffice.org/api/docs/common/ref/com/sun/star/document/Events.html
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Re: Assegnare Macro con Macro
Ho trovato la soluzione al mio problema.La riporto e poi allego i collegamenti alle pagine web che mi hanno permesso di arrivarci:
La pagina che mi ha fatto superare l'ostacolo è:
http://www.openoffice.org/api/docs/comm ... ckBox.html
Da qui, sono giunto a
http://www.openoffice.org/api/docs/comm ... tener.html
Quindi per altri elementi di controllo si può seguire una procedura del tutto simile e il gioco è fatto
p.s.
fino ad oggi non ho mai capito come funzionasse il CreateUnoListener, quest'altra pagina invece me lo ha fatto capire:
https://help.libreoffice.org/Basic/Crea ... Runtime/it
Codice: Seleziona tutto
sub registracheckbox
x=oDlg1.getControls() 'oDlg1 è la finestra di dialogo
for iCntrl = LBound(x) To UBound(x) ' FOR SUGLI ELEMENTI DELLA FINESTRA DI DIALOGO
oCntrl = x(iCntrl)
if instr(oCntrl.Model.Name,"CheckBox")<>0 then 'di tutti gli elementi mi interessano i CheckBox**
addCBListener(oCntrl)
end if
next
end sub
Public Function addCBListener (oCB as Object)
oListener = CreateUnoListener( "CheckBoxListener_","com.sun.star.awt.XItemListener" )
oCB.addItemListener( oListener )
End Function
Sub CheckBoxListener_itemStateChanged( o as object )
msgbox o.Source.Model.Name
'in questo punto con un select case possiamo far eseguire operazioni diverse ai checkbox
end sub
http://www.openoffice.org/api/docs/comm ... ckBox.html
Da qui, sono giunto a
http://www.openoffice.org/api/docs/comm ... tener.html
Quindi per altri elementi di controllo si può seguire una procedura del tutto simile e il gioco è fatto
p.s.
fino ad oggi non ho mai capito come funzionasse il CreateUnoListener, quest'altra pagina invece me lo ha fatto capire:
https://help.libreoffice.org/Basic/Crea ... Runtime/it
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Re: Assegnare Macro con Macro
Mi pare che unlucky83 abbia svolto un OTTIMO Lavoro!!!
(... oltretutto in orari in cui chi scrive "se la dorme" ed altri si "fulminano" nelle discoteche!...)
Cerco di fare un riepilogo per (soprattutto mia) chiarezza:
Dal momento che, per quanto riguarda gli eventi, "...OpenOffice.org Basic does not support the concept of object implementation...", cioè una via diretta per accedere agli eventi associati ad un particolare oggetto, è necessario predisporre, con la funzione a livello di RunTime CreateUnoListener delle apposite "sentinelle" (Listeners) che, una volta associate al Tipo di oggetto add[Tipo]Listener (...ma di questo non sono sicuro...) intercettino l'evento per poi ricondurlo all'oggetto specifico [Oggetto].Source.Model.Name che lo ha generato. Una volta "smascherato il responsabile" sarà agevole impostare le opportune istruzioni condizionali con relative chiamate di Routine.
Sperando di non aver detto troppe "scemenze", ringrazio unlucky83 e mi ripropongo di intervenire nuovamente dopo aver approfondito l'argomento (... in particolare dopo aver verificato se tale via prevalga sull'assegnazione fatta a livello di Desktop o viceversa...)
Grazie ed un Saluto a Tutti!
(... oltretutto in orari in cui chi scrive "se la dorme" ed altri si "fulminano" nelle discoteche!...)
Cerco di fare un riepilogo per (soprattutto mia) chiarezza:
Dal momento che, per quanto riguarda gli eventi, "...OpenOffice.org Basic does not support the concept of object implementation...", cioè una via diretta per accedere agli eventi associati ad un particolare oggetto, è necessario predisporre, con la funzione a livello di RunTime CreateUnoListener delle apposite "sentinelle" (Listeners) che, una volta associate al Tipo di oggetto add[Tipo]Listener (...ma di questo non sono sicuro...) intercettino l'evento per poi ricondurlo all'oggetto specifico [Oggetto].Source.Model.Name che lo ha generato. Una volta "smascherato il responsabile" sarà agevole impostare le opportune istruzioni condizionali con relative chiamate di Routine.
Sperando di non aver detto troppe "scemenze", ringrazio unlucky83 e mi ripropongo di intervenire nuovamente dopo aver approfondito l'argomento (... in particolare dopo aver verificato se tale via prevalga sull'assegnazione fatta a livello di Desktop o viceversa...)
Grazie ed un Saluto a Tutti!
OpenOffice4 .0 su Windows 8
Re: Assegnare Macro con Macro
Grazie per l'aggettivo ottimo
Se per te vale come soluzione la mia proposta, metti "Risolto" nel titolo del messaggio con cui hai aperto questa discussione, grazie
Saluti a te fizapol
p.s.
hai fatto bene a sintetizzare il tutto
Se per te vale come soluzione la mia proposta, metti "Risolto" nel titolo del messaggio con cui hai aperto questa discussione, grazie
Saluti a te fizapol
p.s.
hai fatto bene a sintetizzare il tutto
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Re: Assegnare Macro con Macro
riprovando le mie macro mi sono accorto di una errore:
alla chiusura della macro principale,ovvero quella che apre e chiude il dialogo, si apre in automatico l'editor delle macro, ma sulla libreria "Tutto" di Openoffice.
Ho risolto aggiungendo la seguente macro al modulo:
Questo credo sia tutto sugli eventi dei checkbox delle finestre di dialogo
alla chiusura della macro principale,ovvero quella che apre e chiude il dialogo, si apre in automatico l'editor delle macro, ma sulla libreria "Tutto" di Openoffice.
Ho risolto aggiungendo la seguente macro al modulo:
Codice: Seleziona tutto
Sub CheckBoxListener_disposing( o as object )
end sub
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Re: Assegnare Macro con Macro
Per mia sfortuna il metodo proposto da unlucky83 (per quanto brillante ed istruttivo) non è risultato applicabile al mio caso, in quanto i CheckBox dei Formulari non supportano l'interfaccia com.sun.star.awt.XCheckBox ...
Tuttavia, come spesso ho sperimentato in questi ultimi due mesi in cui mi sono esercitato in OOBasic, ci sono vie "traverse" per arrivare alla soluzione ...
In particolare ho sfruttato il fatto che le CC_ da 1 a 15 erano già collegate a Ranghi "monocella" nominati OC_ da 1 a 15 ...
Adattando quanto trovato in:
http://ooo-forums.apache.org/it/forum/v ... 65f#p16414
Sub OC_LISTENER
Dim oSheet As Object
Dim oCell As Object
Dim iCo As Integer
Dim sCC_N As String
oSheet = ThisComponent.getSheets().getByIndex(4)
For iCo = 1 To 15
sCC_N = "OC_" & iCo
oCell = oSheet.getCellRangeByName(sCC_N)
oListener = CreateUnoListener("OCN_", "com.sun.star.chart.XChartDataChangeEventListener")
oCell.addChartDataChangeEventListener(oListener)
Next iCo
End Sub
Sub OCN_chartDataChanged
Call OPZ_CC
End Sub
Considerando poi che sia i ranghi di celle sia le specifiche del loro collegamento ai controlli, se non presenti, sono facilmente impostabili massivamente nel Runtime, direi che il problema può dirsi Risolto
Di nuovo Grazie e Saluti
Tuttavia, come spesso ho sperimentato in questi ultimi due mesi in cui mi sono esercitato in OOBasic, ci sono vie "traverse" per arrivare alla soluzione ...
In particolare ho sfruttato il fatto che le CC_ da 1 a 15 erano già collegate a Ranghi "monocella" nominati OC_ da 1 a 15 ...
Adattando quanto trovato in:
http://ooo-forums.apache.org/it/forum/v ... 65f#p16414
Sub OC_LISTENER
Dim oSheet As Object
Dim oCell As Object
Dim iCo As Integer
Dim sCC_N As String
oSheet = ThisComponent.getSheets().getByIndex(4)
For iCo = 1 To 15
sCC_N = "OC_" & iCo
oCell = oSheet.getCellRangeByName(sCC_N)
oListener = CreateUnoListener("OCN_", "com.sun.star.chart.XChartDataChangeEventListener")
oCell.addChartDataChangeEventListener(oListener)
Next iCo
End Sub
Sub OCN_chartDataChanged
Call OPZ_CC
End Sub
Considerando poi che sia i ranghi di celle sia le specifiche del loro collegamento ai controlli, se non presenti, sono facilmente impostabili massivamente nel Runtime, direi che il problema può dirsi Risolto
Di nuovo Grazie e Saluti
OpenOffice4 .0 su Windows 8
Re: [Risolto] Assegnare Macro con Macro
Salve a tutti,
Riprendo questa discussione dopo molto tempo poiché ho trovato la soluzione che inizialmente cercavo in
https://forum.openoffice.org/en/forum/v ... p?t=27424#
Di seguito il codice
Questa volta l'ho utilizzato in fase di inserimento automatizzato di pulsanti in una procedura che avevo già sviluppato (e quindi con poche modifiche, estrapolando i brani di codice, senza tutte le chiamate) ma credo che possa funzionare egregiamente anche su controlli esistenti.
Riprendo questa discussione dopo molto tempo poiché ho trovato la soluzione che inizialmente cercavo in
https://forum.openoffice.org/en/forum/v ... p?t=27424#
Di seguito il codice
Codice: Seleziona tutto
Sub CreateButton
oDoc = ThisComponent
oSheet = oDoc.Sheets.getByIndex(1)
oDrawPage = oSheet.DrawPage 'Was oDrawPage = oDoc.getDrawPage()
sScriptURL = "vnd.sun.star.script:Standard.Module1.ButtonPushEvent?language=Basic&location=document" 'Was location=application
oButtonModel = AddNewButton("Button_1", "Button_1", oDoc, oDrawPage)
oForm = oDrawPage.getForms().getByIndex(0)
' find index inside the form container
nIndex = GetIndex(oButtonModel, oForm)
AssignAction(nIndex, sScriptURL, oForm)
End Sub
' assign sScriptURL event as css.awt.XActionListener::actionPerformed.
' event is assigned to the control described by the nIndex in the oForm container
Sub AssignAction(nIndex As Integer, sScriptURL As String, oForm As Object)
aEvent = CreateUnoStruct("com.sun.star.script.ScriptEventDescriptor")
With aEvent
.AddListenerParam = ""
.EventMethod = "actionPerformed"
.ListenerType = "XActionListener"
.ScriptCode = sScriptURL
.ScriptType = "Script"
End With
oForm.registerScriptEvent(nIndex, aEvent)
End Sub
Function AddNewButton(sName As String, sLabel As String, oDoc As Object, oDrawPage As Object) As Object
oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")
aPoint = CreateUnoStruct("com.sun.star.awt.Point")
aSize = CreateUnoStruct("com.sun.star.awt.Size")
aPoint.X = 1000
aPoint.Y = 1000
aSize.Width = 3000
aSize.Height = 1000
oControlShape.setPosition(aPoint)
oControlShape.setSize(aSize)
oButtonModel = CreateUnoService("com.sun.star.form.component.CommandButton")
oButtonModel.Name = sName
oButtonModel.Label = sLabel
oControlShape.setControl(oButtonModel)
oDrawPage.add(oControlShape)
AddNewButton = oButtonModel
End Function
Function GetIndex(oControl As Object, oForm As Object) As Integer
Dim nIndex As Integer
nIndex = -1
For i = 0 To oForm.getCount() - 1 step 1
If EqualUnoObjects(oControl, oForm.getByIndex(i)) Then
nIndex = i
Exit For
End If
Next
GetIndex = nIndex
End Function
Sub ButtonPushEvent(ev as com.sun.star.awt.ActionEvent)
Print "HERE"
'msgbox ev.Source.Model.Name
End Sub
OpenOffice4 .0 su Windows 8
Re: [Risolto] Assegnare Macro con Macro
Ciao, grazie di aver condiviso con noi la soluzione.
charlie
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
macOS 14.4.1 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
Re: [Risolto] Assegnare Macro con Macro
Mi unisco a charlie nel ringraziarti.
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui