Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Usercontrol: passare udt

Ciao a tutti!
Sono alle prime armi con gli usercontrol, e ho un paio di domande:
1) Devo creare un metodo al quale passare come argomento un tipo dati
definito dall'utente (UDT), ma mi da' sempre errore: come risolvere il
problema? Ho vb5Sp3, forse cambia qualcosa con vb6?
2) Vorrei fare in modo che il mio controllo "esponga" delle costanti: ad
esempio, nell'evento Error da me generato, vorrei scrivere qualcosa del
genere:
Sub Error(ErrorCode as long)
    if ErrorCode=errErrore1 then ....
End Sub
Come fare in modo che, inserendo il controllo sulla form, errErrore1 venga
reso disponibile a tutto il progetto?
Grazie a tutti per le dritte e per l'attenzione!
Marco

genere:
Penso che tu ti riferisca ai tipi di enumerazione.
Vedi Enum nell'help.
I valori di Enum sono in realtà dei Long, però se usi il loro tipo VB ti
espone la lista dei valori da te elencati.
Ciao

Con VB6 non cambia, il perchè è semplice. COM non supporta gli udt.
ma scherzi? guarda, hai presente il controllo CoolBar? Common Controls 
versione 6, pacchetto numero 3? espone pubblicamente un metodo che 
accetta un tipo definito dall'utente, non solo, esporta persino la 
definizione di quel tipo. Reggiti forte, la notizia è che quel controllo 
è scritto in VB6. Controlla pure se non ci credi. Linkato a msvbm60.dll, 
la finestra principale è una ThunderUserControl, i pannelli sono delle 
ThunderPicture, eccetera. Quindi non solo COM usa i tipi definiti 
dall'utente (chiamiamoli record, vi prego...), ma anche VB (il 6, il 5 
no). Te lo posso assicurare per averlo provato di persona

 no).
La verità è questa:
- COM può usare gli UDT, ma non li gradisce tanto.
- VB6 dice di poterli usare in tutto e per tutto ma mente :)
Fino al service pack 3 diceva che si potevano passare come tipo restituito
da
metodi pubblici di una classe, ma non c'è mai stato verso di poterlo fare.
Devo però confessare che non ho mai avuto tempo di riprovarci col SP4 e SP5.
Chissà, magari l'hanno sistemata sta cosa (ci credo poco) :)
Byee
Zeross

no). Te lo posso assicurare per averlo provato di persona
Allora spiegami come, perchè proprio io non ci riesco (VB6 + SP3)
Ciao

Allora spiegami come, perchè proprio io non ci riesco (VB6 + SP3)
beninteso, potrei sbagliarmi perchè VB non lo tocco nè lo vedo da 
settembre scorso, sette lunghi mesi, ma ricordavo che VB 6 me lo 
permetteva, al contrario di VB 5


E Hyperion ha colpito ancora :)
Sono andato a cercare la documentazione perche anch' io ricordavo cosi'.
In effetti sulla solita msdn
INFO: Visual Studio 6.0 SP3 Readme: Part 3 - Visual Basic 
ID: Q230726 
si dice:
Controls Issues
The following Controls issues have been fixed: 
[snippone]
"An automation error would occur in Visual Basic 6.0 if you ran a compiled .Exe 
with a UserControl containing a public User-Defined Type (UDT). "
e  nell' articolo
HOWTO: Remote User-Defined Types 
ID: Q185700 
"SUMMARY
Visual Basic 6.0 allows you to have a User-defined type (UDT) as an argument or return type 
of public properties and methods in an ActiveX code component. 
This article shows some examples of the different ways you can pass or receive a UDT. "
Non ho provato, ma dalla documentazione pare sia possibile utilizzare
udt (record :) in metodi e proprieta' pubblici.
Affinche' funzioni, occorre pero' avere una versione recente di COM.
Riporto questo da un articolo del dr. GUI del 30 marzo _1999_
"Coming soon to a computer near you: records, aka user-defined data types (UDTs)
We're almost done. If you've studied COM Automation before, you've probably not seen 
the next two data types. 
They were added relatively recently.
The first of these is a type to handle records, aka user-defined data types (UDTs).
         struct __tagBRECORD {
            PVOID pvRecord;
            IRecordInfo * pRecInfo;
         } __VARIANT_NAME_4; /* VT_RECORD */
   } __VARIANT_NAME_3; // union
} __VARIANT_NAME_2; // struct __tagVARIANT
(note underscores)
Note that the last two lines are the closing braces for the union 
and for the whole variant structure. 
You can ignore VARIANT_NAME_1 through VARIANT_NAME_4
(they're defined as nothing), 
or as dummy names if your compiler can't handle unnamed unions and structs 
nested in other structs and unions.
The data for a UDT (or record) includes a pointer to the data and a pointer to the 
UDT's IRecordInfo interface
(in essence, a miniature type library for the members of the record). 
(You don't need to worry much about IrecordInfo. 
It's mainly used if you're implementing language support for UDTs.) 
If you're using C/C++, you can access the data through the data pointer cast to 
the appropriate struct type. MIDL will generate the struct declaration for you. 
Otherwise, you'll access the record through whatever mechanism your language implements, 
such as the Visual Basic's UDT types.
VT_RECORD is useful for passing Visual Basic UDTs to other Visual Basic components 
and for passing structures between C++ and Visual Basic; 
it's not currently useful for scripting languages. 
And the feature is only implemented in the most recent version of Visual Basic. 
It also requires a very recent version of COM (Windows 98, Windows 95 with DCOM95 1.2, 
or Window NT 4.0 with Service Pack 4), 
so you won't be able to use this feature unless you know your users have both the correct OS 
and the correct Visual Basic run time.
I'm going to skip talking more about this for now because it's not yet documented
(although it will be documented within a few months)
Complimenti a Hyperion, si vede che ha studiato :)
ciao, hal