Pagina 1 di 1
[Risolto] Assegnare Macro con Macro
Inviato: venerdì 8 novembre 2013, 13:49
da fizapol
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 ...
Re: Assegnare Macro con Macro
Inviato: sabato 9 novembre 2013, 21:55
da unlucky83
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?
Re: Assegnare Macro con Macro
Inviato: sabato 9 novembre 2013, 23:23
da unlucky83
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:
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
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
Codice: Seleziona tutto
http://www.openoffice.org/api/docs/common/ref/com/sun/star/document/Events.html
Se qualcuno ha idee migliori o suggerimenti si faccia vivo
Re: Assegnare Macro con Macro
Inviato: domenica 10 novembre 2013, 1:33
da unlucky83
Ho trovato la soluzione al mio problema.La riporto e poi allego i collegamenti alle pagine web che mi hanno permesso di arrivarci:
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
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
Re: Assegnare Macro con Macro
Inviato: domenica 10 novembre 2013, 12:06
da fizapol
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!
Re: Assegnare Macro con Macro
Inviato: domenica 10 novembre 2013, 14:32
da unlucky83
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
Re: Assegnare Macro con Macro
Inviato: lunedì 11 novembre 2013, 1:48
da unlucky83
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:
Codice: Seleziona tutto
Sub CheckBoxListener_disposing( o as object )
end sub
Questo credo sia tutto sugli eventi dei checkbox delle finestre di dialogo
Re: Assegnare Macro con Macro
Inviato: lunedì 11 novembre 2013, 18:45
da fizapol
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
Re: [Risolto] Assegnare Macro con Macro
Inviato: giovedì 8 febbraio 2018, 16:56
da fizapol
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
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
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.
Re: [Risolto] Assegnare Macro con Macro
Inviato: giovedì 8 febbraio 2018, 17:38
da charlie
Ciao, grazie di aver condiviso con noi la soluzione.
Re: [Risolto] Assegnare Macro con Macro
Inviato: giovedì 8 febbraio 2018, 18:59
da unlucky83
Mi unisco a charlie nel ringraziarti.