Newsgroup: it.comp.lang.visual-basic
Titolo: Property LET tipo

Ciao a tutti.
Premetto di aver letto molti post simili su google ma non ho ancora
trovato la soluzione.
Nella finestra del codice di un contollo ActiveX ho:
Private MatTipo1() as Tipo1
Public Type Tipo1
    Campo1 As Integer
    Campo2 As String
End Type
Public Property Get Elenco(Index As Integer) As Tipo1
    Elenco= MatTipo1(Index)
End Property
Public Property Let Elenco(Index As Integer, newVal As Tipo1)
        MatTipo1(Index) = newVal
End Property
Adesso quando richiamo da un progetto exe il seguente codice
dim Test AS Tipo1, Index as integer
Test=MioControllo.Elenco(1)
Test.Campo1=3
Test.Campo2="ccc"
MioControllo.Elenco(1)=Test
Quest'ultima riga mi da il seguente errore: "Tipo non corrispondente"
Se invece creo nel controllo una sub come questa (identica alla LET):
Public SUB Asegna(Index as integr, newVal a Tipo1)
      MatTipo1(Index) = newVal
end sub
e la richiamo dal programma col seguente codice
MioControllo.Assegna 1, Test
Non ho errori.
Qualcuno mi sa aiutare?
Ciao a tutti.

 Quest'ultima riga mi da il seguente errore: "Tipo non corrispondente"
Perchč le property Let per gli oggetti diventano Property Set (chi ha
pensato 'sta roba doveva essere un nostalgico di QBasic)
Ciao
--
Reporting tool: 
http://www.neodatatype.net

Utilizzando Properety Set mi dice:
"Le definizioni della routine Property per la stessa proprietà non
sono coerenti o la routine Property include un parametro facoltativo,
PAramArray o un parametro finale set non valido"
Io in effetti gli passo un prametro (l'indice della matrice). Ma allora
come si fa?
Public Property Set Elenco(Index As Integer, newVal As Tipo1)
        MatTipo1(Index) = newVal 
End Property 
Ciao e Grazie.

 Ciao e Grazie.
Sembra che in un Usercontrol non sia proprio possibile avere delle property (con
o senza indice) il cui tipo č un UDT.
Anche altri hanno incontrato questa limitazione:
http://news.devx.com/showthread.php?t=136600
Non ho trovato perň la motivazione, ma solo qualche workaround:
- utilizzare una sub anziché la property let
- utilizzare una classe anziché un UDT
- definire la proprietŕ come Variant
etc...
Bye
Raf

 
http://news.devx.com/showthread.php?t=136600
No, si può.
Basta che l'UDT sia pubblico.
Cioè basta definirlo come Public in cima a un modulo di classe pubblico.
Se la classe è privata nel progetto non dovrebbero esserci limitazioni.


 Adesso quando richiamo da un progetto exe il seguente codice
[snip]
ho provato, a me funziona ma ho dovuto aggiungere questo:
Private Sub Class_Initialize()
     ReDim MatTipo1(5) As Tipo1
End Sub
bye
r

 Cioè basta definirlo come Public in cima a un modulo di classe pubblico.
Ma richiamandolo da un altro progetto non funziona, nemmeno spostando la
definizione in un modulo di classe (ci avevo già provato).
Il problema deve essere nel marshaling delle proprietà di un Usercontrol...
In un progetto "ActiveX Control"
--- Classe "Class1" ---
Public Type MyType
    MyField As String
End Type
--- UserControl "MyControl" ---
Public Property Let MyProp(t As MyType)
    ' Non fa NULLA quindi non può dare errore qui
End Property
In un altro progetto EXE:
--- Form "Form1" ----
Disegna un MyControl "MyControl1"
Private Sub Form_Load()
Dim t As MyType
    MyControl1.MyProp = t    <---- Run-time error "Type mismatch"
End Sub
Ciao
Raf

 Il problema deve essere nel marshaling delle proprietà di un
Usercontrol...
Ma se io lo faccio continuamente? :)
Anzi, per scrupolo ho appena provato e confermo che funziona perfettamente:
Basta un copia/incolla secco:
--- nella classe ---
Option Explicit
Public Type t
    t As Long
End Type
Public Property Let SetT(val As t)
    ' ***
End Property
---
--- nel form dell'altro progetto ---
Private Sub Command1_Click()
    Dim t1 As t
    Dim c1 As Class1
    Set c1 = New Class1
    c1.SetT = t1
End Sub
---
La classe è di tipo multiuse?


 --- nella classe ---
[CUT]
Ok, non mi sono spiegato bene...
Se la *proprietà* è definita in un modulo di classe funziona (e lo so).
È invece quando la definisci in un UserControl che dà l'errore a runtime.
Indipendentemente da dove definisci l'UDT.
Ciao
Raf

 Indipendentemente da dove definisci l'UDT.
Infatti non avevo capito.
In effetti è molto strano... uno usercontrol non dovrebbe essere diverso da
una classe.
