Newsgroup: it.comp.lang.visual-basic
Titolo: [?] OCX e Proprietà complesse

Salve a tutti.
Vorrei creare un controllo con delle proprietą simili alla proprietą "List" delle Listbox, ovvero del tipo:
MioOCX.MiaProp(Indice).Valore
Ho provato a definire una struttura chiamata "Pippo" (anche pubblica in un modulo standard) e:
Public Type Pippo
	Valore As String
End Type
Public Property Get MiaProp(Indice As Integer) As Pippo
Public Property Let MiaProp(Indice As Integer, ByVal NewValue As Pippo)
ma non mi permette di impostare come tipo di dati di una proprietą, una struttura.
Dov'č che sbaglio?
Come si fa ad ottenere il risultato voluto?
Grazie anticipatamente a tutti.
Ciao,
Moreno
#sirri#@
morenosoft.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
Home Page - 
http://www.geocities.com/SiliconValley/Bridge/1414/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------


Prova così:
Public Property Get MiaProp(ByVal  Indice As Integer) As Pippo
Public Property Let MiaProp( ByVal NewValue As Pippo, ByVal Indice As Integer)
In pratica, prima, quando scrivevi
MiaProp(i) = pipPippo
i doveva essere una struttura Pippo, pipPippo un Integer, il che faveva arrabbiare VB per ben due motivi...
L'unico problema serio potrebbe consistere nel fatto che il passaggio di strutture in metodi pubblici è una
funzionalità nuova di VB6. Non so se in VB5 sia permesso almeno in metodi Private... Ma se usi VB6 non
dovrebbero esserci problemi.
Fammi sapere... la mia è pura teoria.
Flavio Ronco
--
f.ronco@*NonMiServeNiente*
flashnet.it
http://www.metabrains.com
  [Under Construction]
-------------------------------------------------------------
"Che pubblico in gamba! Se ci dite dove lavorate,
domani mattina se abbiamo tempo vi veniamo a vedere"
[Paolo Rossi]

Public Property Let MiaProp( ByVal NewValue As Pippo, ByVal Indice As Integer)
non permette altri parametri


P.S.2 Io non taglio né incollo, ma uso gli OCX... ;->
^____^
Era una battuta comunque..... solo che non ho messo le faccine: speriamo che nessuno la prenda male....


 non permette altri parametri
Che gnocco!! Scusa! ti ho confuso le idee, in effetti era giusto  l'ordine precedente. Tutto funziona bene se
non utilizzi strutture... Non sono riuscito a capire bene quand'è che una struttura può essere passata come
argomento, l'help è poco chiaro in proposito. In ogni caso, negativo dichiarare la struttura e assegnarla come
tipo a una property. Puoi invece creare un modulo oggetto che implementa la struttura, quello è sicuro che si
può passare come argomento o come tipo restituito da Property. E' un espediente mangiarisorse, comunque.
Xcuse
Flavio
--
P.S. Come sta l'istanza Fufy? :-)
P.S.2 Io non taglio né incollo, ma uso gli OCX... ;->
f.ronco@*NonMiServeNiente*
flashnet.it



Risolto un corno... :-(((((
OK, non c'è più l'errore nella dichiarazione, ma....
Private NonnaPapera(10) as MiaType
Private Type MiaType
	pippo as string
	pluto as string
	paperino as string
End Type
Public Property Get prova(index As Integer) As MiaType
	prova(index)=NonnaPapera(index)
End Property
'Ma qui sotto sta l'errore:
Public Property Let prova(index As Integer, vNewValue As MiaType)
	NonnaPapera(Index) = vNewValue
	PropertyChanged "prova"
End Property
Infatti, se io scrivo:
prova(2).pippo = "Ciao"
vNewValue è uguale a "Ciao" e di conseguenza è di tipo stringa, non MiaType.....
Ma come faccio a sapere quale item della struttura ho modificato nella proprietà?
Ovvero, come faccio a sapere che ho cambiato la proprietà "pippo" e non "pluto"?
Ragionando così, l'unica cosa che ho capito è che la definizione della Property Let non va bene, ma non riesco a capire
come fare....
Ma porca miseria, non era più facile, invece di usare le Property, dichiarare NonnaPapera come Public e non se ne parla
più????
Qualche altro suggerimento?
TIA


...


     end with
...vabbè, qui ho sbagliato qualcosina; ovviamente al posto di .pippo.
.pluto, ecc. devi mettere i nomi delle properties così come le hai definite
nelle Property Let della classe clsPersonaggi, che saranno diversi dai nomi
usati per le variabili private :-)
(a meno che non le dichiari direttamente Public, ma questo è a tua
discrezione)
In quanto alle PropertyChanged non dovrebbe essere difficile adattarle al
caso (se non ho capito male, vorresti implementare un .OCX (e non
semplicemente un EXE o DLL ActiveX), magari con la possibilità di immettere
la lista di stringhe anche design-time)
Fammi sapere se ci ho preso o ho sparato frescacce :->
Saluti

 semplicemente un EXE o DLL ActiveX), magari con la possibilitą di


...ripensando bene a tutta la faccenda, visto che (da quello che ho capito)
la lista dovrebbe essere una *proprietà* del tuo controllo, e non il
controllo stesso, la soluzione più elegante (sempre che funzioni pure :)
potrebbe essere implementare le due classi clsPersonaggi e
clsElencoPersonaggi come PublicNotCreatable, e il tuo controllo in un terzo
modulo di classe:
### implementazione classe ctlControlloDiMoreno ###
Private ListaPersonaggi As clsElencoPersonaggi
'tutte le altre variabili, proprietà, metodi del tuo controllo
'.........................
Private Sub UserControl_Initialize()
    Set ListaPersonaggi = New clsElencoPersonaggi
End Sub
Private Sub UserControl_Terminate()
    Set ListaPersonaggi = Nothing
End Sub
Public Property Get Personaggi() As clsElencoPersonaggi
'proprietà di sola lettura
    Set Personaggi = ListaPersonaggi
'potresti abilitare la scrittura della proprietà
'solo in fase di progettazione, utilizzando
'delle property page
End Property
Per accedere alla list, così, utilizzeresti la "classica" sintassi:
QuestoControllo.Personaggi.Item(3).Pippo = ...
oppure, se hai definito Item come membro predefinito per la classe
clsElencoPersonaggi, più semplicemente:
QuestoControllo.Personaggi(3).Pippo = ...
______________________________________________________
Se vorrai cimentarti in questo modo, magari guarda se riesci a scrivere la
proprietà Personaggi nell'evento WriteProperties (io non ci sono riuscito
:->  )
Visto che PropBag.WriteProperty "Personaggi", ListaPersonaggi non me lo
accettava, ho provato anche a dichiarare Friend Property Get Lista nella
classe clsElencoPersonaggi, che restituisse la collezione (che è una classe
fornita da VBA e non user-define), e poi ho messo
PropBag.WriteProperty "Personaggi", ListaPersonaggi.Lista
nell'evento WriteProperties di UserControl, ma me lo rifiuta lo stesso :-(
Sarei curioso di sapere come fa VB a salvare la proprietà List di un
ListBox sul file .frm, quando la lista di stringhe viene riempita dirett.te
in fase di progettazione....
....(il resto alla prossima puntata)
P.S.
Piccolo errore ;) (nel post precedente, e in quello ancora prima): Add è
una sub e non una Function della classe collection (chissà perché mi era
venuta la strana idea che fosse una function..)