Newsgroup: it.comp.lang.visual-basic
Titolo: Classi e collection

Ciao a tutti.
Sto scrivendo una applicazione "tentando" di utilizzare i famosi tre
strati...
Ho creato una classe CUtente che mi permette di manipolare gli utenti
della mia applicazione.
In un form vorrei inserire una combo che mi faccia comparire tutti gli
utenti presenti.
Per fare ciň volevo utilizzare una collection (piů per sperimentazione
che per altro), ma non ho la piů pallida idea di come fare.
Qualche delucidazione in merito?
Grazie
Aran Banjo
<math> 2 + 2 = 5 for sufficiently large values of 2</math>

 Qualche delucidazione in merito?
vb6 o 
vb.net
 ?
--
Salutoni
Sergio

vb6 o 
vb.net
?
ops, scusami.
VB6


 VB6
peccato: in 
vb.net
 č cosě facile che ci riesco anche io, per vb6 sono costretto
a passare.
--
Salutoni
Sergio

 VB6
Dim Collezione as new collection
Dim Ut as CUtente
'Creazione di un nuovo utente
Set Ut=New CUtente
Ut.Nome="Pippo"
Ut.Diritti=12345
'Aggiunta alla collection
Collezione.Add Ut
'Scansione della collection
For Each Ut in Collezione
    Debug.Print Ut.Nome
Next Ut
Ciao
Alberto

[Albe V°] scrisse:
(snip)
caspita, è facile anche in vb6....
--
Salutoni
Sergio

Collezione.Add Ut
Intanto grazie, albe.
Il mio problema, molto probabilmente concettuale in quanto è la prima
volta che uso classi, è che vorrei riempire la combo con tutti gli
utenti, ma non capisco cosa devo implementare nella classe per fare
ciò.
Mi spiego meglio: devo fare in modo che un metodo della classe ritorni
un Recordset e poi nel form ciclare sul recordset???
Un Aran Banjo che non si capisce da solo, figuriamoci a spiegarlo ad
altre persone ;_;
Ciauz


 un Recordset e poi nel form ciclare sul recordset???
Beh, se proprio vuoi usare la Combo collegata ad un recordset, puoi creare
un recordset disconnesso popolandolo con una function (NB: ovviamente è
impossibile farlo con un metodo della stessa classe delle singole istanze,
questo ti è chiaro, giusto? :-))
Però (e questo te lo consiglio per tutto, non solamente per quetsa cosa)
abituati ad utilizzare i controlli senza binding alle sorgenti dati.
Quindi:
'popolo la combo
Dim N as long
N=0
For Each Ut in Collezione
    Combo1.AddItem Ut.Nome & " " & Ut.Cognome
    N=N+1
    Combo1.ItemData(N)=Ut.ID 'numerico
Next Ut
Sul click della combo:
ID_Selezionato=Combo1.ItemData(Combo1.ListIndex)
For Each Ut in Collezione
    if Ut.ID=Id_Selezionato then call Msgbox("Ecco trovato!")
Next Ut
Ciao
Alberto

Aran Banjo wrote:
[CUT]
Infatti non uso combo bindate a Recorset.
Quello che non capisco è come fare in modo che la mia classe estragga
di man in mano solo un record del recordset :(
Tnx


 un Recordset e poi nel form ciclare sul recordset???
definiamo il problema concettualmente
la classe Utente contiene i dati di un solo utente e non di un insieme di
utenti
la classe che contiene l'insieme la chiami UTENTI
ed in questa classe fai cosi
dim insiemeUtenti as collection
public sub addUtente(ut as UTENTE)
insiemeUtenti.add utente
end sub
public sub riepicombo(byref cb as combobox)
For Each Ut in insiemeUtenti
    cb.additem Ut.Nome
Next Ut
end sub
ciao
lorenzo

 di man in mano solo un record del recordset :(
????????????????????
Forse non ci siamo capiti...
Se non usi controlli bound (e confermo che fai bene), a cosa ti serve creare
un recordset???
Non avevi detto che volevi usare una collection?
Ciao
Alberto


 Scusa ma giuro non sto capendo il problema.
puoi cercare di essere piů chiaro ?
ciao

> [CUT]
Il problema č questo:
La mia classe CUtente legge scrive e modifica dati su una tabella di
un DB MySQL attraverso ADO e MyODBC.
Quello che faccio al momento č:
1 - vedere se esiste un utente
2 - scrivere data e ora di accesso di un utente
Ora voglio utilizzare la classe per poter popolare una combo.
Praticamente vorrei fare una cosa del tipo:
For each oUtente in colUTENTI
  cboUtenti.Add oUtente.Nome
Next
Il problema č che non so concettualmente come fare per farmi
restituire record dalla classe man mano che aggiungo nomi alla combo.
Spero di essere stato piů chiaro.
Ciauz


 restituire record dalla classe man mano che aggiungo nomi alla combo.
rs.movefirst
Do while not Rs.Eof
    set Ut=New CUtente
    Ut.Nome=Rs.Fields.Item("Nome").Value
    collezione.Add Ut.Nome
    combo1.AddItem Ut.Nome
    rs.movenext
loop
Ciao
Alberto

 un Recordset e poi nel form ciclare sul recordset???
Generalmente le classi sono 2 ...
-clsUser : oggetto che rappresenta un singolo utente (nome, pwd, Id,
permessi ecc..)
-clsUsers : oggetto che espone una collection che contiene tutti gli oggetti
clsUser creati.
i singoli prog istanziano un oggetto clsUser e richiamano un metodo (della
classe) LogRequet (richiesta di login) passando i propri dati (nome utente e
pwd).
Nella sub dovrai implementare il codice per aggiungere la classe alla
collection esposta da clsUsers.
Ovviamente clsUsers non può essere una dll ax ma deve essere un componente
out of process altrimenti ogni istanza clsUser andrebbe a creare una nuova
istanza di clsUsers ...
Questa è una struttura ad oggetti .. in realtà potresti evitare di usare
clsUser e la collection .. ma te lo sconsiglio
il metodo

Aran Banjo wrote:

ecco, io non vorrei fare una cosa del genere, vorrei che se ne
occupasse la classe a creare il recordset e muoversi di conseguenza.
Tnx e grazie per la pazienza :)
Ciauz
Aran


 Spero di essere stato più chiaro.
Sarà che sono stanco ma faccio fatica.....
cmq prova così
se ho capito bene quello che a te serve è un metodo next
cioe
for i=0 to ut.count ' numero uteni
cb.additem ut.nextUT
next i
per avere un metodo next basta che dichiari una variabile di classe
che serva da indicecorrente
PSeudoCODICE---------------------------
dim currindex as long
dim users as recordset
public sub NextUT() as string
currindex=currindex+1
NetxUT=recordset[currindex].name
end sub
già prima ti ho detto che se fai una classe utente questa contiene i dati di
un utente e concettualmente sbagliato
volere che una classe che deve contenere i dati di uno contenga quelli di
tutti
so due classi diverse
ma forse continuo a non capire una minchia
ciao

 occupasse la classe a creare il recordset e muoversi di conseguenza.
OK.
Allora il punto è un altro: Tu non sai cosa vuoi.
Hai iniziato dicendo di avere già creato la classe, e di voler usare la
collection.
Ma, se hai già creato la classe, dovresti aver capito che la classe delle
singole istanze non può gestire la collection o il recordset con le altre
istanze (te l'ho anche postato prima, per sicurezza).
Quindi ti serve una classe che contenga al suo interno una struttura tipo
collection.
Poi hai iniziato a parlare di recordset per poter usare una combo, poi hai
detto che non usi controlli bound, poi...
Credo che tu debba prima di tutto fermarti e riflettere esattamente su cosa
vuoi.
Poi ne riparliamo
Ciao
Alberto

Allora il punto è un altro: Tu non sai cosa vuoi.
Si, scusami.
Il punto è questo:
Vorrei fare in modo che la classe gestisse tutto quello che riguarda
(nell'esempio) l'utente.
La classe dovrebbe quindi permettermi di:
Aggiungere un utente;
Cancellare un utente;
Dire se un utente esiste o meno;
Darmi la lista degli utenti;
etc....
Per aggiungere, cancellare e verificare l'esistenza non è un grosso
problema (un po' di controlli, AddNew, Cancel e via), ma non capisco
se concettualmente è corretto restituire un recordset per avere la
lista degli utenti o se devo fare in un altro modo.
Ho pensato ad una collection (la prima cosa che mi è venuta in mente)
ma se ciò non è corretto, mi sapresti indicare un'altra strada?
Grazie 1000
Aran Banjo


 Aran Banjo
Va meglio cosě?
Ciao
Andrea

 scrisse:
[IPER CUT]
Dunque, io ho messo tante property quanti sono i campi che voglio
gestire...
ecco uno stralcio:
' variabili private ad utilizzo della classe
Private m_sUserPassword As String
Private m_sUserName As String
Private m_bSospeso As Boolean
Public Property Let UserName(sUserName As String)
   m_sUserName = sUserName
End Property
Public Property Let UserPassword(sUserPassword As String)
   m_sUserPassword = sUserPassword
End Property
Public Property Get UserName() As String
   UserName = m_sUserName
End Property
poi, ad esempio ho questo per vedere se l'utente è sospeso:
Public Property Get Sospeso() As Boolean
   Dim sSQL As String
   Dim rsUtenti As ADODB.Recordset
 
   sSQL = "SELECT FlagSospeso "
   sSQL = sSQL & "FROM tblutenti "
   sSQL = sSQL & "WHERE nomeutente=" & DB_Apici(m_sUserName) & " AND
passwordutente=" & DB_Apici(m_sUserPassword)
 
   Set rsUtenti = DB_GetRS(sSQL, cnnADO, adLockReadOnly,
adOpenForwardOnly, adUseServer, adCmdText)
 
   Sospeso = rsUtenti!FlagSospeso
 
   sSQL = ""
   Call DB_CloseRS(rsUtenti)
End Property
può essere una strada corretta?
Tnx


 wrote in message
news:3e5e1d2a....@news.cis.dfn.de...
[SUPER MEGA CUT]
Aran stai chiedendo 20 cose diverse nello stesso th,
non ci capisco piů niente
ciao
Lorenzo

Lorenzo


 Tnx
Prego
Andrea

essere modificabili( UserName e Password ).
Allora nel caso di controllo esistenza di un utente devo passare le
info alla funzione?
Es.
oUtente.Esiste("ciccio", "password")
Cosė?
Ciauz e abbi pazienza :)
Aran Banjo


 allo stesso tempo??
Devi cercare di raggiungere il massimo livello di astrazione dalla base di
dati.
per fare questo devi dividere concettualmente tre livelli
1) INSIEME DI UETENI (classe)
2) UTENTE(classe)
3) ACCESSO_AI_DATI (classe)
così se cambia la modalità di accesso (tipo passi da db a file o a xml/soap)
cambi solo la numero 3
questo implica quanto segue
la numero 1
ha i metodi NextUtente -> PrevUtente-> find utente->add
utente ->deleteUtente-> etc etc etc
la numero due solo le proprietà
Utente -> NOme->Cognome -> etc etc
la numero 3
ACCESSO-> ReadData()-> Che riempie la numero 1 con un insieme di classi
numero 2  leggendo dalla fonte dati
se cambiano le azioni sugli utenti cambi solo la 1
se cambiano i dati da immagazzinare cambi solo la 2
così se cambia l'accesso ai dati cambi la 3
questo come concetto
ciao
Lorenzo

 Aran Banjo
Andrea

No, "Esiste" č un metodo di clsUtentI, cioč l'insieme degli utenti.
@#@#@@ non ci capisco proprio piů nulla...
mi sa che mi conviene tornare al mio vecchio metodo "MODULI&FORM"...
Ciauz


 mi sa che mi conviene tornare al mio vecchio metodo "MODULI&FORM"...
Mi permetto una piccolissima osservazione:
Le cose in cui ti stai perdendo sono quelle tre/quattro cazzate che
distinguono la programmazione ad oggetti dalla programmazione 'ed na volta'.
Visto che hai spontaneamente e consapevolmente scelto di utilizzare un
linguaggio Object Oriented (anche se molti non lo usano come tale), non
credi che potrebbe valere la pena di studiare qualche paginetta sulla
programmazione Object Oriented (su MSDN trovi di tutto...)?
I vantaggi che ne potresti trarre sarebbero sicuramente superiori alla mezza
giornata richiesta per una micro-infarinatura.
Ciao
Alberto

Alberto


 qualche cosa per agganciare OOP a  VB.
Mmmmmhhhh....
In tutta sincerità: anche io ho iniziato col C++.
Ti devo confessare che l'unica cosa che ho trovato veramente simile, fra
VC++ e VB, è proprio l'architettura delle classi, tant'è che attualmente
utilizzo la modellazione ad oggetti con molta più intensità di quanto si
faccia comunemente in VB.
E' molto strano che uno che sa usare bene classi ed oggetti in C++, si trovi
a disagio con una versione tutto sommato semplificata, quale è VB.
Ciao
Alberto

Alberto
Aran Banjo


Alberto
Aran Banjo


Ciao a tutti.
[CUT]
Vediamo se ho capito qualcosa in merito.
Creo una classe chiamata CUtente.
CUtente contiene le informazioni del singolo utente, nella
fattispecie:
Nome; Password.
Queste informazioni come le espongo?
Faccio delle public property:
Let Nome ; Let Password.
Per la proprietà Nome metto anche una propert GET, in modo tale da
avere la possibilità di avere il nome utente attivo a disposizione.
Per effettuare la validazione dell'utente, nel mio pulsante LOGIN
inserisco qualcosa del tipo:
------
Dim oUtente as CUtente
Set oUtente = New CUtente
oUtente.Nome = txtNome.Text
oUtente.Password = txtPassword.Text
--------
Richiamo poi una function pubblica della classe CUtente che mi dice se
l'utente esiste o meno nel Database:
If oUtente.EsisteInDB() Then
  ' ok fai partire il form principale
Else
  ' l'utente non esiste, riprova a inserire i dati
EndIf
Nella classe CUtente, la function EsisteInDB esegue una select sulla
tabella del DB utilizzando le variabili interne valorizzate tramite le
Public Property Nome e Password e restituisce TRUE o FALSE.
Credo e spero che quanto scritto fino ad ora sia giusto altrimenti
posso spararmi. Secondo quanto dice Balena: "Un oggetto è un'entità
che incorpora sia i dati sia il codice che li elabora".
Ora il mio problema è questo:
come fare per implementare una Function all'interno della classe in
modo tale che mi restituisca TUTTI gli utenti del DB?
Una cosa del tipo
-----------
Public Function GetList() As ADODB.Recordset
  Set GetList = DB_GetRS("tblutenti")
EndFunc
-------------
può essere corretta? A me sembra di no, ma non riesco a trovare altra
soluzione più "pulita".
Spero di essere stato più chiaro di prima.
Ringrazio anticipatamente chi saprà indirizzarmi correttamente (e avrà
la pazienza necessaria ;) )
Ciauz e scusate la lunghezza del post.


 soluzione più "pulita".
Come sintassi può anche essere corretta.
Il punto è concettuale: se tu gestisci, in una classe, i dati di UN UTENTE,
non è 'pulito' far passare attraverso questa classe informazioni su tutti
gli utenti.
Come ti hanno già detto, molto meglio una ulteriore classe CUtenti, in cui
una istanza contenga un elenco (collection) di istanze di CUtente.
Ciao
Alberto

 Aran Banjo
Andrea

Ciao e scusa per lo sfogo :-)
Figurati :)


 l'utente esiste o meno nel Database:
Come ti avevo già spiegato nell'altro post ... non ti conviene usare un
RecordSet per gestire gli utenti loggati (e quindi le loro istanze) ...
ma una superclasse clsUsers che espone una collection che contiene i
riferimenti a tutte le istanze ...
se vuoi ti mando un progetto già funzionante .. ma penso che la
soddisfazione nell'arrivarci da solo sia più allettante
Saluti

 Aran Banjo
Andrea

Andrea


 soddisfazione nell'arrivarci da solo sia più allettante
Che bello .. in 2 post manco una volta sono stato cagato ...
forse ho detto qualche fesseria ?
Vabbè .. se avete bisogno ... fateme sapè

Vabbč .. se avete bisogno ... fateme sapč
Ti prego di scusarmi Fox, ma stavo "studiando".
Se non ci sono problemi a mandarmi il progetto, posso dare uno sguardo
e cercare di capire, te ne sarei molto grato!
Grazie.


 Aran Banjo
Andrea

Andrea
Un milione di grazie :)


 Aran Banjo
Andrea

Di averti smadonnato dietro 2 post fa? :-P
Assolutamente!
Ti ringrazio della disponibilità, ed immagino che spiegare delle cose
che si conoscono bene ad uno che non accenna a capirle, fa girare
abbastanza ^__^. succede anche a me quando spiego Visual FoxPro ai
nuovi arrivati.
Ciauz


 Aran Banjo
Andrea

 Nè riesco a connettermi ad internet fischiettando.
Giuro ho 2 amici che lo fanno ( modem - modem a 9600bps pero' ) Qualche
volta li farei incontrare per parlarsi via modem gh gh !
Cmq ho amato sto 3ad ... non ci ho capito molto ma ho capito qualcosina in +
sulle classi Tnk !

 Ecco, mi sono sfogato :-)
Peccato che la netiquette dica di non rispondere ad un
post solo per dire ROTFL, altrimenti mi sarei potuto
risparmiare due di queste tre righe :-PPP
P.S.: Wodka, dove sei, quando c'č bisogno di te ? :-)))))
Pap.LOL=True