Paolo Mantovani wrote:

Alle 11:42, venerdì 3 febbraio 2006, Michele Zarri ha scritto:
[....]
Ciao Bart,

Mi dispiace per la brutta giornata.
Mi piace il modo per estrarre la riga (io ho un debole per il codice
ultra complicato come avrai capito).
Purtroppo una delle funzionalita' richieste dalla macro e' di
selezionare la colonna B, ma questo si aggiusta in un secondo.

Quello che invece ancora non mi convince e' l'uso del metodo Select in
quanto il risultato e' diverso dalla chiamata fatta con il dispatcher.
Select seleziona tutta la cella (che non voglio) mentre il dispatcher
rende attiva la cella (bordo ingrossato).

Ieri era un po' tardi percio' provo a riformulare la domanda:
Esiste un equivalente in StarBasic di
uno:GoToCell
?

Scusate l'invasione ma proprio in questi giorni, io e Laurent Godard abbiamo sollevato questo stesso problema in lista [EMAIL PROTECTED]

Dunque in primo luogo l'API di Calc attualmente non copre il concetto di cella attiva, dove "attiva" <> da "selezionata", come hai ben sottolineato tu.
Il problema è comunque conosciuto e verrà sicuramente risolto in futuro.

Dal punto di vista pratico esiste ovviamente la strada del dispatcher, ma solo per quanto riguarda l'impostazione della cella attiva.

Esistono poi un paio di hack, per settare e ottenere la cella attiva senza fare uso del dispatcher:

Il primo è proprio di Laurent, non è mai stato pubblicato in quanto ne abbiamo discusso in solo privato.
In fondo al post ho riportato la mia implementazione in python  :

Per rendere attiva una cella senza selezionarla invece, esiste un piccolo trucco, che riporto in fondo al post. In pratica si tratta semplicemente di effettuare una selezione "nulla" dopo aver selezionato la cella desiderata.

Tengo a precisare che simili soluzioni, per quanto possano funzionare senza problemi non sono "garantite" in quanto non sono elencate nella documentazione ufficiale, perciè iun futuro potrebbe pure succedere che smettano di funzionare per via di qualche cambiamento interno ad openoffice.

Tornando alla macro che state elaborando (sempre nel caso che non lo abbiate già modificato) rimane un dettaglio che potrebbe causare errori.

La macro infatti assume che la selezione sia di una cella sola, e probabilmente questa è una cosa logica e giustificatissima nell'ambito dell'applicazione in questione, ma ahimè, (e qui mi metto la tuta da programmatore) come ben sappiamo l'utente non fa MAI quello che sarebbe logico e giusto aspettarsi che faccia, perciò, una controllatina alla selezione o meglio ancora una gestione degli errori sarebbe (secondo me) opportuna.


saluti
Paolo

----------------------------------------

REM  *****  BASIC  *****

sub Test

        setActiveCell(ThisComponent, "B4")

end sub

Function SetActiveCell(oDocModel As Object, sCellName As String ) As Object
Dim oDocView As Object
Dim oActiveSheet As Object

        oDocView = oDocModel.CurrentController
        oActiveSheet = oDocView.ActiveSheet
        
        oCellRange = oActiveSheet.getCellRangeByName(sCellName)
        oDocView.select(oCellRange)
        oDocView.select(Nothing)
        
        SetActiveCell = oCellRange
        
End Function
-----------------------------------------------

-----------------------------------------------
def get_active_cell_address(doc_model):

# get the active cell address in a Calc document.
# since there is no API's for that, this function uses a great
# hack suggested from Laurent Godard <[EMAIL PROTECTED]>

        doc_controller = doc_model.CurrentController
        viewdata = doc_controller.ViewData
        # unpack the viewdata
        viewdata = viewdata.split(';')
        
        # after the third element there are information about sheets
        viewdata = viewdata[3:]
        
        # find the index of the active sheet
        sh_name = doc_controller.ActiveSheet.Name
        sheetnames = list(doc_model.Sheets.ElementNames)
        sh_index = sheetnames.index(sh_name)
        
        # get the viewdata for the active sheet
        sh_data = viewdata[sh_index]
        
        # data are in delimited strings (delimiter = /)
sh_data.replace('+', '/') # ...but sometime the + is used as separator, instead of the /
        sh_data = sh_data.split('/')
        
        # first 2 elements are the row/col position of the active cell
        cell_row = sh_data[0]
        cell_col = sh_data[1]
        
        # get the actual cell
active_cell = doc_controller.ActiveSheet.getCellRangeByPosition(cell_row,cell_col, cell_row,cell_col)
                
        return active_cell.RangeAddress

----------------------------------------




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




Ciao Paolo,

Effettivamente, per quanto non sia un programmatore, la prima versione della macro faceva un po' ribrezzo anche a me in quanto venivano date per scontate parecchie cose (utente sul primo foglio, singola cella selezionata, colonna minore di 27 etc...) D'altra parte ha prevalso il pragmatismo: il "cliente" su [email protected] voleva solo andare sulla colonna B e sulla riga sotto a quella sulla quale immetteva i dati. Se proprio mi trovo con un po' di tempo libero generalizzero' la macro (forse un tasto per "andare a capo" e' dopo tutto utile), ma non credo...

Riguardo la problematica che ci hai presentato mi sento di trarre un sospiro di sollievo. Ho passato non poco tempo sul forum e sugli archivi di users a cercare se esistesse un equivalente del viewcursor in writer e finalmente posso mettermi il cuore in pace :)

Ciao,

Michele

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Rispondere a