Ancora difficoltà con le TabStrip. Ho cercato discussioni sull'argomento, ma non ho trovato niente che riguardasse come andare ad aggiornare una delle proprietà di una linguetta intermedia.
Supponiamo che ad un certo punto del lavoro, mi trovi una TabStrip con 6 linguette. Clicco su una di esse, per es. la terza, in modo da attivarla. Essa viene posta in primo piano e diventa immediatamente visibile. Agendo su un pulsante esterno alla TabStrip, scateno un evento che ha il compito di modificare il colore di foregrouand di una TextLabel ed il testo di una Label della linguetta correntemente attiva.
Ebbene, non cambia niente. Le proprietà modificate sono sempre quelle dell'ultima linguetta presente nella TabStrip. Sono intervenuto in diversi modi, anche forzando da codice il valore TabStrp.Index. La label modificata è sempre quella dell'ultima linguetta della TabStrip.
Ecco il codice scritto:
Print "TabSchede.countx= '" & TabSchede.count & "'"
Print "TabSchede.index= '" & TabSchede.index & "'"
Print "TabSchede.CoVoceCassa.Text= '" & CoVoceCassa.Text & "'"
TabSchede.index = 3
Label2.Text = "Prova"
IdCassa.Foreground = iColorSfo
For i = 0 To TabSchede.count - 1
TabSchede.index = i
Print "TabSchede.index= '" & TabSchede.index & "'"
Print "Label2.Text = '" & Label2.Text & "'"
Print "IdCassa.Foreground = " & IdCassa.Foreground
Next
TabSchede.countx= '6'
TabSchede.index= '2'
TabSchede.index= '3'
Label2.Text = 'Prova'
IdCassa.Foreground = 16776656
TabSchede.index= '1'
Label2.Text = 'Prova'
IdCassa.Foreground = 16776656
TabSchede.index= '2'
Label2.Text = 'Prova'
IdCassa.Foreground = 16776656
TabSchede.index= '3'
Label2.Text = 'Prova'
IdCassa.Foreground = 16776656
TabSchede.index= '4'
Label2.Text = 'Prova'
IdCassa.Foreground = 16776656
TabSchede.index= '5'
Label2.Text = 'Prova'
IdCassa.Foreground = 16776656
il Text "Prova" è stato scritto una sola volta, mentre le Print lo riportano tante volte quanti sono le schede di Tabstrip, così pure il colore del testo della IdCassa.
Pur cambiando Il puntamento TabSchede.index ogni volta, i valore riportati nelle Print sno sempre uguali.
C'è sisuramente qualcosa o qualche parametro che mi sfugge, eppure la documentazione di Gambas.org si esprime così nei riguardi della proprietà TabStripIndex
TabStrip.Index (gb.qt4)
Property Index As Integer
Returns or sets the index of the current tab.
Una possibile soluzione è quella che segue:
Public Sub Form_Open()
Dim j As Byte
Dim tl As TextLabel
Dim l As Label
' Inseriamo sei linguette:
TabStrip1.Count = 6
For j = 0 To 5
' Intestiamo ciascuna linguetta:
TabStrip1[j].Text = CStr(j)
' Prendiamo in considerazione la linguetta n. j :
TabStrip1.Index = j
' Inseriamo una "TextLabel" nella linguetta in considerazione:
With tl = New TextLabel(TabStrip1)
.X = 40
.Y = 100
.W = 100
.H = 50
.Text = "TextLabel " & CStr(j)
.Border = Border.Plain
End With
' Inseriamo una "Label" nella linguetta in considerazione:
With l = New Label(TabStrip1)
.X = 40
.Y = 200
.W = 100
.H = 50
.Text = "Label " & CStr(j)
.Border = Border.Plain
End With
Next
' Infine, mostriamo in primo piano la prima linguetta:
TabStrip1.Index = 0
End
Public Sub Button1_Click()
Dim ob As Object
' Prendiamo in considerazione gli oggetti posti sulla linguetta attualmente in primo piano:
For Each ob In TabStrip1[TabStrip1.Index].Children
Select Case Object.Type(ob)
Case "TextLabel"
ob.Foreground = Color.Red
Case "Label"
ob.Text = "Nuovo testo"
End Select
Next
End
@ vuott:
Ti ringrazio per l'ampia codifica che mi hai suggerito come esempio, ma io non devo costruire una nuova linguetta, bensì aggiornare uno o più oggetti di una linguetta già esistente. In ogni caso, la prova che mi suggerisci
Label2[indSk].Text = "Prova"
è stata già fatta è alla sua esecuzione mi viene segnalato l'errore
Not an array
...scusami ma il codice che hai postato non potrebbe comportarsi diversamente, infatti tu referenzi Label2.Text e IdCassa.Foreground che altro non sono se non i nomi.proprietà di due oggetti presenti in una ed una sola delle TAB, in pratica qualunque sia la tab attiva tu stai impostando le proprietà di quei due oggetti specifici.
Forse io non ho capito come funziona una TabStrip, e se è così ogni chiarimento sarà più che gradito.
Secondo quanto capito dai documenti trovati e dal suo impiego pratico, mi pare che TabStrip sia considerabile un array grafico. Per la generazione degli oggetti interni a ciascuna linguetta, sono costretto a richiamare una procedura che si occupa di creare dentro gli oggetti che, nel mio caso, sono sempre gli stessi, per cui l'oggetto Label2.Text non è definito una sola volta, bensì tutte le volte occorrenti, tante quante sono le linguette, via via generate:
Public Sub _new(vTbParIn As Variant[]) ' costruttore della Form07.class
---- bla ---- bla _--- bla ----
For i = 1 To vDatiTabStrip[0]
CarTabStripCorr(i)
Next
---- bla ---- bla _--- bla ----
End
Private Sub CarTabStripCorr(NumScheda As Integer)
---- bla ---- bla _--- bla ----
If NumScheda = 1 Then
ix = 0
Else
ix = (NumScheda - 1) * 17
Endif
If vDatiTabStrip[ix + 1] <> 999999999 Then
AggiungiScheda(NumScheda) 'inserisce la nuova linguetta
------------------------------------------------------------------------- Le prossime istruzioni sono uno stralcio del metodo impiegato per la valorizzazione di alcune delle proprietà degli oggetti --------------------------------------------------------------------------------- contenuti in una linguetta della Tabstrip
IdCassa.Text = vDatiTabStrip[ix + 1] ' IdMovvgg
iCoVoce = vDatiTabStrip[ix + 2]
EditNumCto = New EdtNumCto(iCoVoce)
CoVoceCassa.Text = EditNumCto.$NuVoCto
$DtCalend = Str(vDatiTabStrip[ix + 3])
DtCont.Text = Right($DtCalend, 2) & "." & Mid($DtCalend, 5, 2) & "." & Left($DtCalend, 4) ' DtCoMovg
ProMovim.Text = vDatiTabS
---- bla ---- bla _--- bla ----
End
Private Sub AggiungiScheda(inuProSk As Integer)
'-----------------------------------------------------------
With TabSchede
.Count = inuProSk + 1 'aggiungo una nuova scheda
.Index = .Count - 1 'predispongo l'azione sulla nuova scheda
.Text = "Sk n." & CStr(inuProSk)
End With
'-------------------------- disegno oggetti relativi al movimento di Cassa
With Label2 = New Label(TabSchede) As "Label2"
.X = 30
.Y = 8
.Width = 80
.Height = 24
.Alignment = 1 'Left
' .Alignment = 3 'Center
.Font.Name = "Sans Serif"
.Font.Size = 11
.Text = "Codice Id"
End With
With IdCassa = New TextLabel(TabSchede) As "IdCassa"
.X = 32
.Y = 29
.Width = 62
.Height = 24
.Background = iColorFondo
.Alignment = 3 'Center
.Border = 2 'Sunken
.Font.Name = "Sans Serif"
.Font.Size = 10
.Font.Bold = True
End With
---- bla ---- bla _--- bla ----
End
Quindi, per tornare alla tua riflessione, Tutte le linguette contengono una label chiamata Label2 ed una TextLabel chiamata IdCassa.
Considerando, perciò, che la TabStrip è un array grafico e considerando che tutti le linguette contengono una TextLabel.IdCassa, riportante sempre lo stesso ordine gerarchico, ho cercato di capire come individuare quella appartenente ad una delle linguette già disegnate e definite via codice. Mi è tornata in aiuto la documentazione interattiva di Gambas, relativa alla proprietà Index dove si legge:
Property Index As Integer
Returns or sets the index of the current tab.
Ho perciò creduto di potere indirizzare sia in lettura che in scrittura/aggiornamento una linguetta impostando l valore della proprietà .Index su di essa.
Io credo benissimo di sbagliare qualcosa, ma non ho capito come e dove. Forse, ora che ho riportato un pò più di codice,. potrete illustrarmi più dettagliatamente la corretta soluzione.
;D
@ vuot
Si scusa, non mi ero accorto. L'approntamento delle nuove istruzioni mi sta prendendo troppa attenzione e mi sfuggono le cose più lampanti.
Comunque, ora che ho visto il tuo suggerimento
For Each ob In TabStrip1[TabStrip1.Index].Children
Select Case Object.Type(ob)
Case "TextLabel"
ob.Foreground = Color.Red
Case "Label"
ob.Text = "Nuovo testo"
End Select
Next
non mi pare che faccia al caso mio, perchè andrebbe a modificare tutte le label e tutte le Textlabel della linguetta attiva.
Grazie lo stesso.
credo che il problema non risieda nel funzionamento di TabStrip, ma nella gestione degli oggetti.
Con il tuo codice crei un dato numero di oggetti identici a cui assegni lo stesso nome, posizionandoli in diverse Tab del contenitore TabStrip.
Ora quando selezioni la Tab con TabStrip.Index = index, effettivamente quella Tab viene attivata, ma il comando per impostare il testo della label o il colore della textlabel, agiscono sull'ultimo oggetto , label o textlabel, instanziato dall'istruzione NEW, poichè il puntatore interno agli oggetti è impostato su quello.
In pratica per agire sugli oggetti della Tab attiva dovresti, dopo aver creato la nuova tab e le nuove Label o TextLabel:
Public Sub Button1_Click()
Dim o As Object
tbs1.Index = 0
For Each o In tbs1[0].Children
If (String.Comp(o.Name, "idcassa", gb.IgnoreCase) = 0) Then
o.Text = "idcassa"
Else If (String.Comp(o.Name, "label2", gb.IgnoreCase) = 0) Then
o.BackGround = Color.Red
Endif
Next
End
quando selezioni la Tab con TabStrip.Index = index, effettivamente quella Tab viene attivata, ma il comando per impostare il testo della label o il colore della textlabel, agiscono sull'ultimo oggetto , label o textlabel, instanziato dall'istruzione NEW, poichè il puntatore interno agli oggetti è impostato su quello.
???
Può darsi che io sia limitato, ma, dal mio punto di vista, non posso dire che Gambas sia intuitivo.
In pratica il codice che mi hai proposto è simile a quello già suggeritomi da vuott. Ho adeguato il mio criterio di puntamento alla vostra soluzione e, a parte qualche piccolo dettaglio da affinare, sono riuscito ad ottenere l'effetto, secondo me, più opportuno per i miei scopi.
Riporto per completezza il codice aggiunto:
For Each oggetto In TabSchede[TabSchede.Index].Children
Select Case Object.Type(oggetto)
Case "MsgNoTrov"
Case "IconMsgErro"
Case "Label15"
oggetto.Text = "M O V I M E N T I C A N C E L L A T I"
Case "Label16"
oggetto.Enabled = False
oggetto.Visible = False
Case Else
oggetto.Enabled = False
End Select
Next
Grazie a tutti e due per le vostre miratissime e, come sempre, corrette soluzioni.
Riporto per completezza il codice aggiunto:
For Each oggetto In TabSchede[TabSchede.Index].Children
Select Case Object.Type(oggetto)
Case "MsgNoTrov"
Case "IconMsgErro"
Case "Label15"
oggetto.Text = "M O V I M E N T I C A N C E L L A T I"
Case "Label16"
oggetto.Enabled = False
oggetto.Visible = False
Case Else
oggetto.Enabled = False
End Select
Next
Scusa, ma non capisco :-\ come da questa istruzione:
tu possa aspettarti risultati come quelli che hai inserito: "MsgNoTrov", "IconMsgErro", "Label15", "Label16".
Il metodo Object.Type() non restituisce il Nome dell'oggetto, bensì il nome della Classe dell'oggetto.
Infatti, se io pongo su un Form tre Label (Label1, Label2, Label3), ed inserisco questo codice:
Public Sub Form_Open()
Dim ob As Object
For Each ob In FMain.Children
Print Object.Type(ob)
Next
End
in console avrò semplicemente questo risultato:
Label
Label
Label
:rolleyes:
Certo è che la TabStrp mi sta impegnando oltremodo. Non immaginavo di dovere soffrire tanto per modificare qualche proprietà al suo interno. Comunque in gran parte è andata. Dopo i vostri suggerimenti e l'ultima osservazione di vuott, ho cercato di entrare ancor più nel merito di codesto oggetto. Avevo notato qualche imperfezione nell'esecuzione in prova, ma non mi ero potuto soffermare sull'anomalia intravista, anomalia che rispecchiava perfettamente l'osservazione di vuott.
Tutte le linguette della mia TabStrip, riportano al loro interno gli stessi oggetti. Essi, a loro volta, sono organizzati in insiemi più piccoli come Panel e Frame e la modifica di alcune propietà come Text e Picture mi hanno dato veramente fiolo da torcere. Oggi ho quasi risolto; devo ancora modificare la picture di un controllo pictureBox, interna all'unica Frame della linguetta.
A maggioor chiarimento di quanto fatto ed ancora da fare allego il file con le immagini della linguetta in modifica. La prima è l'immagine congelata prima del richiamo della procedura di modifica, la seconda è quella ottenuta dopo l'esecuzione delle istruzioni relative:
Dim oObj As Object
Dim oObj1 As Object
Dim $Grigio40 As String = "&H008F8F8F&" 'Grigio 40%"
Dim iColorSfo As Integer
Dim vNmFrame As Variant
Dim vNome As Variant
For Each oObj In TabSchede[indSk].Children
Select Case Object.Type(oObj)
Case "Frame"
iColorSfo = Val($Grigio40)
oObj.Background = iColorSfo
vNmFrame = Object.GetProperty(oObj, "Name")
For Each oObj1 In oObj.Children
Select Case Object.Type(oOBj1)
Case "Label"
vNome = Object.GetProperty(oObj1, "Name")
If vNome = "Label15" Then
Object.SetProperty(oObj1, "Text", "R E C O R D S C A N C E L L A T I")
Else
vNome = Object.GetProperty(oObj1, "Name")
If vNome = "Label16" Then
oObj1.Enabled = False
oObj1.Visible = False
Endif
Endif
Case Else
vNome = Object.GetProperty(oObj1, "Name")
Object.SetProperty(oObj1, "Picture", "Picture.Load(user.home" & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png)")
End Select
Next
Case Else
oObj.Enabled = False
End Select
Next
Non riesco ancora a capire come agire per caricare una nuova picture al posto di quella già attiva. Ricevo sempre l'errore
Type mismatch: wanted Picture, got String instead
:ciao:
....devo ancora modificare la picture di un controllo pictureBox, interna all'unica Frame della linguetta.
.....
Case Else
vNome = Object.GetProperty(oObj1, "Name")
Object.SetProperty(oObj1, "Picture", "Picture.Load(user.home" & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png)")
End Select
Non riesco ancora a capire come agire per caricare una nuova picture al posto di quella già attiva. Ricevo sempre l'errore
Type mismatch: wanted Picture, got String instead
Ma se fai più semplicemente così ?
...
...
Case Else
oObj1.Picture = Picture.Load("/percorso/del/file/immagine")
End Select
@ vuott:
Hp provato come hai proposto:
oObj1.Picture = Picture.Load("user.home" & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png")
Io non ci avevo pensato, tuttavia non ha funzionato. Ora il messaggio di errore è diventato:
Unable to load Picture
Ho provato anche con:
Dim vPictureLoad As Variant = "Picture.Load(user.home" & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png)"
---- bla ---- bla ----
Object.SetProperty(oObj1, "Picture", vPictureLoad)
É però ritornato il messaggio di errore precedente:
Type mismatch: wanted Picture, got String instead
A questo punto penso che opterò per creare un secondo oggetto pictuireBox, con l'assegnazione della nuova immagine, che attiverò quando mi servirà al posto di quella iniziale, anche se la soluzione non è brillante. ;)
:rolleyes:
...
For Each oObj1 In oObj.Children
Select Case Object.Type(oOBj1)
Case "Label"
vNome = Object.GetProperty(oObj1, "Name")
If vNome = "Label15" Then
Object.SetProperty(oObj1, "Text", "R E C O R D S C A N C E L L A T I")
Else
vNome = Object.GetProperty(oObj1, "Name")
If vNome = "Label16" Then
oObj1.Enabled = False
oObj1.Visible = False
Endif
Endif
Case Else
vNome = Object.GetProperty(oObj1, "Name")
Object.SetProperty(oObj1, "Picture", "Picture.Load(user.home" & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png)")
End Select
Next
Case Else
oObj.Enabled = False
End Select
Next
credo anche che, per semplificare il codice, tu possa scrivere:
Dim oObj As Object
...
For Each oObj In Me.Controls
Select Case oObj.Name
Case "Label15"
Object.SetProperty(oObj, "Text", "R E C O R D S C A N C E L L A T I")
...
End Select
Next
per quanto riguarda la picture:
Dim vPictureLoad As String = User.Home &/ "mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png""
...
Case "pic1"
Object.SetProperty(oObj, "Picture", Picture.Load(vPictureLoad))
tieni presente che la variabile User.Home viene tradotta nel percorso della home dell'utente, ma se la inserisci all' interno di una stringa non viene tradotta:
User.Home = /home/emanuele
"User.Home" = User.Home
Relativamente alle istruzioni suggerite
1. da vuott: oObj1.Picture = Picture.Load(vPictureLoad)
2. da sotema: Object.SetProperty(oObj1, "Picture", Picture.Load(vPictureLoad))
[/quote]
vi confermo che funzionano entrambi. Per completezza riporto la riga di dichiarazione della Dim...variant:
Dim vPictureLoad As Variant = user.home & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png"
Ora va tutto bene.
credo anche che, per semplificare il codice, tu possa scrivere:
Dim oObj As Object
...
For Each oObj In Me.Children
Select Case oObj.Name
Case "Label15"
Object.SetProperty(oObj, "Text", "R E C O R D S C A N C E L L A T I")
...
End Select
Next
Codesto codice invece non funziona, perchè considera solamente gli oggetti a livello elementare contenuti nella Form; quindi,
TabSchede senza tutti i livelli sottostanti, partire dalle linguette aggiunte durante l'esecuzione del programma,
PulsAnnull
per quanto riguarda la picture:
Dim vPictureLoad As String = User.Home &/ "mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png""
...
Case "pic1"
Object.SetProperty(oObj, "Picture", Picture.Load(vPictureLoad))
tieni presente che la variabile User.Home viene tradotta nel percorso della home dell'utente, ma se la inserisci all' interno di una stringa non viene tradotta:
User.Home = /home/emanuele
"User.Home" = User.Home
Relativamente alle istruzioni suggerite
1. da vuott: oObj1.Picture = Picture.Load(vPictureLoad)
2. da sotema: Object.SetProperty(oObj1, "Picture", Picture.Load(vPictureLoad))
vi confermo che funzionano entrambi. Per completezza riporto la riga di dichiarazione della Dim...variant:
Dim vPictureLoad As Variant = user.home & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png"
Ora va tutto bene.
credo anche che, per semplificare il codice, tu possa scrivere:
Dim oObj As Object
...
For Each oObj In Me.Children
Select Case oObj.Name
Case "Label15"
Object.SetProperty(oObj, "Text", "R E C O R D S C A N C E L L A T I")
...
End Select
Next
Codesto codice invece non funziona, perchè considera solamente gli oggetti a livello elementare contenuti nella Form; quindi,
TabSchede senza tutti i livelli sottostanti, partire dalle linguette aggiunte durante l'esecuzione del programma,
PulsAnnull
per quanto riguarda la picture:
Dim vPictureLoad As String = User.Home &/ "mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png""
...
Case "pic1"
Object.SetProperty(oObj, "Picture", Picture.Load(vPictureLoad))
tieni presente che la variabile User.Home viene tradotta nel percorso della home dell'utente, ma se la inserisci all' interno di una stringa non viene tradotta:
User.Home = /home/emanuele
"User.Home" = User.Home
[/quote]
...scusa mi sono corretto in ritardo ...For Each oObj In Me.Controls
:-[
Relativamente alle istruzioni suggerite
1. da vuott: oObj1.Picture = Picture.Load(vPictureLoad)
2. da sotema: Object.SetProperty(oObj1, "Picture", Picture.Load(vPictureLoad))
[/quote]
vi confermo che funzionano entrambi. Per completezza riporto la riga di dichiarazione della Dim...variant:
Dim vPictureLoad As Variant = user.home & "/mont/dativari/Gambas3/Gambas3_Progetti/Gambas_progetti.miei/TestDbContabFam/draw-eraser.png"
Ora va tutto bene.
credo anche che, per semplificare il codice, tu possa scrivere:
Dim oObj As Object
...
For Each oObj In Me.Children
Select Case oObj.Name
Case "Label15"
Object.SetProperty(oObj, "Text", "R E C O R D S C A N C E L L A T I")
...
End Select
Next
Codesto codice invece non funziona, perchè considera solamente gli oggetti figli della Form; quindi,
TabSchede senza tutti i livelli sottostanti, a partire dalle linguette aggiunte durante l'esecuzione del programma,
PulsAnnull
PulsLeggiNext
PulsCancMov
Vengono ignorati e quindi non interrogati tutti i livelli discendenti di TabSchede. Pertanto, non posso semplificare, anche se mi piacerebbe, il codice che sono riuscito a scrivere in maniera definita ieri, grazie al Vostro preziosissimo aiuto.
:ciao:
Dim oObj As Object
...
For Each oObj In Me.Children
Select Case oObj.Name
Case "Label15"
Object.SetProperty(oObj, "Text", "R E C O R D S C A N C E L L A T I")
...
End Select
Next
Codesto codice invece non funziona, perchè considera solamente gli oggetti figli della Form; quindi,
TabSchede senza tutti i livelli sottostanti, a partire dalle linguette aggiunte durante l'esecuzione del programma,
PulsAnnull
PulsLeggiNext
PulsCancMov
Vengono ignorati e quindi non interrogati tutti i livelli discendenti di TabSchede. Pertanto, non posso semplificare, anche se mi piacerebbe, il codice che sono riuscito a scrivere in maniera definita ieri, grazie al Vostro preziosissimo aiuto.
:ciao:
[/quote]
sostituisci la prima riga del ciclo For Each con:
For Each oObj In Me.Controls
e funziona. Scusa l'errore. :-[
@ sotema:
ho provato :
For Each oObj In Me.Controls
Select Case oObj.Name
Case "Label15"
Object.SetProperty(oObj, "Text", "R E C O R D S C A N C E L L A T I")
End Select
Next
Si, funziona, ma, come ho capito leggendo il codice, vengono modificate le Label15.Text contenute in tutte le linguette della TabStrip.
Dobbiamo sempre tenere presente che le modifiche riguardano esclusivamente le linguette dentro le quali viene premuto il botton PulsCancMov, quindi va benissimo quanto già definito precedentemente.
Comunque grazie! Sei stato di grandissimo aiuto. Inoltre il tuo ultimo suggerimento potrebbe sempre tornare utile in una prossima occasione, ed in ogni caso, non solo a me.
:D :ciao: