Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Subdolo (ma noto) bug con le classi

Mi riallaccio ad alcuni quesiti che ho già posto al NG per chiedere lumi su
un bug che non capisco.
Ho creato una classe CPoligono (che una volta
era una Type e le cose erano più semplici :-)) ) per disegnare, appunto,
dei poligoni.
Per sfruttare le funzioni API ho dotato la classe di una
proprietà Pt di tipo POINT_TYPE per definire le coordinate dei vertici del
poliogono:
Type POINT_TYPE_DOUBLE
  x as double
  y as double
End
Type
Sfruttando il suggerimento del buon Luce Dormio ho definito la
proprietà Pt in una coppia di Property che riporto:
Public Property Get
Pt (ByVal Index As Long) _
As POINT_TYPE_DOUBLE
    If Index <
LBound(m_Pt) Or Index > UBound(m_Pt) Then
        Err.Raise 9 ' Subscript
out of range
    Else
        Pt = m_Pt(Index)
    End If
 
End
Property
Public Property Let Pt(ByVal Index _
As Long, NewValue As
POINT_TYPE_DOUBLE)
    If Index < LBound(m_Pt) Or Index > UBound(m_Pt)
Then
        Err.Raise 9 ' Subscript out of range
    Else
m_Pt(Index) = NewValue
    End If
End Property
Nel codice che usa la
classe (un form all'interno della stessa applicazione EXE ActiveX Stand
Alone) ho scritto:
Private Poligono(1 To MAX_POLIGONI) as CPoligono
Private Sub Command1_Click()
  numPoligoni = numPoligoni + 1
  Set
Poligono(numPoligoni) = New CPoligono
  ' Esempio di assegnazione delle
coordinate
  Poligono(numPoligoni).Pt(1).x = 10
Poligono(numPoligoni).Pt(1).y = 20
End Sub
Qui compare il bug. Quando
tento di assegnare il valore 10 alla coordinata x del primo vertice (Pt(1))
del Poligono(numPoligoni) mi parte la routine Property Get invece della
Property Let.
Si tratta di un comportamento, credo, noto, di cui parla
anche il buon F.Balena nel suo libro su VB6 (del quale peraltro ho solo la
versione "portatile" dei Miti Informatica di Mondadori).
Per risolvere il
problema ho dovuto riscrivere il codice client in questo modo:
Private
Sub Command1_Click()
Dim XY As POINT_TYPE_DOUBLE
  numPoligoni =
numPoligoni + 1
  XY.x = 10
  XY.y = 20
  Set Poligono(numPoligoni) =
New CPoligono
  Poligono(numPoligoni).Pt(1) = XY
End Sub
Così
funziona. Ma ovviamente perdo gran parte dei vantaggi che si ottengono
dall'uso di una classe CPoligono in al posto di una struttura analoga. Se
il client deve gestire decine di poligoni con molti vertici l'utilizzo di
una variablile di passaggio come la XY che ho definito complica in modo
indecoroso il codice.
Daltra parte in questo modo posso creare dei metodi
Draw, Move, Rotate, Invert, Zoom, ecc. per la classe CPoligono, usando le
API, che sono potentissimi e mi permettono di usare oggetti di classe
CPoligono su Picture, Printer, Form, ecc. con la massima libertà (così come
posso creare oggetti cerchio, ellisse, linea, ecc., del tutto simili).
Non
ho capito molto di come si possa risolvere il piccolo bug in modo
"elegante".
Un grazie per qualunque chiarimento!
(Mi scuso ancora per
"l'impaginazione" dei miei post, ma scrivo dal sito di Libero/Arianna che è
l'unico posto dove posso accedere ai NG senza che i filtri del server
aziendale mi becchino!)
Ciao
-- 
Giorgio
--------------------------------
Inviato via 
http://usenet.iol.it

 Property Let.
Non si tratta di un bug: è giusto questo comportamento perchè tu non stai
assegnando il valore alla proprietà Pt ma alle proprietà x e y (che nel tuo
codice sono semplici variabili) dell'oggetto Pt.
Se x e y fossero implementate come proprietà, vedresti partire la routine
Property Let delle proprietà x e y, ma per accede a tali proprietà devi
comunque ottenere l'oggetto Pt (ossia devi passare per la Property Get, come
fa correttamente il Visual Basic).
In definitiva, se vuoi il comportamento che ti aspettavi, POINT_TYPE_DOUBLE
dovrebbe essere una classe e non una struttura, ed al suo interno avere le
proprietà x e y.
Spero di essere stato abbastanza chiaro. Ciao

Spero di essere stato abbastanza chiaro. Ciao
Sì, Grazie! Non è
che mi dai qualche altra dritta?
Ad esempio non ho ben chiaro dove
conviene mettere il Set della proprietà Pt (di classe CPointDouble)
all'interno del codice della classe CPoligono.
Ciao!


 all'interno del codice della classe CPoligono.
Scusa ma non ho capito cosa intendi con "dove".

Scusa ma non ho capito
cosa intendi con "dove".
In effetti la domanda non era ben posta!
Il
"dove" si è risolto scrivendo bene le Property Get/Set della proprietà
Pt(Indice) e utilizzandola come ho scritto sopra.
Grazie ancora!
Ciao
