It is currently 29 May 2023, 20:54 Advanced search

Utilizzo di componenti

Questo forum è nato con lo scopo di raccogliere le proposte di modifica di Instant Developer e discuterne insieme.

Utilizzo di componenti

Postby mtozzi » 8 November 2010, 8:42

L'obiettivo principale dal mio punto di vista dell'utilizzo di componenti è la possibilità di utilizzare all'interno di un progetto videate di altri progetti senza doverle in qualche modo incorporare nel progetto stesso, mantenedo quindi l'indipendenza della compilazione delle diverse parti. Quando dico utilizzare una videata intendo sia la possibilità di mostrare dati che di interagire con essi dall'applicazione "che la ospita" (d'ora in avanti la chiamerò applicazione ospite). Un esempio classico è quello di mostrare all'utente una videata di lookup per selezionare un valore, ma questa videata non fa parte del progetto ospite bensì è utilizzata trasversalmente da N progetti/applicazioni. Il vantaggio è appunto quello di non replicarne la struttura in tutti i progetti in modo più o meno automatico ma avere anche a runtime un'unica entità utilizzata da tutte le applicazioni.

Dalla versione 9.5 di inde è possibile caricare componenti da codice tramite la funzione createFormFromLibrary, in particolare è possibile settare l'oggetto sub-form di una videata del progetto ospite. Questo significa che nel progetto che vuole utilizzare la componente (dove quindi non sono presenti gli oggetti della componente) è necessario definire una sub-form in una videata in modo da poterla "riempire" da codice. L'unico modo che ho trovato per creare una sub-form è quello di tirare una videata del progetto all'interno di un'altra dello stesso progetto. Sarebbe molto più sensato secondo me avere la possibilità di aggiungere ad una videata una subform senza utilizzare questo meccanismo proprio per il fatto che la subform verrà riempita da codice quindi a design time non ha senso usarne un'altra dummy.
Inoltre sarebbe interessante avere un meccanismo semplice di comunicazione bidirezionale tra applicazione ospite e videata della componente, l'evento onSendMessage è molto utile per la comunicazione applicazione ospite -> componente, nel senso inverso sono riuscito (nel caso sopra citato della lookup) a recuperare il valore selezionato giocando con gli oggetti però forse si potrebbe semplificare in qualche modo.
mtozzi
 
Posts: 411
Joined: 2 November 2010, 9:33

Re: Utilizzo di componenti

Postby sfirpo » 8 November 2010, 10:14

La possibilità di poter mostrare una videata all'interno di un'altra istanziando la prima da codice senza l'inclusione di componenti esterne nel progetto è sicuramente una novità che apre nuovi scenari e numerose possibilità.

Sarebbe ancora più bello se, una volta istanziata la videata con il metodo CreateFormFromLibrary si potesse aprire direttamente la form creata anzichè mostrarla come sottovideata all'interno di un'altra videata.
In questo modo si elimerebbe anche la videata "dummy" che contiene la videata caricata da codice.
User avatar
sfirpo
 
Posts: 101
Joined: 26 October 2010, 12:50
Location: Genova

Re: Utilizzo di componenti

Postby lucabaldini » 2 December 2010, 10:15

La tua analisi è davvero completa :-)

Comunque ho fatto qualche prova ed ho pensato che si possono presentare i seguenti 4 casi:

1) FormCategoria f = new()
f.Show()
Questo crea un'istanza di una form (multipla) e la mostra. Questo caso funziona già correttamente dato che l'operatore NEW prepara la form per essere aperta come multipla (notificando, per esempio, l'evento Load della form stessa).

2) FormCategoria f = createFormFromLibrary(LIBNAME, FORMNAME)
f.Show()
Questo crea un'istanza di una form da libreria (componente) e la apre come multipla.
Ad oggi questa combinazione non funziona poiché il metodo Show si aspetta che la form sia già stata preparata come form multipla (ed abbia, per esempio, già notificato l'evento Load).

3) FormCategoria f = new()
SubForm.setSubForm(f)
Questo crea un'istanza di una form (multipla) e la inserisce come sub-form all'interno di un oggetto SubForm già esistente (sostituendo quindi il contenuto della sub-form).
Anche questo caso, ad oggi, non funziona poiché, come ti ho scritto sopra, l'operatore NEW prepara anche la form per essere aperta come mutipla e quando viene eseguito il metodo setSubForm il sistema trova la form già "preparata" ma per lo scopo sbagliato.

4) FormCategoria f = createFormFromLibrary(LIBNAME, FORMNAME)
SubForm.setSubForm(f)
Questo crea un'istanza di una form da libreria (componente) e la inserisce come sub-form all'interno di un oggetto SubForm già esistente.
Questo caso funziona già dato che la createFormFromLibrary non fa nulla se non creare l'istanza ed è compito della setSubForm completare l'inizializzazione.

Tu mi stai chiedendo di gestire il caso 2 che, ad oggi, non funziona correttamente e la tua richiesta mi sembra ragionevole. Probabilmente il sistema quando viene chiamato il metodo Show potrebbe controllare se la form è stata già preparata per essere aperta come multipla (vedi caso 1) e se non lo è potrebbe prepararla adeguatamente prima di aprirla.
Il caso 3 potrebbe anch'esso essere gestito meglio anche se già oggi può essere gestito scrivendo così il codice:
FormCategoria f = createFormFromLibrary("", FormCategoria.className())
SubForm.setSubForm(f)
però mi riservo di dargli un'occhiata e vedere se con qualche riga di codice riesco a de-inizializzare la videata multipla per prepararla ad un inserimento come sub-form.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4959
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Utilizzo di componenti

Postby m.sirri » 2 December 2010, 12:40

Per quanto riguarda il caso 3 si può usare la funzione newSubForm al posto dell'operatore NEW.
User avatar
m.sirri
Pro Gamma
Pro Gamma
 
Posts: 8562
Joined: 30 September 2010, 17:01
Location: Ozzano dell'Emilia (BO)

Re: Utilizzo di componenti

Postby lucabaldini » 2 December 2010, 21:24

Bravo Matteo... mi ero dimenticato della funzione newSubForm!
Il caso 3 diventerebbe qiundi:

3) FormCategoria f = FormCategoria.newSubForm()
SubForm.setSubForm(f)

giusto?

Quindi rimarrebbe solo il caso 2:
2) FormCategoria f = createFormFromLibrary(LIBNAME, FORMNAME)
f.Show()

che, ad oggi, non funziona. Quello credo si possa implementare con facilità... se la form non è stata inizializzata adeguatamente il sistema la inizializza come già fa nel caso dell'operatore NEW().
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4959
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Utilizzo di componenti

Postby mtozzi » 10 December 2010, 8:03

molto bene! nel caso la videata fosse una lookup modale sarebbe possibile gestire in qualche modo il valore selezionato dall'utente?
mtozzi
 
Posts: 411
Joined: 2 November 2010, 9:33

Re: Utilizzo di componenti

Postby g.lanzi » 15 December 2010, 11:40

È possibile fare così:
1) la videata multipla popup informa l'applicazione del fatto ce si sta chiudendo, valorizzando a this una variabile globale
2) nell'endmodal si verifica se la variabile globale è valorizzare e frmIdx è quello passato dall'end modal, in quel caso si casta l'istanza e si usa un metodo per avere il valore che interessa.
Giuseppe Lanzi
Director of Support services
Pro Gamma S.p.A.
User avatar
g.lanzi
Pro Gamma
Pro Gamma
 
Posts: 3493
Joined: 29 September 2010, 10:24
Location: Bologna

Re: Utilizzo di componenti

Postby lucabaldini » 23 March 2011, 9:41

Implementato in versione 10.0.
Trovate le info qui http://doc.progamma.com/?ARTID=04D8CAD5-F317-4F17-9E1A-8222960C2953

@mtozzi Le lookup modali anche se contenute in un componente si comportano come quelle normali. Nel senso che puoi tirarle sui campi di pannello per collegarle. In.de porterà giù il valore automaticamente. Se non lo facesse (ci sono casi molto particolari in cui l'automatismo potrebbe non funzionare) puoi implementare l'evento EndModal e portalo giù tu manualmente.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4959
Joined: 1 October 2010, 17:03
Location: Bologna


Return to Proposte di modifica

Who is online

Users browsing this forum: No registered users and 5 guests