Newsgroup: it.comp.lang.visual-basic
Titolo: strutture in VB .NET

Mi sembra di ricordare di aver già affronatto (e non risolto) il 
problema. Quindi lo propongo ancora :
esiste un metodo 'immediato' (senza passare una settimana in rete a 
cercare dei 'trucchi' di serializzazione) per ottenere quello che con 
VB6 si poteva ottenere in due millisecondi, cioé una 'struttura' di 
questo tipo :
define type Tizio
   ciccio as String*60
   pippo  as Integer
   pluto  as double
   paperino as long
   sempronio as Boolean
end type
Dim Caio as Tizio
e poi io leggo un file binmario con
Read (file) Caio
e lui mi legge tutta la struttura che potrò indirizzare come
Caio.ciccio, Caio.pippo  etc.
Esiste in VB .NET una cosa simile o un modo per ottenere questo 
facilmente ??
Perchè se non esiste, mi incazzo a morte.

 questo tipo
In realtà la serializzazione non c'entra, basta imparare ad usare il BinaryReader/Writer... se lo vuoi fare alla vecchia maniera, con i metodi di compatibilità, vedi:
http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/50d7b930-edd3-4ba4-92fe-2c16e5235e51

 
http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/50d7b930-edd3-4ba4-92fe-2c16e5235e51
Nell'esempio usa solamente il Random Access method. Io vorrei usare uno 
'stream' sequenziale.


De facto non esiste una alternativa valida paragonabile al vecchio 
'Define Type' del VB6.
IMHO questa potrebbe essere benissimo una buona ragione, per alcuni, di 
abbandonare il VB .NET e passare al C# .NET.


Fa esattamemnte quello che hai scritto nel tuo esempio.
Non ho capito... non sai la posizione/quanti sono e vuoi leggerli tutti?
Basta fare il conto con la lunghezza del record, il codice è comunque quello...

 Basta fare il conto con la lunghezza del record, il codice è comunque quello...
Certamente. E' l'unico modo per poter ottenere quello che si vuole : 
estrarli 'a mano' da una stringa.
Ma non è una soluzione per niente 'elegante' rispeto ad avere una 
struttura, cioè una 'maschera' con la quale cui puoi già ottenre quello 
di cui hai bisogno, senza conversioni.

 estrarli 'a mano' da una stringa.
Eh.... Ma di che stringa parli? hai letto l'esempio che ti ho linkato?
Te lo reincollo qui, fa quello che hai chiesto.... invece che prendere i primi due come nel codice di esempio, calcoli quanti sono in base alla lunghezza del file vs lunghezza struttura e li puoi leggere tutti in un ciclo o quello che prefereisci, ottenendo tante istanze del tipo 'ExampleStructure' già piene.... dove l'hai vista 'sta stringa?!?:
--------------------------
Option Strict Off
Option Explicit On
Option Infer Off
Imports Microsoft.VisualBasic
Public Class Form1
 Public Structure ExampleStructure
  <VBFixedString(10)> Public name As String
  Public telNumber As System.Int64
 End Structure
 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Button1.Text = "Save."
  Button2.Text = "Load."
 End Sub
 'Button that SAVEs two records.>>
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim ex1 As New ExampleStructure
  With ex1
   .name = "Fred"
   .telNumber = 5551234567
  End With
  Dim ex2 As New ExampleStructure
  With ex2
   .name = "Barney"
   .telNumber = 5551234568
  End With
  FileOpen(1, My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\ExampleFile.dat", OpenMode.Random, OpenAccess.Write, OpenShare.LockWrite, Len(ex1))
  Dim recordNumber As Integer
  recordNumber = 1
  'Put record Ex1 >>
  FilePut(1, ex1, recordNumber)
  recordNumber = 2
  'Put record Ex2 >>
  FilePut(1, ex2, recordNumber)
  FileClose(1)
 End Sub
 'Button that LOADs two records.>>
 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  Dim tempRecord As New ExampleStructure
  Dim recordLength As Integer = Len(tempRecord)
  Dim fileLength As Long = FileLen(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\ExampleFile.dat")
  MessageBox.Show("recordLength = " & recordLength.ToString)
  MessageBox.Show("fileLength = " & fileLength.ToString)
  Dim numberOfRecords As Integer = Convert.ToInt32(fileLength \ recordLength)
  MessageBox.Show("Number of records found = " & numberOfRecords.ToString)
  Dim aFileRecord As New ExampleStructure
  FileOpen(1, My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\ExampleFile.dat", OpenMode.Random, OpenAccess.Read, OpenShare.LockRead, recordLength)
  'Get record 2 1st.>>
  FileGet(1, aFileRecord, 2)
  MessageBox.Show("Name = " & aFileRecord.name & " " & "Tel: " & aFileRecord.telNumber.ToString)
  'Get record 1 2nd.>>
  FileGet(1, aFileRecord, 1)
  MessageBox.Show("Name = " & aFileRecord.name & " " & "Tel: " & aFileRecord.telNumber.ToString)
  FileClose(1)
 End Sub
End Class

 Imports Microsoft.VisualBasic
Ah, beh, così sono capaci tutti :-PPPP
Bye, G. 

   End Sub
FileGet e Put con la chiave è un accesso Random e non è quello che voglio.
Io ho una stream sequenziale.
Ho risolto leggendo col BinaryReader  col comando br.ReadChars(n) per 
ogni variabile.
Non esistono altri modi 'intelligenti e immediati' per leggere una 
stream 'facilmente'.
Altrimenti bisogna andare ad importare i 'compatibility' classes e non 
ne ho voglia.
NON ESISTE un metodo facile e immediato come il vecchio Define Type del VB6.
E questa è una grave mancanza che mi ha giá semiconvinto ad abbandonare 
il Visual basic dopo 15 anni che lo uso, in favore magari del C# o anche 
peggio, del C++ .NET, che almeno è portabile.
Peccato perchè ci ero affezionato.
Ma alla prossima cosa abbastanza seria di cui 'sento la mancanza'
abbandonerò definitivamente il Visual Basic.


...si fa più presto a deinstallare il VB .NET e reinstallare il VB6.....


cancella il C++ .NET che non è portabile con niente (a meno di non 
sviluppare solo applicazioni 'console'...)

 ne ho voglia.
L'ho ben detto fin dall'inizio che se la volevi "facile" ti toccava usare i metodi di compatibilità... 
Come si dice qua "sciuscià sciurbi' nu se peu!"

 Come si dice qua "sciuscià sciurbi' nu se peu!"
sci, ma mi sun 'vissiou' e veuggiu restaghe... :-)))

 ha scritto:

Magari traducete per gli abitanti dell'italico stivale :D 


okay, a beneficio degli 'stivaloni' :
sciuscia e sciourbi nu se peu = soffiare e succhiare non si puo'
  (contemporaneamente)
sci ma mi sun vissiou = sì ma io sono viziato
e veuggiu restaghe = e così voglio restare.

 
La ringrazioe :D