It is currently 17 May 2022, 8:47 Advanced search

Utilizzo funzioni statiche di una classe

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

Utilizzo funzioni statiche di una classe

Postby alessio.milani » 24 February 2014, 12:54

Salve, chiedo un suggerimento riguardo a questa situazione: avevo realizzato una serie di procedure globali utilizzate da una serie di form con alcuni comportamenti simili; per organizzare i sorgenti in modo più pulito ho pensato di mettere tutte le procedure dentro una classe e dichiararle stariche in modo da poterle richiamare direttamente (nell'esempio allegato: FunzFormMUD.ShowTuttiElementiMUD(...)). Riesco a salvare ma quando effettuo la commpilazione ricevo i seguenti errori:
[javac] c:\sviluppo\inde\ecos cloud ufficiale\servlet\src\FunzFormMUD.java:87: error: non-static variable this cannot be referenced from a static context
[javac] MainFrm.ShowMultipleForm(v_IDF, (new IDVariant(0)).intValue(),this);
[javac]
[javac] c:\sviluppo\inde\ecos cloud ufficiale\servlet\src\FunzFormMUD.java:92: error: non-static variable this cannot be referenced from a static context
[javac] v_IDF.SendMessage((new IDVariant("SetPadre")), this, null, (new IDVariant("*")));
[javac]
Cioè sembra che l'esecuzione dei metodi show e sendMessage dia fastidio dentro una funzione statica.
Ho scordato qualcosa o è proprio un modo scorretto di procedere? Cosa mi consigliereste per raggruppare un po' di procedure correlate? Rendere dinamiche le procedure della classe e dichiare una varibile globale con l'istanza della classe in modo da richiamare direttamente le procedure sulla variabile?
Grazie, saluti
Attachments
Funz Form MUD.jpg
Funz Form MUD.jpg (94.02 KiB) Viewed 1656 times
alessio.milani
 
Posts: 105
Joined: 24 July 2013, 13:10

Re: Utilizzo funzioni statiche di una classe

Postby lucabaldini » 25 February 2014, 8:02

Il problema è dovuto ad un piccolo bug nella definizione delle funzioni SHOW e SENDMESSAGE della libreria IDForm.

Se vai alla funzione di libreria e fai doppio click dovresti vedere, in basso, l'espressione C#/Java delle funzioni. Ora, nella funzione show e nella funzione sendMessage puoi vedere che c'è un "this" tra i parametri. Tale "this" serve per dire al framework chi sarà l'owner della videata che viene aperta. Ovviamente quello "this" non può funzionare in un contesto statico come il tuo.

Se tu avessi usato la SHOW di una videata (lo trovi tra le funzioni della LibreriaForm) non avresti avuto problema. In altre parole se tu avessi scritto:

Code: Select all
Videata.show()


Avrebbe funzionato. Il motivo è che, se controlli l'espressione C#/Java della funzione SHOW della libreria Form puoi vedere che lì non c'è un "this" ma un token speciale "$THIS". Tale token speciale viene trattato da In.de a compile time: se il contesto non è statico viene sostituito con "this" altrimenti con "null".

Quindi la soluzione è la seguente:
- apri la videata delle proprietà delle funzioni show e sendMessage della libreria IDForm
- cambia this con $THIS
- compila

Così dovrebbe funzionare correttamente.

Ho creato l'attività NPQ01523 per tenere conto di questa conversazione. Sarà implementata in versione 13.0 che sarà rilasciata in versione BETA1 lunedì prossimo.

Grazie della segnalazione!
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4841
Joined: 1 October 2010, 17:03
Location: Bologna


Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: No registered users and 24 guests