Proprietà ReadOnly dell'Array (proprietà di sola lettura)
Esiste dalla versione 3.14
Restituisce o imposta se il contenuto dell'array è di sola lettura.
Attenzione: Una volta impostata, questa proprietà non può essere ripristinata.
In altre parole, rendere un vettore di sola lettura è definitivo.
Vediamo il motivo per cui è stata introdotta questa nuova proprietà:
Creiamo un progetto a riga di comando (Command-line application), e in Progetto > Proprietà > Componenti aggiungiamo spuntandoli:
gb.gui gb.desktop
e diamo OK.
In Sorgenti del progetto aggiungiamo una nuova classe che nomineremo CType.
Ora per prima cosa ci accertiamo che una proprietà di sola lettura lo sia veramente, per farlo scriviamo questo codice in CType.class:
prr
e diamo tab, cioè agiamo sul tasto Tab della tastiera. prr si trasformerà in:
Property Read Name As Type
con Name evidenziato, scriviamo sCar e diamo ancora tab, il Name si trasforma in sCar e si evidenzia Type che cambiamo in String, a questo punto agiamo sul tasto Invio per far apparire automaticamente nella classe la funzione:
Private Function sCar_Read() As String End
e appena sotto "Property Read sCar As String" uno spazio bianco che riempiamo con la dichiarazione:
Private $sCar As String
All'interno della funzione scriviamo:
Return $sCar
Aggiungiamo questa routine alla classe:
Public Sub _new() $sCar = "FERRARI" End
Alla fine la nostra classe CType si presenterà così:
Property Read sCar As String Private $sCar As String Private Function sCar_Read() As String Return $sCar End Public Sub _new() $sCar = "FERRARI" End
Fatto.
Ora spostiamoci nel modulo Main e al posto di Print "Hello world" scriviamo:
Dim hType As New CType
Ora scriviamo un codice per tentare di cambiare il nome dell'automobile (car) che genererà l'errore di Sola lettura:
hType.sCar = "TOPOLINO"
Questo è come appare al momento il codice del modulo Main:
Public Sub Main() Dim hType As New CType hType.sCar = "TOPOLINO" End
Avviamo il progetto.
Come detto si genererà l'errore, il che dimostra non essere possibile assegnare valori diversi a una proprietà di sola lettura.
Torniamo alla classe CType e cambiamone il codice aggiungendo sType una proprietà di tipo vettore, seguendo la stessa procedura già vista per sCar:
Property Read sType As String[] Private $sType As String[]
Si accoderà la nuova funzione in cui andremo a scrivere il return:
Private Function sType_Read() As String[] Return $sType End
Alla routine _new() aggiungiamo:
$sType = New String[] $sType.Push("Desktop = " & Desktop.Type) $sType.Push("Nome User = " & System.User.Name) $sType.Push("Nome Host = " & System.Host) $sType.Push("Ordine dei byte = " & System.ByteOrder) $sType.Push("Versione di Gambas = " & System.FullVersion)
In modo che alla fine il codice sarà:
Public Sub _new() $sCar = "FERRARI" $sType = New String[] $sType.Push("Desktop = " & Desktop.Type) $sType.Push("Nome User = " & System.User.Name) $sType.Push("Nome Host = " & System.Host) $sType.Push("Ordine dei byte = " & System.ByteOrder) $sType.Push("Versione di Gambas = " & System.FullVersion) End
Ritorniamo al modulo Main e cambiamo il codice commentando e aggiungendo così:
Public Sub Main() Dim hType As New CType ' È commentato perché non è possibile assegnare ' valori a una proprietà di sola lettura. ' hType.sCar = "TOPOLINO" Print hType.sCar Print "-------" hType.sType.Push("Cippa = Lippa") For Each s As String In hType.sType Print s Next End
Avviamo il programma, funziona!.
Ma come, non abbiamo appena dimostrato che a una proprietà di sola lettura non si possono assegnare valori?
Per quanto riguarda le array questo vale solo se abbiamo attivato la nuova proprietà ReadOnly, facciamolo aggiungendo alla sub _new() di CType questa riga:
$sType.ReadOnly = True
Ecco come apparirà alla fine la routine _new() di CType:
Public Sub _new() $sCar = "FERRARI" $sType = New String[] $sType.Push("Desktop = " & Desktop.Type) $sType.Push("Nome User = " & System.User.Name) $sType.Push("Nome Host = " & System.Host) $sType.Push("Ordine dei byte = " & System.ByteOrder) $sType.Push("Versione di Gambas = " & System.FullVersion) $sType.ReadOnly = True End
Solo ora se lanciamo l'applicazione otterremo l'errore "Array di sola lettura", e se vogliamo che il codice funzioni occorre commentare l'assegnazione.
Ecco alla fine il codice corretto della procedura Main:
Public Sub Main() Dim hType As New CType ' È commentato perché non è possibile assegnare ' valori a una proprietà di sola lettura. ' hType.sCar = "TOPOLINO" Print hType.sCar Print "-------" ' È commentato perché non è possibile assegnare valori ' a un'array con attivata la proprietà di sola lettura. ' hType.sType.Push("Cippa = Lippa") For Each s As String In hType.sType Print s Next End