Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Da String a UDT.

Quando mi capita di aver bisogno di assegnare una stringa agli elementi di
una struttura mi comporto cosi':
Type udtTemp
  s As String * 5
End Type
Type udtStruttura
  s1 As String * 2
  s2 As String * 3
End Type
Dim s               As String
Dim udtMiaTemp      As udtTemp
Dim udtMiaStruttura As udtStruttura
  Let s = ...
  Let udtMiaTemp.s = s
  LSet udtMiaStruttura = udtMiaTemp
C'e` un sistema migliore?
--
Ciao.
Maurizio
http://www.murialdo.it/it_lang_vb
Sito Comune di news:it.comp.lang.visual-basic

  Let udtMiaTemp.s = s
  Intanto, credo tu sia l'unico al mondo che usa ancora l'istruzione
Let :-) poi l'uso di una stringa temporanea puo' essere saltato
assegnando direttamente la variabile s del type udtMiaTemp oppure
usando direttamente una normale stringa di dimensione fissa dichiarata
cosi':
Dim s As String * 5
  in modo da evitare inutili appesantimenti.
  Ciao :-)
  Massimo
  Nell'indirizzo, inserire una "h" tra la "t" e la "u"
  In the address, insert an "h" between the "t" and the "u"

   in modo da evitare inutili appesantimenti.
Riformulo cio` che dici per verificare se ho capito:
Type udt
  s1 As String * 2
  s2 As String * 3
End Type
Dim s As String * 5
  ...
  Let udt = s
Quest'ultima riga interrompe la compilazione con l'errore "Tipo non
corrispondente". Anche con LSet. E mi sembra anche giusto. Ma forse ho
capito male.
Grazie.


 C'e` un sistema migliore?
Bene. E` andata! Grazie a tutto il ng presente con ottimi interventi su
www.deja.com
.
Private Declare Sub CopyMemory Lib "kernel32" _
  Alias "RtlMoveMemory" ( _
    ByVal lDest As Long _
  , ByVal lSource As Long _
  , ByVal lLength As Long)
Type udtStruttura
  s1 As String * 2
  s2 As String * 3
End Type
Dim s               As String
Dim udtMiaStruttura As udtStruttura
  Let s = ...
  Call CopyMemory( _
    VarPtr(udtMiaStruttura), StrPtr(s), Len(udtMiaStruttura))
... ma temo che con VB4 dovro` usare ancora il vecchio sistema.


capito male.
  Infatti, non puoi assegnare un valore alla udt tout court, bensi'
continuare ad utilizzare le sue variabili ovvero:
LSet udt.var = s


 LSet udt.var = s
Scusami, ma a questo punto mi sfugge il senso del tuo intervento.
--
Ciao.
Maurizio

Perché?
(VB4)
Declare Sub hmemcpy Lib "Kernel" (hpvDest As Any, hpvSource As Any, ByVal
cbCopy&)
Ciao,
Corrado

Scusami, ma a questo punto mi sfugge il senso del tuo intervento.
  Tu passavi per un'altra UDT ed io non ne capivo il motivo.


 cbCopy&)
Grazie ma non funziona. Faccio cosi`, e dimmi se c'e` qualcosa che non va:
Type udt5
  s1 As String * 2
  s2 As String * 3
End Type
Dim s As String, udt As udt5
  Let s = "ABCDE"
  hmemcpy(udt, s, Len(udt))
E riassumo brevemente il problema: leggo in s una riga di testo da un file;
in base alla lunghezza di s so se caricare, per es., la struttura udt5 o
udt10 (due tracciati record differenti). Chiaramente posso risolvere
rileggendo la riga ed assegnandola al tracciato corretto, ed il mio problema
e` risolto!
Mi chiedevo pero`, visto che ho l'informazione in s, come fare, senza
accedere nuovamente al file, ad assegnarla alla opportuna struttura con una
istruzione, sintatticamente scorretta, del tipo:
  Select Case Len(s)
    Case Is = 5
      Let udt5 = s  ' oppure LSet
    Case Is = 10
      Let udt10 = s ' c.s.
  ...


Dovento passare un puntatore alla stringa,ovviamente s deve essere passata
ByVal.
Private Declare Sub hmemcpy Lib "Kernel" (hpvDest As Any, hpvSource As Any,
ByVal cbCopy&)
Private Type udt5
  s1 As String * 2
  s2 As String * 3
End Type
Private Sub Command1_Click()
Dim s As String, udt As udt5
s = "ABCDE"
hmemcpy udt, ByVal s, Len(udt)
Debug.Print udt.s1, udt.s2
End Sub
Ciao,
Corrado

 hmemcpy udt, ByVal s, Len(udt)
"Bad DLL calling convention".


Il codice che ho postato l'ho copiato direttamente dall'IDE di VB4 (NT4.0
Sp4) e ti assicuro che funziona.
Verifica il declare della funzione API.
Ciao,
Corrado