Creare Cartelle

Buonasera qualcuno Riuscirebbe a spiegarmi come fare per ottenere che nella cartella Resources Dopo il Build ci siano le cartelle esattamente come lo ho create in XoJo. Es. : ----

Basta che metti un copy step relativo alla cartella che li contiene o se provengono da posizioni diverse un copy step per ognuno inserendo il nome della cartella di destinazione

Grazie Antonio. Solo che Sono proprio un novizio riusciresti a farmi un esempio pratico per cortesia…

Allora innanzi tutto le cartelle che metti nell’IDE sono solo per organizzare la visualizzazione nell’IDE stesso, non hanno nessuna conseguenza fisica (nel senso di percorso) con il posizionamento nell’eseguibile.

Se fai riferimento all’immagine nel codice, ovvero la usi direttamente per nome, non consigliabile creare una struttura nel file delle risorse.
Se invece le richiami seguendo il percorso allora ha senso.
In questo caso (o al limite per ampliare la tua conoscenza di Xojo) basta che selezioni insert->build step -> copy file
trascina l’elemento creato nella zona relativa ai build setting delle piattaforma che ti interessa (se hai come target diverse piattaforme dovrai crearne uno per piattaforma). L’importante che lo posizioni dopo il passo build che puoi vedere aprendo il setting della piattaforma dopo aver trascinato il “copy step”
I parametri da inserire sono (nell’ispector a destra)
se vuoi un nome per il passo ad esempio copiaLeImmaginiSuOSX
il behaviour lascialo su both (in modo che questa copia avvenga sia in debug che in compilazione)
destination lo imposti su Resources folder (per le immagini va bene)
subdirectory lascialo vuoto se vuoi che quanto copiato sia direttamente nella cartelle risorse, altrimenti metti il nome della cartella cha vuoi creare (un solo livello, ad esempio images)
Nella parte centrale trascini il file (o i files) che vuoi copiare, se vuoi creare una struttura ordinata come da immagine trascini le cartelle A1,B e C che a loro volta contengono le relative sotto cartelle e immagini.

Ma ripeto, questo non ti permette di inserire le immagini direttamente da IDE, dopo potrai accedere ad queste immagini (o qualsiasi altra cosa hai copiato nelle risorse in questo modo) solo da codice.

Pi difficile a scriverlo per spiegarlo che a farlo…

Grazie Antonio Faccio Subito una Prova

In Effetti pi facile farlo. Ancora Grazie sei un grande

Buongiorno Antonio ho provato a fare da solo. Ma Sto trovando delle difficolt ;Praticamente esiste un modo per far si che delle immagini che ho nel IDE vengano reindirizzate nelle cartelle create col “copy step” Una volta fatto il Built ? O Altrimenti riusciresti a spiegarmi come richiamarle col Codice nel caso le abbia gia inserite ? Lo schema sempre quello di prima. Grazie scusami solo che mi venuta questa idea per complicarmi la vita (Mi piace avere le cose con in certo ordine visto che sto lavorando con tantissimi file grafici)e ora sono bloccato.

Ciao Nico,
Come ti ho gi detto hai 2 impostazioni ed usi diversi.

  1. Le immagini le hai trascinate nell’IDE
    Allora ogni immagine ha un nome specifico indipendentemente da dove posizionata nell’IDE (qui le cartelle sono virtuali e la loro struttura serve solo ad organizzarti il lavoro, ma non hanno una valenza reale)
    Infatti puoi trascinare lo stesso file due volte (ad esempio il file A.png) e verr rinominato all’interno dell’IDE (A e A1 che poi puoi modificare)
    I nomi saranno poi quelli dei file che andranno nella cartella Resources all’interno dell’Applicazione (su Mac) e tu farai riferimento all’oggetto picture con lo stesso nome (nell’esempio oggetto A e oggetto A1)

2)Le immagini le copi con il copyStep
Crei una copyStep, lo trascini dopo il build nella sezione OSX (per Mac), imposti applies a Both, destination a Resources e subdirectory a immagini (per esempio). Poi trascini nell’area centrale i files che vuoi far copiare anche con la loro struttura (ovvero comprese le cartelle). Facciamo come esempio che trascini il file A.png e una cartella imgs con un file che si chiama sempre A.png, i file verranno copiati durante la compilazione (debug o normale)
Per accedere ai file in Resources:
dim f as folderItem = app.ExecutableFile.Parent.Parent.Child(“Resources”)

per accedere ad A.png -> f=f.child(“immagini”).child(“A.png”)
per accedere a l’altro A.png (quello che dentro imgs) -> f=f.child(“immagini”).child(“imgs”).child(“A.png”)

Per accedere alla picture:
dim p as picture=picture.open(f)

L’esempio: https://www.dropbox.com/s/onlxrz4b6vl95xt/NicoSample.zip?dl=0

Grazie Antonio Sempre molto esauriente ora mi metti sotto per provare ad Adattarlo alla mia necessit ti faccio sapere…Grazie Ancora

Buona sera Antonio Grazie Ancora Per la dritta che mi avevi dato. Ho studiato Parecchio nell’ ultimo periodo e sto veramente cominciano divertire ultimamente; Sono andato avanti col mio progetto solo che ora mi cominciano a sorgere Problemi che non so se sono solo errori Logici da parte mia (In Qualche caso Sicuramente ne sono certo) ,una scrittura poco prestante del codice o semplicemente sto mangiando le risorse del Computer (Strano i7 ,16 GB Ram Direi dovrebbero bastare). Cmq Primo Problema Premetto che mi succede solo Chiamando un certo quantitativo di Immagini tutti PNG con Codice tipo questo sul paint:

'Dichiarazione F
Dim F As FolderItem
'Destinazioni Sistemi Operativi
#If TargetMacOs Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Elseif TargetWin32 Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Elseif TargetLinux Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Endif
'Destinazione Cartella Specifica
System.DebugLog F.NativePath

Select Case A.Text
Case “+1”, “+2”, “+3”, “+4”, “+5”, “+6”, “+7”
F=F.Child(“Skin”).Child(“Icone”).Child(“V$U.Png”)
Dim P As Picture=Picture.Open(F)
G.DrawPicture P,0,0
Case “-1”, “-2”, “-3”, “-4”, “-5”, “-6”, “-7”
F=F.Child(“Skin”).Child(“Icone”).Child(“V$D.Png”)
Dim P As Picture=Picture.Open(F)
G.DrawPicture P,0,0
Case “0”
F=F.Child(“Skin”).Child(“Icone”).Child(“V$=.Png”)
Dim P As Picture=Picture.Open(F)
G.DrawPicture P,0,0
End Select

O Anche Solo

'Dichiarazione F
Dim F As FolderItem
'Destinazioni Sistemi Operativi
#If TargetMacOs Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Elseif TargetWin32 Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Elseif TargetLinux Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Endif
'Destinazione Cartella Specifica
System.DebugLog F.NativePath

F=F.Child("Skin").Child("Icone").Child("V$F.Png")
Dim P As Picture=Picture.Open(F)
G.DrawPicture P,0,0

Quello che mi succede e che le schermate si apro a scatti.
Nel Caso Metta La mia stessa immagine nel Backrdop del Canvas il problema non si pone

Introdurre il codice all’interno del paint la cosa migliore in molti casi.
Ma se devi accedere al disco (l’elemento pi lento del computer), decodificare l’immagine (da png a picture) ovviamente questo rallenta tutta l’operazione.
Ora in base alla “dinamicit” delle scelte, puoi:
-Creare un’immagine che sar il backdrop
-mettere in una cache (un dictionary ad esempio) le immagini e poi disegnarle nel modo opportuno nel paint
-Costruire una sistema misto: le parti fisse le metti in una picture, quelle “variabili” le posizioni o le cambi in base alla necessit e fai tutto nel paint

Il dictionary lo puoi costruire in modo lazy, ovvero istanzi il dictionary e poi se ha l’elemento lo visualizzi altrimenti lo carichi e poi lo visualizzi, alla seconda chiamata sar gi pronto.
ad esempio puoi fare in questo modo anche una animazione con uno sfondo e uno o pi oggetti che si muovono e cambiano a seconda delle necessit.


Finalmente Ho trovato un po di tempo Per Mettere in Pratica il tuo consiglio ma sono riuscito al risolvere fino a un certo Punto. Perciò ho provato in un modo leggermente diverso Ho Creato un “Method” (CaricaGrafice) :

Dim F,K1,K1x,K2,K3,K4,K5,K12 As FolderItem
'Destinazioni Diversi Sistemi Operativi
#If TargetMacOs Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Elseif TargetWin32 Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Elseif TargetLinux Then
F=App.ExecutableFile.Parent.Parent.Child(“Resources”)
#Endif
System.DebugLog F.NativePath

//Overlay TopBanner
K1=F.Child(“Skin”).Child(“Box”).Child(“Splash”).Child(“B4NN£1.Png”)
//Overlay BottonBanner
K1x=F.Child(“Skin”).Child(“Box”).Child(“Splash”).Child(“B4NN£2.Png”)
//Pulsante Chiudi
K2=F.Child(“Skin”).Child(“Button”).Child(“TitleBar”).Child(“BtnX.Png”)
//Pulsante Ridimensiona
K3=F.Child(“Skin”).Child(“Button”).Child(“TitleBar”).Child(“Btn?.Png”)
//Pulsante Riduci
K4=F.Child(“Skin”).Child(“Button”).Child(“TitleBar”).Child(“Btn-.Png”)
K5=F.Child(“Skin”).Child(“Button”).Child(“TitleBar”).Child(“BtnSP$.Png”)
K12=F.Child(“Skin”).Child(“Box”).Child(“Splash”).Child(“BG$&%X.Png”)
////////////////////////////////////////////////////////////////////////////////////////////////////////// BASE
BannerAlpha.Backdrop = Picture.Open (K1)
GraphChiudi.Backdrop = Picture.Open (K2)
GraphRidimensiona.Backdrop = Picture.Open (K3)
GraphRiduci.Backdrop = Picture.Open (K4)
PGSideBar.GraphBannerB.Backdrop = Picture.Open (K1x)
PGSideBar.GraphBasePulsanti.Backdrop = Picture.Open (K5)
PGOpzioni.GraphSfondoOpzioni.Backdrop = Picture.Open (K12)
//////////////////////////////////////////////////////////////////////////////////////////////////////////
Cosi Facendo le Prestazioni sono nettamente migliorate ed ho quasi completamente rimosso il comando “paint”

II°
Volevo Creare Un Progetto in SDI Perciò Dopo Aver Creato La Mia “Window” Ci Ho messo un "PagePanel"In ogni sua Pagina Ho messo un “ContainerControl” Contenente Interface, Pulsanti, Proprietà,“Methods” ,Altri ContainerControl Ecc… .Problema
1° Non Sono sicuro se il metodo sia coretto (Sto Ancora Imparando Provo quello che mi può sembrare logico e se funziona sono già Emozionato)
2° In passato avevo avuto un piccolo Approccio con VB6 E Avevo imparato facendo un progetto in MDI A chiudere Le Varie Finestre Una Volta che Avevano Svolto La Loro Funzione E Riaprirli nel caso servissero Per risparmiare risorse ecc. Qui per logica ho pensato che una volta abbandonato una determinata pagina del “PagePanel” di chiudere il “ContainerControl” al suo interno con tutto il Bagaglio. Ma non funziona come Vorrei.
3° Il Fatto di Creare “ContainerControl” dentro Altre O Ancora Altre dentro quest’ ultime Può alla lunga creare problemi ??
4° Fino Ad Oggi Ho sempre Lavorato con Database Creati con Un Foglio di Calcolo, Nel Senso, Per esempio Creavo un File con le nazioni E un Altro Con le città Poi dal codice gli associavo. Dato che Xojo dispone di Sqlite Mi conviene Assolutamente creare le Relazioni o posso cmq Gestire le Varie tabelle come gestivo i File ??
5°Come Puoi Vedere In testa ho creato il target per i tre Sistemi.I punto è che quando faccio il build per windows non funziona.

Scusa Per la Lunga Serie Di domande, il punto è Visto che farò dei lungi tratti di treno in sola Compagnia del mio Mac volevo avere de chiarimenti per ottimizzare il tempo.

Ciao Nico,
Io farei un metodo che potrai riutilizzare in altre applicazioni.

[code]Function getResPic(path as String) As Picture
//se path vuoto non ho picture da caricare
//il path scritto con il divisore di percorso classico /
if path="" then Return nil

//Vettore dei componenti del path
dim vPath() as String=path.Split("/")

//In base a sistema operativo ottengo la folder item di partenza
dim f as FolderItem
#if TargetMacOS
f=app.ExecutableFile.Parent.Parent.Child(“Resources”)
#elseif TargetWindows
f=app.ExecutableFile.Parent.Child(app.ExecutableFile.Name.replace(".exe","")+" Resources")
#elseif TargetLinux
f=app.ExecutableFile.Parent.Child(app.ExecutableFile.Name+" Resources")
#Endif

//se la f nil o non esiste non posso trovare la picture
if f=nil or not f.exist then Return nil

//Scorro il vettore e se la nuova f nil o non esiste allora non posso trovare la picture
for each s as String in vPath
f=f.Child(s)
if f=nil or not f.Exists then Return nil
next

//Cerco di caricare la picture
dim p as Picture
try
p=Picture.Open(f)
Catch
p=nil
end try
//Restituisco la picture trovata
Return p
End Function[/code]
In questo modo semplifichi il tutto, scrivi meno codice e puoi controllare meglio se ci sono problemi

Scrivi questo funzione in un modulo e prendendo il tuo codice come esempio la usi semplicemente in questo modo:

//Pulsante Riduci K12=F.Child("Skin").Child("Box").Child("Splash").Child("BG$&%X.Png") //Overlay TopBanner BannerAlpha.Backdrop = getResPic("Skin/Box/Splash/B4NN1.Png") //Pulsante Chiudi GraphChiudi.Backdrop = getResPic("Skin/Button/TitleBar/B4NN1.Png") //Pulsante Ridimensiona GraphRidimensiona.Backdrop = getResPic("Skin/TitleBar/TitleBar/Btn?.Png")
… e cos via

Per le domande:
1 Si corretto: il principio dell OOP ridurre il tutto a singoli oggetti, possibilmente riutilizzabili. Per cui fare una unica finestra con centinaia di oggetti, anche se istintivamente comprensibile tremendamente pesante da gestire sia a livello di design, che di IDE che di codice. In questo modo devi solo far colloquiare gli elementi tra di loro.
2 + 3 Dipende da quante risorse consumano gli elementi, quanto “pesante” ricrearli piuttosto che tenerli latenti. Devi trovare il giusto equilibrio. Come esempio puoi prendere proprio il caricamento delle immagini. Visto che le utilizzi come backdrop, il non utilizzo del paint la soluzione pi semplice. Ma se dovessero essere dinamiche (ad esempio devi disegnare) allora l’evento paint l’unica alternativa. Nel tuo caso era lenta perch sicuramente nel paint caricavi le immagini. Ora l’equilibrio precaricare (cosa che in realt fai quando assegni il backdrop) ma se tu avessi migliaia di immagini questo sarebbe pesante per le risorse a disposizione. In quel caso (come nel caso dei ContainerControl) devi trovare la strategia d’equilibrio (le risorse sono limitate… non tantissimo ormai, ma anche i tempi d’attesa…)
4 i tempi d’accesso e le possibilit di gestione (tra cui relazioni e normalizzazioni) non hanno paragoni tra un file e un db. Assolutamente passa al db
5 gi nella funzione. Per Win e Lnx controlla come viene nominata la cartella delle risorse (cambia tra versioni di Xojo e per impostazioni dell’IDE)

Ciao

Buongiorno. Antonio Finalmente dopo Un po di tempo riesco a rimettere Mano al Mio Bel Xojo. Volevo Sapere Se mi potevi dare delle Illuminazioni sui Dilemmi che mi stanno venendo Fuori. Premetto che sto portando avanti anzi meglio sto Ristrutturando e quindi allargando un Gioco (Text Based quindi al 80% Il Gioco lo Fa il Database il Resto sono Testo e Immagini Statiche) che Avevo cominciato tempo fa con VB6 Come ti dissi a tempo a dietro fino ad oggi la mia idea di Database sono sempre stati dei fogli di calcolo (Excel,CSV) e nel ritrovarmi davanti sqlite ho un po esagerato e ora ho un database con 110 Tabelle relazionate Col “FOREIGN KEYS”.

1°Il Motivo Perché Abbandonai VB6 Era la Lentezza A caricare. Quindi Volevo Sapere se Sqlite con 110 Tabelle di cui un paio Dovrebbero andare oltre i 5000 Records potrebbe creare Problemi a Xojo e Quale Sarebbe la Soluzione Migliore.

2°La relazione Col “FOREIGN KEYS” Va Bene per Xojo O Devo Per forza fare i “QUERY”()

TABELLA CONTINENTE TABELLA PAESE TABELLA CITTA
ID_Continente Int — ID_Paese Int ID_Citta Int
Nome Vachar Nome Vachar Nome Vachar
Continente_ID Int Paese_ID Int

3°Come posso connettere tutto il database con tutte la tabelle in modo da richiamarle quando ne ho bisogno ??
4°Come posso richiamare una tabella con un popmenu e Associare dei label Alle Varie Colonne della Tabella ??

5°Per quanto riguarda Il Database durante il gioco ho pensato a due soluzioni
A)Clonare il DB Originale con uno che si aggiorna in base agli eventi del gioco
B)Usare DB Originale per creare dei documenti da cui prelevare le info.

Quale sarebbe il piu prestante o Ancora ci sono soluzioni migliori ??

6°.C’è Un Modo per Rendere il DB.sqlite Leggibile solo da Gioco quindi non Modificabile da terzi ??

Scusami se è Tutto un po confusionario.

Ciao,
1)accedere al db non un problema con Xojo, sqlite pi efficiente di quanto possa sembrare. Certo che, ad esempio, se carichi i 5000 record per visualizzarli tutti insieme la velocit potrebbe essere non ottimale, in questi casi il problema non Xojo di per se, ma la mole dei dati per cui devi trovare la tua strategia ottimale per visualizzare quanto ti serve.
Gestisco db in sqlite con milioni di record senza problema utilizzando le giuste strategie.

2)Per l’uso e il significato dei foreign keys in sqlite guarda questo documento: https://www.sqlite.org/foreignkeys.html

  1. Quando accedi ad un db (db.connect) hai la connessione all’intero database, poi da qui puoi selezionare record o modificarli. In genere per db esterni (mysql, mssql etc) devi sempre verificare che la connessione sia ancora attiva perch potrebbe essere andata in timeout per inutilizzo, per sqlite non hai questo problema (ma magari il file stato spostato…)

4)Non ho capito cosa deve fare il popup e di quali label parli (o meglio forse ho capito ma potrei risponderti con qualcosa che non corrispondente alla tua domanda)

5)Dipende da quello che vuoi fare. Ad esempio potresti avere il db immodificabile dei dati del programma e un db modificabile con i dati degli utenti e volendo legarli tra loro (cfr il comando attach)

6)In Xojo i db sqlite sono criptabili, non hai perdita di performance rilevanti e una volta criptati non sono leggibili se non dal tuo programma o da chi ne possiede l’algoritmo e la password.

… in effetti un po’ di cose assieme… un po’ di confusione c’ :slight_smile:

: -) Si Vero Solo che non essendo molto pratico di sqlite Non Sapevo bene come porti i Problemi
ComunqueGrazie Antonio Sono un po piu tranquillo di procedere. Per quanto riguarda il punto

4 A)Intendevo Per collegare Una determinata Tabella A una “lIstBox” non ho problemi invece ho dei problemi se volessi usare il “Pop Menu” .
B)Per la “label” invece Intendevo Per Esempio Ho La tabella “CITTA” Con Le Colonne ID_Citta, Nome_Citta,Nazione,Popolazione Se col “Pop Menu” Seleziono Una Citt “Label1”.Text = Nazione - “Label2”.Text = Popolazione E Via…

Non vedo la differenza con la list box

dim rs as recordset=db.sqlSelect("SELECT id_citta, nome_citta from tabellaDelleCitta order by 2") popup.deleteAllRows while not rs.eof popup.addRow(rs.field("nome_citta").stringValue) popup.rowTag(popup.listCount-1)=rs.field("id_citta").integerValue rs.moveNext wend

nell’evento onchange del popup

dim rs as recordset dim p as sqlitepreparedStatement=db.prepare("SELECT nazione,popolazione from tabellaDelleCitta where id_citta=?") p.bind(0, sqlitepreparedstatement.SQLITE_INTEGER) rs=p.sqlSelect(me.rowTag(me.listIndex)) label1.text=rs.field("nazione").stringValue label2.text=rs.field("popolazione").stringvalue //o qualche format del dato se numerico...

Ciao

PS non ci sono i controlli di routine tipo errori nella select, record cancellati e quindi se interroghi la citt potrebbe non esserci, controllo del listindex del popup che non sia -1 e il tutto scritto direttamente qui nel forum per cui ad esempio la costante del bind potrebbe essere leggermente diversa, ma hai l’autocompletamento per questo…

Ah grazie Sbagliavo Cosi :
popup.rowTag(popup.LISTINDEX)=rs.field(“id_citta”).integerValue
rs.moveNext
wend

Perch Nel “ListBox” Mettevo “Lastindex”

Ora Provo Le Dritte Poi ti faccio Sapere Grazie Ancora

Buongiorno Antonio Ho Avuto dei problemi con il Change del Pop Mi va in crash. comunque ti ho postato il Test che ho fatto.

https://www.dropbox.com/s/59a8fgtqprsypu6/SQL%20Test.xojo_binary_project?dl=0
https://www.dropbox.com/s/xwamnpnbrs8m9h6/SQL%20Test.db?dl=0

Nei Progetti ci sono altri due Interrogativi Se hai tempo.
Grazie Ancora In Anticipo

Errore mio, avevo detto che scrivevo al volo

p.bindTye(0, sqlitepreparedstatement.SQLITE_INTEGER)

per quando riguarda il caricamento delle immagini , posto che le hai copiate con un copy step nelle risorse e in una cartella images

[code]dim p as picture
dim f as folderItem
//metodo classico per cui devi controllare il nome per ogni piattaforma
app.ExecutableFile.Parent.Parent.Child(“Resources”)
if f<>nil and f.Exists then f=f.child(“images”)

//o in alternativa il metodo nuovo per cui controlli nella directory delle risorse
try
f=new FolderItem(xojo.IO.SpecialFolder.GetResource(“images”).Path,FolderItem.PathTypeNative)
catch
f=nil
end try

//modo comune
if f<>nil and f.Exists then f=f.child(rs.field(“id_citta”).stringValue+".png")
if f<>nil and f.exists then p=picture.load(f)
picToShow una propriet della fienestra
if p<>nil then
picToShow=p
else
picToShow=immagineSeVuoto //se vuoi mostrare un’immagine standard
end if
canvas.invalidate[/code]

e nel paint del canvas:

g.drawPicture p, 0, 0

Per l’altro quesito
Aggiungi un parametro al metodo CaricaTabellaCitta ad esempio idnazione as integer
poi

dim rs as recordset dim p as SQLitePreparedStatement=db.prepare("SELECT ID_Citta, Name FROM Citta where id_nazione=? ORDER BY 2") p.bindType(0, SQLitePreparedStatement.SQLITE_INTEGER) rs=p.sqlSelect(idnazione)
poi il resto del metodo continua come hai scritto

Nel change del popup delle nazioni:

caricaTabellaCitta(me.rowtag(me.listIndex).integerValue)