Newsgroup: it.comp.lang.visual-basic
Titolo: lezione... passaggio di oggetti

Ciao,
sto cercando di studiare con un po' piu' di metodo degli argomenti che
fino ora ho solo visto di passaggio.
Ieri notte ho cominciato a pensare alle interfacce, ho piu' o meno
compreso la loro utilita' ed ho cominciato a pensare di scrivere un po' di
codice per assimilare il concetto.... ma di questo ci occuperemo fra
qualche "puntata".
La prima cosa che mi e' venuta in mente e' quella di scrivere una classe
che, ricevendo degli oggetti, li elaborasse... pensa e pensa, perche' non
fare una semplice classe che ridimensiona gli oggetti in base alla
risoluzione dello schermo? Lo so che sul sito comune c'e' gia' qualche
cosa di fatto - e bene - pero' riesco a capire bene le varie tecniche
soltanto mettendomi al pc e provando!
Apro un form, ci metto su un TextBox, una Label e un commandbutton
Scrivo anche la classe clsResize come:
Dim Ratio as Long
-----
Public fResize (ByRef ToResizing as Object)
    Ratio = 2
    ToResizing.Top = ToResizing.Top * Ratio
    ToResizing.Left = ToResizing.Left * Ratio
    ToResizing.Height = ToResizing.Height * Ratio
    ToResizing.widht = ToResizing.Width * Ratio
End Sub
Nel codice client, nell'evento Activate del Form
    Dim cResize as clsResize
    Set cResize = New clsResize
    cResize.fResize (Me)
Eseguendo questo piccolo codice, quando nella routine fResize viene letta
la seconda riga (ToResizing.Top = ToResizing.Top * 2), il compilatore mi
restituisce l'errore di run-time 438
propieta' o metodo non supportato dall'oggetto.
Inoltre, chiamando dalla finestra immediata, 
? TypeName(ToResizing) 
la risposta e':
Object
Domanda per questa prima lezione....
che cavolo ho passato al metodo fResize della classe?
Io mi aspettavo di aver passato un oggetto di tipo "form", che puntava al
form della mia applicazione e dunque, che accettasse le proprieta' top,
left ecc...
Beh, dato che avete avuto la pazienza di leggere fino qui, vi chiederei
una piccola spiegazione :-)
Ciao e grazie... Maurizio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio 
news:dnc20c$ao5$1...@news.newsland.it...
[taglio]
In seguente da me funziona:
Public Sub fResize(ByVal ToResizing As Form, ratio As Long)
    ToResizing.Top = ToResizing.Top * ratio
    ToResizing.Left = ToResizing.Left * ratio
    ToResizing.Height = ToResizing.Height * ratio
    ToResizing.Width = ToResizing.Width * ratio
End Sub
Private Sub Form_Activate()
Dim cResize As clsResize
    Set cResize = New clsResize
    cResize.fResize Me, 2
End Sub
Propabilmente,
 per modificare le dimensioni dell'oggetto
č meglio che il modificatore sappia di quale oggetto si parli.
Ave
giuseppeD
---CCR

 una piccola spiegazione :-)
secondo me hai sbagliato a scrivere qualcosa, usi option explicit?
ciao!

     cResize.fResize (Me)
Bravo; ricordati anche dei controlli del form, e dei loro font :)
--
Greg

 che cavolo ho passato al metodo fResize della classe?
Ecco un'altro che cade nell'abisso dei refusi di VB e delle proprietà
predefinite.
Usare le parentesi senza la Call equivale *più*o*meno* (nel tuo caso un po'
"meno") a passare l'argomento ByVal.
Il problema nasce quando questo sistema viene usato con oggetti: VB si mette
in testa che tu vuoi passare la proprietà predefinita, che per i form credo
sia "Caption" o "Name".
E questo per quanto riguarda il merito.
Per il metodo, mi pare un inizio un po' farlocco.
Io semplicemente doterei la classe di una Sub Init(Form f) (in VB6 non
esistono i costruttori parametrizzati) dove tu ti fai un giro su f.Controls
e ti salvi le posizioni e le dimensioni di tutti i controlli, form compreso,
e poi un metodo Resize() dove in base alle nuove dimensioni del form
ridimensioni i vari controlli.
Cosa c'entri tutto questo con le interfacce poi, è da vedere :)
Ciao
--
Reporting tool: 
http://www.neodatatype.net

 č meglio che il modificatore sappia di quale oggetto si parli.
...
Boh, a voi funziona, io che lo ho scritto non ci riesco :-)
Vabbe', c'e' qualche cosa scritto male.
Cio' pero' mi fa ben sperare... il concetto era giusto.
Per quel che riguarda il siggerimento, vorrei evitare di specificare di
che oggetto si tratta, altrimenti non potrei passare alla stessa procedura
il form, i controlli, i maglioni che non mi vanno piu' ecc.
Il concetto che sto cercando di capire e studiare (correggetemi, tanto
sicuramente sbaglio), e' che in questo modo il compilatore dovrebbe
utilizzare il late binding (non sa che oggetto viene passato, non sa come
trattarlo).
Lo step successivo e' quello di implementare delle interfacce per evitare
il decadimento di prestazioni dato dal l.b.
Ho detto qualche cosa di giusto?


 secondo me hai sbagliato a scrivere qualcosa, usi option explicit?
...
Si, sempre da quando ho scoperto quanto fa risparmiare tempo :-)
Boh, controllero'.


 Bravo; ricordati anche dei controlli del form, e dei loro font :)
...
Si, certo, pensavo ad un ciclo for each con tutti i controlli, e nella
classe gestire anche tutti gli oggetti che non supportano determinate
proprieta' (ad esempio .caption ad un oggetto linea....), ma per questo
dovrebbe essere sufficiente un On Error Resume Next


 Cosa c'entri tutto questo con le interfacce poi, č da vedere :)
...
Piano piano :-)))
Come ho scritto, immagino che il passare "oggetti" generici alla classe,
costringa il compilatore a lavorare in Late Binding.
Se ho capito qualche cosa (ma ancora e' tutto in dubbio), l'uso di
interfacce dovrebbe permettere di risolvere il problema del Late Binding e
lavorare con l'Early..... ho detto qualche cosa di giusto?


 Ciao e grazie... Maurizio
Questo è "solo" un effetto collaterale dell'uso delle interfacce, ma non è
il motivo del loro utilizzo.
Nel tuo progetto, se ho capito cosa vuoi fare (da quello che mi dici ho
qualche dubbio :) ), devi definire un'interfaccia, ad es. IResizable, il
form o gli oggetti che vorrai ridimensionare dovranno implementare
quest'interfaccia e la tua classe dovrà esporre un metodo con IResizable
come parametro.
Ciao

 come parametro.
...
Aspe', aspe'.
Il form e i controlli devono implementare l'interfaccia? Non e' la classe
clsResize che deve farlo?
Cioe'.... la parolina chiave 
Implements IResizable
dove la mettiamo?
Ciao e grazie.... Maurizio
