Differenze tra le versioni di "Proprietà ReadOnly dell'Array (proprietà di sola lettura)"

Da Gambas-it.org - Wikipedia.
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 5: Riga 5:
  
  
== Vediamo il motivo per cui è stata introdotta questa nuova prprietà: ==
+
== Vediamo il motivo per cui è stata introdotta questa nuova proprietà: ==
  
  
Riga 12: Riga 12:
 
  gb.desktop
 
  gb.desktop
 
e diamo OK.
 
e diamo OK.
<BR>In Sorgenti del progetto aggiungiamo una nuova classe che nomineremo '''CType'''.<BR>
+
<BR>In ''Sorgenti'' del progetto aggiungiamo una nuova classe che nomineremo '''CType'''.<BR>
  
<BR>Ora per prima cosa ci accertiamo che una proprietà di sola lettura lo sia veramente, per farlo scriviamo questo codice in CType.class:
+
<BR>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
 +
e diamo tab, cioè agiamo sul tasto ''Tab'' della tastiera.
 
prr si trasformerà in:
 
prr si trasformerà in:
 
  Property Read Name As Type
 
  Property Read Name As Type
con ''Name'' evidenziato, scriviamo ''sCar'' e diamo ancora tab il Name si trsforma 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:
+
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   
 
  Private Function sCar_Read() As String   
 
+
 
  End
 
  End
 
e appena sotto "Property Read sCar As String" uno spazio bianco che riempiamo con la dichiarazione:
 
e appena sotto "Property Read sCar As String" uno spazio bianco che riempiamo con la dichiarazione:
Riga 32: Riga 33:
  
 
  Public Sub _new()
 
  Public Sub _new()
 
+
 
   $sCar = "FERRARI"
 
   $sCar = "FERRARI"
 
+
 
  End
 
  End
  
Alla fine la vostra classe CType si presenterà così:
+
Alla fine la nostra classe CType si presenterà così:
  
 
  Property Read sCar As String
 
  Property Read sCar As String
 
  Private $sCar As String
 
  Private $sCar As String
 
+
 
  Private Function sCar_Read() As String
 
  Private Function sCar_Read() As String
 
+
 
   Return $sCar
 
   Return $sCar
 
+
 
  End
 
  End
 
+
 
  Public Sub _new()
 
  Public Sub _new()
 
+
 
   $sCar = "FERRARI"
 
   $sCar = "FERRARI"
 
+
 
  End
 
  End
  
Riga 67: Riga 68:
  
 
  Public Sub Main()
 
  Public Sub Main()
 
+
 
   Dim hType As New CType
 
   Dim hType As New CType
 
+
 
   hType.sCar = "TOPOLINO"
 
   hType.sCar = "TOPOLINO"
 
+
 
  End
 
  End
  
Come detto si genererà l'errore, il che dimostra non essere possibile assegnare valori diversi a una proprietà di sola lettura.
+
Avviamo il progetto.
 +
<BR>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:
 
Torniamo alla classe '''CType''' e cambiamone il codice aggiungendo ''sType'' una proprietà di tipo vettore, seguendo la stessa procedura già vista per sCar:
Riga 83: Riga 85:
  
 
  Private Function sType_Read() As String[]
 
  Private Function sType_Read() As String[]
 
+
 
   Return $sType
 
   Return $sType
 
+
 
  End
 
  End
  
Alla routine _new() aggiungiamo:
+
Alla routine ''_new()'' aggiungiamo:
  
 
   $sType = New String[]
 
   $sType = New String[]
Riga 100: Riga 102:
  
 
  Public Sub _new()
 
  Public Sub _new()
 
+
 
   $sCar = "FERRARI"
 
   $sCar = "FERRARI"
 
   $sType = New String[]
 
   $sType = New String[]
Riga 108: Riga 110:
 
   $sType.Push("Ordine dei byte = " & System.ByteOrder)
 
   $sType.Push("Ordine dei byte = " & System.ByteOrder)
 
   $sType.Push("Versione di Gambas = " & System.FullVersion)
 
   $sType.Push("Versione di Gambas = " & System.FullVersion)
 
+
 
  End
 
  End
  
Riga 114: Riga 116:
  
 
  Public Sub Main()
 
  Public Sub Main()
 
+
 
   Dim hType As New CType
 
   Dim hType As New CType
 
+
 
   ' È commentato perché non è possibile assegnare
 
   ' È commentato perché non è possibile assegnare
 
   ' valori a una proprietà di sola lettura.
 
   ' valori a una proprietà di sola lettura.
Riga 122: Riga 124:
 
   Print hType.sCar
 
   Print hType.sCar
 
   Print "-------"
 
   Print "-------"
 
+
 
   hType.sType.Push("Cippa = Lippa")
 
   hType.sType.Push("Cippa = Lippa")
 
   For Each s As String In hType.sType
 
   For Each s As String In hType.sType
 
     Print s
 
     Print s
 
   Next
 
   Next
 
+
 
  End
 
  End
  
 
Avviamo il programma, '''funziona'''!.
 
Avviamo il programma, '''funziona'''!.
<BR>Ma come non avevamo appena dimostrato che a una proprietà di sola lettura non si possono assegnare valori?
+
<BR>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()'' questa riga:
+
<BR>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
 
   $sType.ReadOnly = True
  
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:
+
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.
 +
<BR>Ecco alla fine il codice corretto della procedura Main:
  
 
  Public Sub Main()
 
  Public Sub Main()
 
+
 
   Dim hType As New CType
 
   Dim hType As New CType
 
+
 
   ' È commentato perché non è possibile assegnare
 
   ' È commentato perché non è possibile assegnare
 
   ' valori a una proprietà di sola lettura.
 
   ' valori a una proprietà di sola lettura.
Riga 147: Riga 165:
 
   Print hType.sCar
 
   Print hType.sCar
 
   Print "-------"
 
   Print "-------"
 
+
 
   ' È commentato perché non è possibile assegnare valori
 
   ' È commentato perché non è possibile assegnare valori
 
   ' a un'array con attivata la proprietà di sola lettura.
 
   ' a un'array con attivata la proprietà di sola lettura.
Riga 154: Riga 172:
 
     Print s
 
     Print s
 
   Next
 
   Next
 
+
 
  End
 
  End

Versione attuale delle 07:55, 27 nov 2019

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