Ciao a tutti,
il problema che non sono riuscito a risolvere (e spero che qualcuno sia in grado di darmi una mano :) ) è il seguente:
- quando provo a caricare un file tramite Drag and Drop ad es. su una PictureBox, che contiene al suo interno caratteri "speciali" (tipo spazi, lettere accentate ec..) il file non viene caricato e viene generato una Eccezzione (Not a object); in pratica non trova il file.
- caricando lo stesso file tramite una Dialog (es: DialogOpenFile) invece il file viene caricato correttamente.
Penso che il problema potrebbe essere dovuto ad una possibile codifica diversa con cui vengono restituite le stringhe dagli oggetti Drag e Dialog.
Infatti le stringhe restituite dei rispettivi file sono:
- tramite Drag and Drop: /home/luigi/Desktop/Gota_D'%C3%A1gua_by_Eiti_Kimura.jpg
- tramite Dialog: /home/luigi/Desktop/Gota_D'água_by_Eiti_Kimura.jpg
Penso sia un bug di Gambas, la versione di Linux che stò utilizzando è Ubuntu 14.04 64bit e Gambas 3.1.1
Un mega grazie a chi riesce ad aiutarmi a risolvere questo grattacapo! ;D
Il codice:
Public Sub PictureBoxImage_Drop()
Print Drag.Data
LoadImage
End
Public Sub LoadImage()
Dim filePicture As String
Dim imagePicture As Image
filePicture = Drag.Data
Print filePicture
filePicture = Right(filePicture, Len(filePicture) - 7)
filePicture = Left(filePicture, Len(filePicture) - 2)
Print filePicture
imagePicture = Image.Load(filePicture)
PictureBoxImage.Picture = imagePicture.Picture
Catch
Error.Text
End
Public Sub ButtonOpen_Click()
Dim filePicture As String
Dim imagePicture As Image
If (Dialog.OpenFile() == False)
Print Dialog.Path
filePicture = Dialog.Path
imagePicture = Image.Load(filePicture)
PictureBoxImage.Picture = imagePicture.Picture
Endif
End
Allora... ho capito in pratica perché mi dava errore: usavo il componente grafico gb.qt4. Usando gli altri tipi di componenti grafici, l'errore non viene sollevato.
Confermo, però, che non viene accettato un percorso, o comunque un nome di file contenente caratteri particolari (ad esempio anche il semplice spazio).
Per ottenere un risultato funzionante, con il componente gb.qt4, ovviando anche al problema degli spazi e altri caratteri particolari presenti nella stringa del percorso del file, ho dovuto escogitare un codice di questo tenore:
Public Sub Form_Open()
' Impostiamo la proprietà ".Drop" a "Vero" per consentire l'attivazione dell'evento del "Drop"
PictureBox1.Drop = True
End
Public Sub PictureBox1_Drop()
Dim dati, percorso, percorso_controllato As String
dati = Drag.Data
percorso = String.Mid(dati, 8, String.Len(dati) - 16 - 7)
percorso_controllato = controllo(percorso)
PictureBox1.Picture = Picture.Load(percorso_controllato)
End
Private Function controllo(percorsoFile As String) As String
Dim b As Byte = 1
Dim n As Byte
Dim s1, s2 As String
While b < Len(percorsoFile) + 1
s1 = Mid(percorsoFile, b, 1)
If s1 = "%" Then
n = Val("&" & Mid(percorsoFile, b + 1, 2))
s1 = Chr(n)
b += 2
Endif
s2 &= s1
Inc b
Wend
Return s2
End
Ciao a tutti,
il problema che non sono riuscito a risolvere (e spero che qualcuno sia in grado di darmi una mano :) ) è il seguente:
........
Penso di aver trovato una soluzione al tuo problema.
Qui di seguito il codice:
Public Sub Form_Open()
PictureBox1.Drop = True
End
Public Sub PictureBox1_Drop()
Print Drag.Data
LoadImage
End
Public Sub LoadImage()
Dim filePicture As String
Dim imagePicture As Image
filePicture = Drag.Data
Print filePicture
filePicture = Trim(Right(filePicture, Len(filePicture) - 7))
Print filePicture
PictureBox1.Picture = Picture.Load(Ripristina(filePicture))
Catch
Message.Info(Error.Text)
End
Private Sub Ripristina(s As String) As String
Dim s2 As String
s2 = Replace(s, "%20", " ")
Print s2
s2 = Replace(s2, "%C3%B2", "ò")
Print s2
s2 = Replace(s2, "%C3%A0", "à")
Print s2
s2 = Replace(s2, "%C3%A8", "è")
Print s2
Return s2
End
L'apostrofo non dà errore mentre lo spazio e tutte le lettere accentate si, poi non saprei devi fare tutte le prove.
La funzione Ripristina() non è completa di tutti i casi e te la lascio completare volentieri ;D poi fammi sapere ciao
:ciao:
..... risolvere questo grattacapo!
ehmmm.... riguardo, invece, al tuo codice, io suggerirei questa soluzione:
Public Sub PictureBoxImage_Drop()
Print Drag.Data
LoadImage
End
Public Sub LoadImage()
Dim filePicture, percorso, percorso_controllato As String
filePicture = Drag.Data
' Assegna alla variabile "percorso" la stringa contenuta
' nella variabile "filePicture", partendo dall'8° carattere:
percorso = String.Mid(filePicture, 8, String.Len(filePicture))
' Invoca la funzione per gestire i caratteri speciali e gli spazi,
' passandole la stringa contenuta dalla variabile "percorso",
' priva di eventuali spazi alle sue estremità:
percorso_controllato = controllo(Trim(percorso))
PictureBoxImage.Picture = Picture.Load(percorso_controllato)
Catch
Error.Text
End
Private Function controllo(percorsoFile As String) As String
Dim b As Byte = 1
Dim s1, s2 As String
Dim n As Byte
' Il ciclo è attivo, finché la varibile "b" è inferiore al numero
' di caratteri più 1 della stringa contenuta nella variabile "percorsoFile":
While b < Len(percorsoFile) + 1
' Legge il carattere della stringa contenuta nella variabile "percorsoFile"
' presente nella posizione indicata dall'attuale valore assunto dalla variabile "b":
s1 = String.Mid(percorsoFile, b, 1)
' Se il carattere è uguale a "%"....
If s1 = "%" Then
'...allora si prendono i due caratteri immediatamente successivi al carattere "%",
' i quali insieme rappresentano un numero esadecimale.
' Questi due caratteri vengono trasformati in un numero a rappresentazione decimale.
' Tali caratteri possono essere complessivamente 2 per rappresentare il codice esadecimale dello spazio;
' altrimenti essi saranno complessivamente 4 (e verranno raccolti in due cicli consecutivi), se si
' tratterà di un carattere speciale (ad esempio scrivete questo Print Chr(&C3); Chr(&A8) per ottenere in console il carattere: è ).
n = Val("&" & Mid(percorsoFile, b + 1, 2))
' I valori a rappresentazione decimale vengono utilizzati dalla funzione "Chr()" per essere trasformati in caratteri.
' Da NOTARE, come mostrato prima, che ponendo insieme due valori particolari e ben determinati del codice ASCII esteso,
' restituiscono nella rappresentazione della stringa il carattere speciale originario:
s1 = Chr(n)
b += 2
Endif
s2 &= s1
Inc b
Wend
Return s2
End
...io lo faccio per lavoro 10 ore al giorno...... la mia è totale mancanza di tempo.
In effetti, questa è una cosa che Ceskho da qualche anno ha sempre detto.
....come mai nella Wiki non commenti così bene come ai fatto con therock892 e me?
Talvolta commento più in dettaglio. Altre volte lascio parlare di più l'aspetto pratico. Del resto non ci si può mettere lì a commentare ogni singola riga di codice ! (http://levipere.com/wp-content/plugins/smilies-themer/Axendr/SmileySuicide.gif)
....come mai occorre “tradurre” con VAL quando Gambas è in grado di capire l'esadecimale (vedi tuo commento Print Chr(&C3); Chr(&A8) = è)? Ho visto che darebbe errore senza ma non capisco.
.......cioè tu dici: " Perché fare questo casino:
n = Val("&" & Mid(percorsoFile, b + 1, 2))
invece che adottare più semplicemente questo ?
s1 = Chr(&Mid(percorsoFile, b + 1, 2))
Giusto ? O no ?
La mia risposta è questa:
Cosa (ossia: che tipo di valore) vuole la funzione Chr() ?
...cosa restituisce la funzione Mid() ?
Sottolinearei che il prefisso " & " (ovviamente nel caso che hai ricordato del Chr(&C3) ) individua e specifica semplicemente la rappresentazione esadecimale di un numero.
Tempo fa in ordine alla conversione di un numero da rappresentazione esadecimale a rappresentazione decimale ho scritto un brevissimo riassunto nella nostra WIKI:
http://www.gambas-it.org/wiki/index.php?title=Convertire_un_numero_da_rappresentazione_Esadecimale_a_Decimale