Italian Incorporare file nelle librerie

LucaMs

Expert
Licensed User
Longtime User
Tutorial di Erel, mooolto liberamente tradotto da me :)


È possibile incorporare file direttamente nelle librerie seguendo questi passaggi:

1. Aggiungere al progetto il modulo di classe qui allegato, JarFileLoader;
2. JarFileLoader è in grado di caricare file sia dalla cartella File (File.DirAssets) che dal file jar ottenuto dalla compilazione.

Durante lo sviluppo della libreria, si deve inizializzare un oggetto di tipo JarFileLoader e ed impostarlo per caricare i file dalla cartella asset (sempre File.DirAssets):
B4X:
Sub Process_Globals
   Private jfl As JarFileLoader
End Sub

Sub Globals

End Sub

Sub Activity_Create(FirstTime As Boolean)
   If FirstTime Then
     ' Se si imposta a True i file verranno prelevati dalla cartella Assets; una volta compilata la libreria
     ' ad essa si aggiungeranno i file manualmente e quindi si imposterà il valore a False.
     jfl.Initialize(True) '<--- True = from assets folder, False = from jar file
   End If
   Activity.SetBackgroundImage(jfl.LoadBitmapFromJar("smiley.gif"))
End Sub

3. Prima di compilare la libreria, è necessario assicurarsi di cambiare jfl.Initialize(True) in jfl.Initialize (False);

4. I file dalla cartella File non verranno inclusi automaticamente nel file jar. È necessario compilare la libreria e quindi aprire il file jar con un programma come 7zip e copiare manualmente i file nel file jar.

SS-2014-02-11_09.48.36.png


La distinzione tra maiuscole e minuscole nei nomi dei file è significativa. Si consiglia di usare lettere minuscole, dato che l'IDE modificherà in minuscolo i nomi dei file che inserite nel Tab Files.
 

Attachments

  • JarFileLoader.bas
    837 bytes · Views: 272

LucaMs

Expert
Licensed User
Longtime User
Spiegazione maccheronica?

Mettiamo che tu voglia creare una classe e poi ottenerne una libreria (di nome MiaLib, ad esempio):

Chiaramente dovrai testare la classe, prima di compilarla come libreria.

Mettiamo che la classe contenga solamente un metodo GetBitmap e che questo debba fornire una bitmap che sia inclusa nella libreria stessa, come risorsa.

Nel progetto, nella Main, dichiarerai una variabile MiaLib, la inizializzerai e poi ne preleverai la bitmap da assegnare ad una ImageView, con un'istruzione tipo:

ImageView1.Bitmap = MiaLib1.GetBitmap

Nella classe, nella Process_Globals, dichiarerai una variabile privata jfl di tipo JarFileLoader (classe che avrai importato nel progetto e che è allegata al post precedente).

Nella routine Initialize della classe, PER TESTARE IL PROGETTO, inizializzerai jfl con True, il che significa che la classe preleverà il file immagine dalla Assets.

Quanto sarai sicuro che la classe funzioni bene e quindi sarai pronto a compilarla come libreria (ALT+5), cambierai l'inizializzatione di jfl con il valore False; questo significa che la libreria, quando la utilizzerai in un nuovo progetto, cercherà il file al proprio interno, non nella Assets. Però, una volta compilata, la libreria non conterrà davvero il file immagine, dovrai aggiungerlo a mano, ovvero userai un tool come ad esempio 7zip, apri e trascini il file immagine.



Allego due progetti d'esempio.

Il primo, MyLibProj, è il progetto che servirà per poi creare la libreria.
Nella classe SomeResources l'oggetto jfl è MOMENTANEAMENTE inizializzato con True; questo significa se avvii il progetto il file immagine verrà cercato e caricato dalla cartella Assets.

Dato che il progetto (e quindi anche la classe) funziona, a questo punto compili la libreria (ALT+5 nota che il nome per la libreria è impostato nella Main, direttiva #LibraryName).
La libreria viene usata dal secondo progetto, MyLib test ma se tu lanciassi questo progetto otterresti un errore, perché la libreria compilata ancora non contiene realmente il file immagine. Quindi devi prima aggiungere il file immagine al file SomeResources.jar (la libreria) usando un tool per Windows, come ad esempio 7Zip. Fatto questo, avvia il progetto MyLib test e vedrai che la cosa funziona.
 

Attachments

  • MyLib proj.zip
    35.5 KB · Views: 241
  • MyLib test.zip
    7.5 KB · Views: 243
Last edited:

Star-Dust

Expert
Licensed User
Spiegazione maccheronica?

Mettiamo che tu voglia creare una classe e poi ottenerne una libreria (di nome MiaLib, ad esempio):

Chiaramente dovrai testare la classe, prima di compilarla come libreria.

Mettiamo che la classe contenga solamente un metodo GetBitmap e che questo debba fornire una bitmap che sia inclusa nella libreria stessa, come risorsa.

Nel progetto, nella Main, dichiarerai una variabile MiaLib, la inizializzerai e poi ne preleverai la bitmap da assegnare ad una ImageView, con un'istruzione tipo:

ImageView1.Bitmap = MiaLib1.GetBitmap

Nella classe, nella Process_Globals, dichiarerai una variabile privata jfl di tipo JarFileLoader (classe che avrai importato nel progetto e che è allegata al post precedente).

Nella routine Initialize della classe, PER TESTARE IL PROGETTO, inizializzerai jfl con True, il che significa che la classe preleverà il file immagine dalla Assets.

Quanto sarai sicuro che la classe funzioni bene e quindi sarai pronto a compilarla come libreria (ALT+5), cambierai l'inizializzatione di jfl con il valore False; questo significa che la libreria, quando la utilizzerai in un nuovo progetto, cercherà il file al proprio interno, non nella Assets. Però, una volta compilata, la libreria non conterrà davvero il file immagine, dovrai aggiungerlo a mano, ovvero userai un tool come ad esempio 7zip, apri e trascini il file immagine.



Allego due progetti d'esempio.

Il primo, MyLibProj, è il progetto che servirà per poi creare la libreria.
Nella classe SomeResources l'oggetto jfl è MOMENTANEAMENTE inizializzato con True; questo significa se avvii il progetto il file immagine verrà cercato e caricato dalla cartella Assets.

Dato che il progetto (e quindi anche la classe) funziona, a questo punto compili la libreria (ALT+5 nota che il nome per la libreria è impostato nella Main, direttiva #LibraryName).
La libreria viene usata dal secondo progetto, MyLib test ma se tu lanciassi questo progetto otterresti un errore, perché la libreria compilata ancora non contiene realmente il file immagine. Quindi devi prima aggiungere il file immagine al file SomeResources.jar (la libreria) usando un tool per Windows, come ad esempio 7Zip. Fatto questo, avvia il progetto MyLib test e vedrai che la cosa funziona.
Si ma così mi apparirà questo modulo nella Libreria. Sarà visibile anche agli utenti che useranno la mia libreria...
 

LucaMs

Expert
Licensed User
Longtime User
Si ma così mi apparirà questo modulo nella Libreria. Sarà visibile anche agli utenti che useranno la mia libreria
A parte che normalmente una classe della tua libreria vorrai che sia visibile, per "nasconderla" devi eliminare la riga relativa nel file xml generato insieme alla libreria.
 

LucaMs

Expert
Licensed User
Longtime User
A parte che normalmente una classe della tua libreria vorrai che sia visibile, per "nasconderla" devi eliminare la riga relativa nel file xml generato insieme alla libreria.
Cmq questo è che vede l'utente-programmatore dell'esempio:
upload_2017-6-6_11-50-30.png
 

LucaMs

Expert
Licensed User
Longtime User
Ah, ovviamente il mio era un esempio, non è che la classe debba essere come quella, che dal nome sembra un "ripostiglio" per file di risorse; può e normalente è una classe che serva ai tuoi scopi e che possa utilizzare file di risorse incorporati.
 

Star-Dust

Expert
Licensed User
Mi pare troppo complessa. Ho trovato un altra soluzione
 

LucaMs

Expert
Licensed User
Longtime User
Si ma così mi apparirà questo modulo nella Libreria. Sarà visibile anche agli utenti che useranno la mia libreria...
https://www.b4x.com/android/forum/t...project-to-a-library.24750/page-3#post-241974

Mi pare troppo complessa. Ho trovato un altra soluzione
Soluzione per incorporare file o per il tuo caso specifico (nel senso che crei il color picker a runtime)?

Non è complessa, probabilmente sia io che Erel non l'abbiamo spiegata bene.

La classe che tu vorrai faccia parte della libreria, se deve CONTENTERE qualche che file esterno, questo lo carichi usando quella classe di supporto, JarFileLoader.
Per testare il progetto e quindi la classe, l'oggetto di tipo JarFileLoader lo inizializzi con True, invece quando compilerai la libreria, sostituirai questo con False.
Alla fine, a libreria compilata, devi aggiungere ad essa il file che la classe utilizza. Tutto qua.
 
Last edited:

Star-Dust

Expert
Licensed User
https://www.b4x.com/android/forum/t...project-to-a-library.24750/page-3#post-241974


Soluzione per incorporare file o per il tuo caso specifico (nel senso che crei il color picker a runtime)?

Non è complessa, probabilmente sia io che Erel non l'abbiamo spiegata bene.

La classe che tu vorrai faccia parte della libreria, se deve CONTENTERE qualche che file esterno, questo lo carichi usando quella classe di supporto, JarFileLoader.
Per testare il progetto e quindi la classe, l'oggetto di tipo JarFileLoader lo inizializzi con True, invece quando compilerai la libreria, sostituirai questo con False.
Alla fine, a libreria compilata, devi aggiungere ad essa il file che la classe utilizza. Tutto qua.
L'ho creata da runtime vedi questo video dal 17° secondo

 

LucaMs

Expert
Licensed User
Longtime User
Si, l'ho visto nel thread dedicato alla libreria (che devo capire meglio, perché non capisco se hai evitato di usare i DoEvents o eviti gli Sleep e Wait For o se usi entrambi, cosa che non vedo come possa consentire di usarla sia a chi abbia la versione 7 di b4a sia a chi abbia le versioni precedenti).

Cmq, il discorso era su come inserire in una libreria dei file e a questo serviva la mia LUUUUNGA spiegazione :).

[Ho visto anche il codice parziale e temporaneo che hai usato per creare il "disco"; puoi velocizzarlo perché, se ci fai caso, esegui molte volte una moltiplicazione che invece puoi evitare, eseguendola prima dei cicli... lo cerco e lo aggiungo qui...]


Ah, vedo che poi hai cambiato codice; nel precedente avevi:
B4X:
   For An=0 To 255
        For rag=0 To 255
            X=Raggio+Cos((2*cPI/3)*(An/255))*(Raggio*rag/255)

e cPI/3 veniva eseguito una marea di volte, mentre sarebbe stato meglio usare una variabile (meglio ancora una costante) che contenesse direttamente il risultato ed usare questa.
 

Star-Dust

Expert
Licensed User
Si, l'ho visto nel thread dedicato alla libreria (che devo capire meglio, perché non capisco se hai evitato di usare i DoEvents o eviti gli Sleep e Wait For o se usi entrambi, cosa che non vedo come possa consentire di usarla sia a chi abbia la versione 7 di b4a sia a chi abbia le versioni precedenti).

Cmq, il discorso era su come inserire in una libreria dei file e a questo serviva la mia LUUUUNGA spiegazione :).

[Ho visto anche il codice parziale e temporaneo che hai usato per creare il "disco"; puoi velocizzarlo perché, se ci fai caso, esegui molte volte una moltiplicazione che invece puoi evitare, eseguendola prima dei cicli... lo cerco e lo aggiungo qui...]


Ah, vedo che poi hai cambiato codice; nel precedente avevi:
B4X:
   For An=0 To 255
        For rag=0 To 255
            X=Raggio+Cos((2*cPI/3)*(An/255))*(Raggio*rag/255)

e cPI/3 veniva eseguito una marea di volte, mentre sarebbe stato meglio usare una variabile (meglio ancora una costante) che contenesse direttamente il risultato ed usare questa.
devo migliorare il codice è tutto un casino
 

Star-Dust

Expert
Licensed User
Si, l'ho visto nel thread dedicato alla libreria (che devo capire meglio, perché non capisco se hai evitato di usare i DoEvents o eviti gli Sleep e Wait For o se usi entrambi, cosa che non vedo come possa consentire di usarla sia a chi abbia la versione 7 di b4a sia a chi abbia le versioni precedenti).

Cmq, il discorso era su come inserire in una libreria dei file e a questo serviva la mia LUUUUNGA spiegazione :).

[Ho visto anche il codice parziale e temporaneo che hai usato per creare il "disco"; puoi velocizzarlo perché, se ci fai caso, esegui molte volte una moltiplicazione che invece puoi evitare, eseguendola prima dei cicli... lo cerco e lo aggiungo qui...]


Ah, vedo che poi hai cambiato codice; nel precedente avevi:
B4X:
   For An=0 To 255
        For rag=0 To 255
            X=Raggio+Cos((2*cPI/3)*(An/255))*(Raggio*rag/255)

e cPI/3 veniva eseguito una marea di volte, mentre sarebbe stato meglio usare una variabile (meglio ancora una costante) che contenesse direttamente il risultato ed usare questa.
In ogni caso il codice cosi incasinato era molto più veloce, adesso ha un piccolo lag
 

LucaMs

Expert
Licensed User
Longtime User
Te l'ho detto, a forza di "parlare" con me stai acquisendo i miei difetti.

Ti stai incaponendo perché vuoi creare il "disco" a runtime (ti capisco, perché vuoi spuntarla tu) ma sarebbe molto meglio usare l'esempio di Erel, inserendo una bitmap già pronta e andare avanti, spendendo il tempo per cose più utili.

[Io faccio anche di peggio: spreco il tempo a scrviere boiata su questo sito :p]
 
Top