Newsgroup: it.comp.lang.visual-basic
Titolo: PRB, anche se mi rendo conto che non è banale.

Devo rifare un ocx (con VB6) nato originariamente in VC++ al quale diversi
sorgenti VB fanno riferimento. Quindi, l'aggiornamento deve essere tale che
non implichi la revisione di tutti i sorgenti che lo usano.
ho questa difficoltà: I'OCX (CTL) precedente ha questa proprietà:
..
..
Campo=CTL1.myField(2)  ' Prende il valore del campo 2 in un DB
..
..
CTL1.MyField(2)="B"        ' Assegna al campo 2 del DB il valore "B"
..
..
In pratica il valore "2" è variabile e potrebbe essere un numero qualsiasi.
Ho cercato in giro per le documentazioni ma non trovo niente che mi consenta
di implemetare la proprietà fatta in questo modo.
Ho pensato a collections, a semplici array, ma in entrambi i casi non è
semplice lettura e scrittura di un valore... devono essere eseguite delle
operazioni.
Che fare?
Fabio Guerrazzi

 wrote in message 7rbgmu$g9j$1...@serv1.iunet.it...

Cerca nei books on line di VB la spiegazione di "collection class", dovrebbe
fare al caso tuo.
--
Roal Zanazzi
z...@iol.it

E' vero, la Collection Class è quella che più di tutti mi permette di
assegnare e leggere un valore con queste modalità di accesso, ma non di
eseguire operazioni. In pratica, comunque è vista come variabile, non come
Property, Sub o Function in cui posso eseguire del codice. Senz'altro farò
così, ma è una pezza, non la soluzione. Ad esempio in questo caso
CTL1.MyField(2)="B"
se il valore 2 è x devo fare una cosa, se è y un'altra. Così come
l'assegnazione "B"
Mi sa che non c'è via di scampo.
Ti ringrazio comunque dell'attenzione.
Fabio Guerrazzi

 così, ma è una pezza, non la soluzione.
Stai programmando in VB: quella E' la soluzione, anche se sembra una pezza!
;-)
--
Roal Zanazzi
z...@iol.it

 Fabio Guerrazzi
Le properties accettano un indice (anzi, per meglio dire, argomenti multipli),
passato dal codice chiamante, di modo che se il client chiama:
ctlControllo.Proprietà(i)
viene passato l'indice i alla routine property del controllo, permettendo di
eseguire le normali operazioni di assegnazione.
Qualche tempo fa ci fu un thread dedicato a questo, e ricordo che c'era un
problema, ma mi pare riguardasse il passaggio di user type, e si tratta quindi
di altra sostanza. Se la proprietà restituisce semplici valori numerici, stringa
o oggetti non dovresti avere problemi.
Per la sintassi, consulta l'help: "Corrispondenza tra argomenti di coppie di
routine Property"
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]

OTTIMO!.  In effetti questa è la soluzione. Ti ringrazio perché
probabilmente non ci sarei mai arrivato, continuavo a considerare le
collection solo come un ListBox virtuale,  o un modo alternativo all'uso di
array.
Grazie ancora.
Fabio

Rettifico..ho riprovato e.. NON SI PUO' FARE!!
CTL1.fld(2)="B"
come dici tu con il 2 accedo all'item della collection class. L'item è una
classe e posso fare quello che voglio. Quindi posso controllare il valore
"B". NON POSSO CONTROLLARE IL VALORE 2, in quanto
se è numerico, è l'ID dell'item , se è una stringa è la Key dell'item.
Forse non sono stato chiaro, ma io, nella property o sub o function  dovrei
controllare sia il valore 2 sia il valore "B"
Es:.
Sub Fld(idx as Long, Value as String)
    if Idx = 2 Then
     ....
   Else
     ...
  Endif
   if Value = "B" Then
     ....
   Else
     ...
  Endif
End Sub
Come faccio a costruire la proprietà di un OCX che faccia questo?
Qui l'esempio è semplice, ma considera che il valore 2 può essere anche
50000 e di queste proprietà ne ho diverse.
Fabio Guerrazzi


Forse ti è sfuggito il mio messaggio (visto che non mi hai detto se il mio
metodo fa cilecca o no...).
Ti quoto il testo:
    Le properties accettano un indice (anzi, per meglio dire, argomenti
multipli),
    passato dal codice chiamante, di modo che se il client chiama:
    ctlControllo.Proprietà(i)
    viene passato l'indice i alla routine property del controllo, permettendo
di
    eseguire le normali operazioni di assegnazione.
    Qualche tempo fa ci fu un thread dedicato a questo, e ricordo che c'era un
    problema, ma mi pare riguardasse il passaggio di user type, e si tratta
quindi
    di altra sostanza. Se la proprietà restituisce semplici valori numerici,
stringa
    o oggetti non dovresti avere problemi.
    Per la sintassi, consulta l'help: "Corrispondenza tra argomenti di coppie
di
    routine Property"
Sicuro che non funzioni?
Prova un po':
Public Property Let Fld(Idx As Long, Value As String)
    If Idx = 2 Then
        ....
    Else
        ...
    End If
    If Value = "B" Then
         ....
    Else
        ...
    End If
End Property
E nella chiamata:
    tngMyThing.Fld(21534) = "B"
Dovresti ritrovarti 21534 in Idx e "B" in Value.
Allo stesso modo, potresti avere n indici, a patto che il valore da passare
(quello a destra del segno "=") sia quello più a destra nella definizione della
property. Ovviamente, nella definizione avrai n + 1 variabili.
Non ti rimane che provare, provare, provareprovareprovareprovareprovare... ;-)
Ciao


Che hai fatto sul mio PC? :-)
io avevo provato, provato, provatoprovatoprovatoprovatoprovato...
e l'assegnazione multipla mi diceva "incongruenza tra tipi di dati dello
stesso tipo per l'assegnazione ec... ecc.."
Non ho considerato il tuo thread perché appunto avevo già provato e mi dava
errore. Probabilmente ero incappato in quel giro virtuoso in cui ne provi
talmente tante che poi ti incasini e lasci bugs da tutte le parti.
Fatto sta, che, vista la tua insistenza, ho riprovato, con un pò di calma...
e FUNGE.
Quindi graziegraziegraziegraziegraziegraziegraziegraziegraziegraziegrazie
per l'insistenza.
Fabio Guerrazzi