It is currently 8 June 2025, 19:33 Advanced search

Argomenti di tipi Object specifici

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

Argomenti di tipi Object specifici

Postby C.Zecca » 30 August 2011, 15:47

Argomento di tipo specifico Object per funzioni o procedure: come fare?
Ho una mezza dozzina di procedure identiche che variano solo per il fatto che
la prima lavora sul CommandSet Dizionari
la seconda lavora sul CommandSet StrutturaLogica
...
Semplice: uso un argomento CommandSet, no!?
La guida all'uso suggerisce argomenti di tipo Object. Ma in Libreria non c'è CommandSet; i tipi correlati
ID Command - non è un contenitore
Collection - è un contenitore ma, intuisco, polimorfico (intuisco si debba poi utilizzare cast o via handle o loro combinazioni)

Come passare un argomento per cui esso possa essere utilizzato specificatamente come e.g. CommandSet (piuttosto che Panel, piuttosto che...)
Un esempio di procedura alla quale far passare ad esempio un CommanSet potrebbe aiutare molto la comprensione.

Grazie in anticipo

P.S.
Scritto qualcosa di più articolato ma è andato perso in time-out proprio durante l'anteprima.
C.Zecca
 
Posts: 347
Joined: 19 May 2011, 12:29

Re: Argomenti di tipi Object specifici

Postby a.maioli » 31 August 2011, 7:06

Per lavorare in modo generico sui command set è disponibile la classe IDCommand. Prova a cercare nella documentazione IDCommand e vedrai tutte le funzioni che ti permettono di recuperare l'elenco dei comandi e dei command set dell'applicazione o di una parte di essa e poi la descrizione della classe stessa.
User avatar
a.maioli
Pro Gamma
Pro Gamma
 
Posts: 1090
Joined: 29 September 2010, 12:47

Re: Argomenti di tipi Object specifici

Postby C.Zecca » 31 August 2011, 12:03

Grazie. In effeti la documentazione di ID Command dice che esso "rappresenta un comando generico di menu o un command set ". Chiedo scusa, mi ero fatto traviare dal nome, pensavo che rappresentasse solo un comando generico di menu (l'i-esimo elemento di un CommandSet e non anche un contenitore di comandi generici di menu).

Riporto a beneficio generale le differenze (ho tolto dettagli e istruzioni non rilevanti per questa discussione)

Code: Select all
// Ecco la versione che utilizzava direttamente il CommandSet Dizionari dell'applicazione
public void Si4so.CaricaDizionari()
{
    int lNumeroVoci = Dizionari.getCommandsCount()

    for ( int i = 0; i < lNumeroVoci; i = i + 1 )
    {
        string lCommandCode = Dizionari.getCommandCode(i)

        ...

        Dizionari.setCommandVisible(i, true)
        Dizionari.setCommandCaption(i, lCaption )
    }

// Ecco la versione parametrizzata che riceve un IDCommand come argomento formale per argomenti attuali CommandSet
public void Si4so.CaricaUnMenu(
    IDCommand pIdCommandSet
)
{
    int lNumeroVoci = pIdCommandSet.commandsCount()

    for ( int i = 0; i < lNumeroVoci; i = i + 1 )
    {
        IDCommand lIdCommand = pIdCommandset.getCommand(i)
        string lCommandCode  = lIdCommand.code()

        ...

        lIdCommand.visible = true
        lIdCommand.caption = lCaption
    }
}

A questo punto ho provato a utilizzare CaricaUnMenu() (compila correttamente) volendole passare, ad esempio, come argomento attuale proprio Dizionari:

Code: Select all
    ...
    Si4so.CaricaUnMenu(Dizionari)
    ...


Visual Code non mi permette di specificare Dizionari come argomento attuale. Viene aggiunto il punto per l'accesso ad un attributo/metodo; tra le caratteristiche proposte non c'è alcun metodo che restituisca l'IDCommand di Dizionari o qualcosa ad esso attinente (in realtà pensavo che CommandSet implementasse IDCommand e non fosse necessario alcun codice).

Come fare a passare Dizionari (o altri CommandSet) ad un metodo (procedura o funzione) che ha un ID Command come argomento formale?
In qualche modo ero riuscito a forzare Dizionari come argomento per avere qualche dritta dalla diagnostica del compilatore ma ora non ci riesco più.
C.Zecca
 
Posts: 347
Joined: 19 May 2011, 12:29

Re: Argomenti di tipi Object specifici

Postby d.pierangeli » 31 August 2011, 12:19

Puoi usare la funzione GetCommandByDBCode per ottenere l'oggetto IDCommand con un determinato codice (il codice da usare lo trovi tra le proprietà del CommandSet); altrimenti potresti usare la funzione GetCommandSets per ottenere un IDArray contente tutti i command set globali dell'applicazione.
User avatar
d.pierangeli
Pro Gamma
Pro Gamma
 
Posts: 8129
Joined: 30 September 2010, 15:35

Re: Argomenti di tipi Object specifici

Postby C.Zecca » 31 August 2011, 15:38

> Puoi usare la funzione GetCommandByDBCode ...
> il codice da usare lo trovi tra le proprietà del CommandSet

gli attributi che vengono visualizzati da IntelliSense per Dizionari (istanza di CommandSet) sono (in ordine)

getCommandCaption()
getCommandCode()
getCommandEnabled()
getCommandIcon()
getCommandTooltip()
getCommandVisible()
caption
enabled
expandEventType
visible
expanded

Ho consultato la guida in linea di Get Command Code()
Ma, se ho capito bene,
Code: Select all
lMioCommandSet.getCommandCode()
restituisce il Codice Comando, riportato anche in guida come "codice azione"
La guida di GetCommandByDBCode() spiega che code è il codice del comando da cercare; le note specificano che "La stringa Code viene confrontata con la proprietà Code dei comandi" (perché Intellisense non la produce?)
La proprietà code viene documentata con "restituisce il codice del Comando o del CommandSet; il codice è un identificatore univoco calcolato in automatico oppure deciso dall'utente"

Riepilogando
lMioCommandSet.getCommandCode() restituisce il codice comando
lMioCommandSet.code NON viene accettato da Intellisense (Non ci sono altri metodi inrenti un qualche codice su un CommandSet))
)

Per passare a CaricaUnMenu l'IDCommand corrispondente, dovrei recuperare il code dell'oggetto, in questo caso dell'istanza di CommandSet
Qualcosa tipo

Code: Select all
    Si4so.CaricaUnMenu( GetCommandByDBCode( Dizionari.code() ) )   // oppure
    Si4so.CaricaUnMenu( GetCommandByDBCode( Dizionari.code ) )

che non è possibile.

Come faccio ad estrarre il code da un CommandSet per passarlo come argomento di GetCommandByDBCode()?

P.S.
In CaricaUnMenu( ) le istruzioni

Code: Select all
    string lCommandCode = Dizionari.getCommandCode(i)

e
Code: Select all
    string lCommandCode  = lIdCommand.code()

se ho capito bene, NON sono equivalenti.
La seconda è "bacata" (ottiene il code e non il command code). Giusto?
C.Zecca
 
Posts: 347
Joined: 19 May 2011, 12:29

Re: Argomenti di tipi Object specifici

Postby C.Zecca » 1 September 2011, 16:13

Poiché non sono riuscito ad estrarre il code da un CommandSet (v. sopra suggerimento basato su GetCommandByDBCode()) ho utilizzato una via basata su GetCommandSets().
Per arrivare a trattare effettivamente i menù che desidero trattare, per discriminarli nel ciclo di scansione dell'IDArray ho confrontato tra loro le uniche proprietà comuni ad IDCommand e CommandSet che ho trovato ovvero la caption.

La mia parziale conclusione è che IDCommand e CommandSet sono diversi in quanto offrono caratteristiche (attributi e metodi) diversi.
Ad esempio abbiamo a disposizione IDCommand.code() ma NON IDCommand.getCommandCode() e, viceversa,
abbiamo a disposizione CommandSet.getCommandCode() ma NON CommandSet.code().

Nelle procedure originarie in cui si usano i CommandSet direttamente, si usa il loro command code
Questo attributo NON è accessibile tramite l'argomento attuale passato come IDCommand.

Intuisco che IDCommand sia una interfaccia per la classe C++ che implementa CommandSet indipendente da quest'ultima.
IntelliSense NON mi fa istanziare una variabile CommandSet, suppongo che ci sia qualche limite con essa.
Date le info a mia disposizione la mia conclusione è che se ho necessità di lavorare effettivamente su un CommandSet NON sia possibile parametrizzarlo e passarlo come IDCommand in quanto alcune caratteristiche di CommandSet non sono presenti in IDCommand.
In CaricaUnMenu() l'istruzione critica per la quale non ho al momento soluzione è

string lCommandCode =?? lIdCommand.code()

Non riesco ad ottenere un codice comando da un IDCommand.
Ho trovato una discussione sui cast in In.De (Cast oggetti di libreria, http://forum.progamma.com/viewtopic.php?f=5&t=491&p=2125&hilit=cast#p2125) ma prima sarebbe interessante sapere
1 - perché non è possibile istanziare una variabile CommandSet (forse il tipo NON è un'interfaccia? non è pubblica?)
Avrei voluto verificare se fosse possibile scrivere
CommandSet cs = CommandSet.cast(lIDCommand);
2 - che relazioni ci sarebbero tra IDCommand e CommandSet (ovvero se ha senso pensare ad un cast).
C.Zecca
 
Posts: 347
Joined: 19 May 2011, 12:29

Re: Argomenti di tipi Object specifici

Postby d.pierangeli » 2 September 2011, 10:35

Puoi usare la funzione GetCommandByDBCode ...
il codice da usare lo trovi tra le proprietà del CommandSet


La classe IDCommand rappresenta sia un CommandSet che un Comando.

Il CommandCode è definito solo per i comandi (nel senso che solo nella videata delle proprietà dei comandi lo puoi definire, per i commandset è sempre nullo..) mentre il code (o DBCode) è definito per entrambi.

Dall'oggetto CommandSet (il tuo Dizionari) non hai modo però di ottenere il Code; semplicemente non c'è la proprietà: puoi sempre utilizzarla in maniera statica (è una stringa: puoi trovare il suo valore facendo doppio click sul command set e poi scrivendola nella funzione).

Ti allego anche un progetto in cui ho mappato al commandSet la funzione GetCommandSetCode(), che restituisce il code di un CommandSet (NOTA: solo di commandset globali e di primo livello!) che ti permette di usare l'intellisense per ottenere il codice del commandSet dizionari.
Attachments
Progetto CommandSet.rar
(229.31 KiB) Downloaded 440 times
User avatar
d.pierangeli
Pro Gamma
Pro Gamma
 
Posts: 8129
Joined: 30 September 2010, 15:35

Re: Argomenti di tipi Object specifici

Postby C.Zecca » 5 September 2011, 16:16

Chiedo scusa, non ho avuto ancora il tempo di testarla sul campo, ho aperto solo "Progetto CommandSet" e l'ho studiato al volo.
Mh, ... per GetCommandSetCode() c'è la programmazione in "linguaggio nativo". Interessante!

Dunque questo risolve il problema di ottenere da un CommandSet il code (o DBCode) per poterne ottenere l'IDCommand corrispondente. Ad esempio (ho appena usato la dritta sul come ottenere il testo dei sorgenti... http://forum.progamma.com/viewtopic.php?f=5&t=614 :)

Code: Select all
  IDCommand IdCommandDizionari = NuovaApplicazioneWeb.getCommandByDBCode(Dizionari.getCommandSetCode())
  Si4so.CaricaUnMenu( IdCommandDizionari )


Un IDCommand può rappresentare sia un Command che un CommandSet: se lo si riceve come CommandSet è necessario usarlo a mo' di contenitore, ciclare sugli elementi contenuti: l'i-esimo IDCommand rappresenterà in effetti l'i-esimo Command.
A questo punto si pone il problema simmetrico: come ottengo il codice comando dall'i-esimo IDCommand?
Code: Select all
// Ecco la versione parametrizzata che riceve un IDCommand come argomento formale per argomenti attuali CommandSet
public void Si4so.CaricaUnMenu(
    IDCommand pIdCommandSet
)
{
    int lNumeroVoci = pIdCommandSet.commandsCount()

    for ( int i = 0; i < lNumeroVoci; i = i + 1 )
    {
        IDCommand lIdCommand = pIdCommandSet.getCommand(i)
        string lCommandCode  =?? lIdCommand.commandCode()   <== come facciamo qui? commandCode() non c'è su IDCommand

        ...
    }
}



d.pierangeli wrote:
... ho mappato al commandSet la funzione GetCommandSetCode(), che restituisce il code di un CommandSet (NOTA: solo di commandset globali e di primo livello!) che ti permette di usare l'intellisense per ottenere il codice del commandSet dizionari.


La soluzione è di mappare (estendere) IDCommand similmente a quanto fatto per CommandSet in modo che quando IDCommand rappresenta un Command sia possibile usare IntelliSense per estarne il command code?
Intuisco bene?
Fatto un po' di corse, spero di non aver scritto delle castronerie da principiante.
C.Zecca
 
Posts: 347
Joined: 19 May 2011, 12:29

Re: Argomenti di tipi Object specifici

Postby C.Zecca » 4 April 2012, 15:17

C.Zecca wrote:La soluzione è di mappare (estendere) IDCommand similmente a quanto fatto per CommandSet in modo che per le IDCommand di un Command sia possibile usare IntelliSense per estrarne il command code?
Intuisco bene?



Un collega è riuscito a mappare una GetCommandCode sull'interfaccia IDCommand.

Image
C.Zecca
 
Posts: 347
Joined: 19 May 2011, 12:29


Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: No registered users and 77 guests

cron