Ciao Vuott e un saluto a tutti quanti
Sembra che dopo aver aggiornato il sistema alla mint 20.1 e installato nuovamente gambas3 tutto abbia ricominciato a funzionare come si deve, finalmente.
Ho immediatamente cominciato a studiare il codice di esempio che mi hai gentilmente fornito (Rif. Risposta #17 il: 10 Maggio 2021, 02:15:50)
Ho dovuto adattare qualche cosa, marginale, in relazione al fatto che usiamo strumenti differenti, io uso il sistema in inglese e Mate, Tu per quanto ho potuto capire lo usi in italiano con Cinnamon, quindi per me cambia il percorso del Desktop ed invece di Nemo uso Caja
La logica del codice mi e' chiara, anche se mi sono scontrato con alcune cose, non legate alla logica ma alla mia scarsa confidenza con gli strumenti.
Inizialmente non capivo
l'utilizzo dell'istruzione SCAN, guardando l'help mi pare di intendere che questa istruzione 'inscatola' in una sorta di array parti di una stringa in base ad un pattern specificato, la sua utilita' l'ho compresa in seguito, analizzando l'output dell'istruzione SHELL con GIO INFO, l'output in questione e' una variabile contenente una lunghissima stringa intervallata da numerosi "\n", difficilmente trattabile con altri mezzi
Approfondiro' in seguito la questione relativa all'utilizzo di SCAN
.x = Val(Scan(s, "*::nemo-icon-position: *,*\n*")[1])
Qui tratto la stringa s, dalla quale estraggo "::nemo-icon-position: " ignorando cio' che la precede (il primo *), prelevando qualsiasi cosa seguente che contenga una virgola preceduta e seguita da qualsiasi stringa (secondo e terzo *) fino al NewLine, poi nuovamente ignorando cio' che segue (quarto *), l'indice [1] preleva la stringa che precede la virgola (quindi la coordinata x)
.y = Val(Scan(s, "*::nemo-icon-position: *,*\n*")[2])
Nella seconda istruzione succedono le stesse cose ma prelevando, indice [2], quello che segue la virgola (quindi la coordinata y)
Spero di aver compreso correttamente come funziona, anche se la mia esposizione e' piuttosto contorta, nel caso cosi' non fosse, abbi la bonta' di correggermi, sappi comunque che Hannibal Lecter e' diventato cannibale dopo aver ascoltato tre mie spiegazioni.
Mi si presenta un ulteriore disagio, alla prima SCAN, mi becco un bel OUT OF BOUNDS, sembra che io cerchi di puntare ad un elemento inesistente di un array, da stamattina remo intorno a questa cosa ma non ne vengo fuori, per me ,vecchio VB6-ers, gli array intesi come oggetti appaiono ancora come cose soprannaturali
Noto comunque, che in uscita da ogni ciclo viene aggiunto un elemento all'oggetto array con "icone.Push(ifd)", quindi al ciclo successivo dovrebbe essere disponibile il nuovo indice a cui puntare
Ho letto con attenzione:
https://www.gambas-it.org/wiki/index.php?title=Array:_creazione,_modifica_e_riempimentoAllego il codice da me massacrato:
' Gambas class file
Public Struct IconaFileDesktop ' Struttura per l'icona
nome As String ' Nome dell'icona
x As Short ' Per posizione x
y As Short ' Per posizione y
rt As Rect ' Rettangolo per icona
End Struct
Private icone As New IconaFileDesktop[] ' Array (tipo definito dall'utente) per le le informazioni delle icone
''Private PERCORSO As String = User.home &/ "Scrivania" ' Uso il sistema in inglese USA, questo non va' bene per me
Private PERCORSO As String = User.home &/ "Desktop" ' Il percorso da analizzare
Private T As Timer ' Per timer
Public Sub Form_Open()
Dim nomefile As String ' Temporanea per i nomi file
Dim s As String ' Temporanea per l'output shell
Dim ifd As IconaFileDesktop
For Each nomefile In Dir(PERCORSO, "*", gb.File) ' Ciclo per tutti i file corrispondenti alle icone presenti sulla Scrivania:
Shell "gio info '" & PERCORSO &/ nomefile & "'" To s ' Usa a malincuore la funzione "Shell" per lanciare il comando "GIO":
If IsNull(s) Then Continue ' Se s non contiene qualcosa salta il ciclo, altrimenti ...
With ifd = New IconaFileDesktop ' ... Carica nella "Struttura" i dati utili del file individuato dalla
' funzione "Dir()":
.nome = nomefile
''.x = Val(Scan(s, "*::nemo-icon-position: *,*\n*")[1]) ' Uso Mate, quindi Caja, questo non va' bene per me
''.y = Val(Scan(s, "*::nemo-icon-position: *,*\n*")[2]) ' Uso Mate, quindi Caja, questo non va' bene per me
''.x = Val(Scan(s, "*-icon-position: *,*\n*")[1]) ' Forse potrei arrangiare cosi' per generalizzare, poi provero'
''.y = Val(Scan(s, "*-icon-position: *,*\n*")[2]) ' se non mi esplode la cabesa
.x = Val(Scan(s, "*::caja-icon-position: *,*\n*")[1]) '' Qui mi pianto come in un crash-test
.y = Val(Scan(s, "*::caja-icon-position: *,*\n*")[2])
.rt = New Rect(.x, .y, 48, 48) ' Stabilisce un'area standard di 48x48 pixel per ciascuna icona di file
End With
icone.Push(ifd) ' Incrementa gli elementi del vettore
Next
T = New Timer As "Tmr" ' Crea il Timer
T.Delay = 50 ' Imposta il ritardo dell'evento
T.Start ' Lo avvia
End
''-------------------------------------------------------------------------------------------------------------------------------------------------------
'' EVENTO del timer
''-------------------------------------------------------------------------------------------------------------------------------------------------------
Public Sub Tmr_Timer()
Dim c As Short ' Per scorrere il vettore delle icone
TextArea1.Clear ' Pulisce la TextArea
For c = 0 To icone.Max ' Scorre il vettore
''-----------------------------------------------------------------------------------------'
'' Se le coordinate x,y in pixel correnti in cui si trova il puntatore del mouse rientrano '
'' in un'area quadrata caricata, va a vedere a quale icona e file appartiene: '
''-----------------------------------------------------------------------------------------'
If icone[c].rt.Contains(Mouse.ScreenX, Mouse.ScreenY) Then
''--------------------------------------------------------------------------------------------------------'
'' Mostra alcune caratteristiche del file al quale corrisponde l'icona sorvolata dal puntatore del mouse: '
''--------------------------------------------------------------------------------------------------------'
TextArea1.Text = "== Caratteristiche del file ==\n" &
"\nPercorso: " & Stat(PERCORSO &/ icone[c].nome).Path &
"\nDimensione: " & Stat(PERCORSO &/ icone[c].nome).Size & " Byte" &
"\nUltimo Accesso: " & Stat(PERCORSO &/ icone[c].nome).LastAccess &
"\nUltima modifica: " & Stat(PERCORSO &/ icone[c].nome).LastModified &
"\nPermessi: " & Stat(PERCORSO &/ icone[c].nome).Auth &
"\nUtente: " & Stat(PERCORSO &/ icone[c].nome).User &
"\nGruppo: " & Stat(PERCORSO &/ icone[c].nome).Group &
"\nMimetype icona: " & DesktopMime.FromFile(Stat(PERCORSO &/ icone[c].nome).Path).Type
Endif
Next
End
Noterai sicuramente che a parte le modifiche precedentemente descritte ed i commenti non ho modificato altro, ho passato il mio tempo a leggerlo e comprenderlo, prendedolo come spunto per orientarmi nella ricerca degli help e della documentazione relativa, poi ore di esecuzioni step to step per vedere in funzione ogni singola parte, riusciro' a districarmi anche dal problema dell'array