Newsgroup: it.comp.lang.visual-basic
Titolo: Errore nella dichiarazione subroutine

Buon giorno a tutti, premetto che e' la prima volta che scrivo e che
sono un principiante nell'utilizzo di vb.
Sto' iniziando a scrivere un piccolo programma utilizzando i moduli di
classe ed e' proprio qui che sono nati i problemi, al momento
dell'esecuzione vb in fase di compilazione mi esce fuori con un errore
di questo tipo:
"SOLO I TIPI PUBBLICI DEFINITI DALL'UTENTE DEFINITI IN MODULI DI
OGGETTO PUBBLICI POSSONO ESSERE UTILIZZATI COME PARAMETRI O TIPI
RESTITUITI PER ROUTINE PUBBLICE DI MODULI DI CLASSE O COME CAMPI DI
TIPI PUBBLICI DEFINITI DALL'UTENTE."
Lo so la descrizione dell'errore e' abbastanza criptica.
Vi descrivo come e' composto il programma:
ho un modulo che si chiama "definizioniglobali" dove ho definito la
seguente struttura dati e variabili:
Public cntDataBase As ADODB.connection
Public Type udtDataPersone
    codice As Long
    cognome As String * 30
    nome As String * 50
    datanascita As Date
    luogonascita As String * 30
    statocivile As String * 1
    professione As String * 30
End Type
poi ho una classe dal nome "clsDataPersone"
con varie funzioni, sub e property, qui sotto vi riporto la parte di
codici su cui si verifica l'errore:
Public Property Get datablank() As udtDataPersone
   datablank = memDataBlank
End Property
In pratica l'errore si manifesta duranta la compilazione della classe
clsDataPersone quando in questa uso la struttura dati udtDataPersone
(definita in un modulo separato) e la matto come parametro di una sub,
function o property.
Per favore qualcuno mi puo' dare una mano per risolvere il problema.
Ciao e grazie a tutti.
----
leju...@friends.panservice.it
leju...@tiscalinet.it
dbi...@tin.it

 ha scritto nel messaggio
news:3b28e328...@news.tin.it...


 poi ho una classe dal nome "clsDataPersone"
[SNIP]
Il messaggio vuol dire che il tuo tipo pubblico puo' essere usato in una
routine (=metodo o property) pubblico di una classe solo se e' stato
definito tale in un "modulo di oggetto pubblico" (=altro nome per modulo di
classe)
Questo perche' la classe pubblica potrebbe essere usata anche esternamente
al tuo programma; la tua dichiarazione
Public Type udtDataPersone
in questo caso e' in un modulo .bas e quindi un eventuale client non avrebbe
modo di accedere a quella struttura dati, la stessa cosa ad esempio succede
con gli Enum; sposta la dichiarazione nella classe e vedrai che funziona.
Tra parentesi, a meno che la struttura non ti serva necessariamente per
operazioni su file e cose simili, forse e' piu' pulito trasformarla in una
classe vera e propria...
Ciao
--
Luca Dormio
luca....@tin.it


Dato che come descritto sopra non funzionava allora ho provato a
trasformare la struttura in una classe, infatti in questo modo
funziona (anche se il prog. non fa assolutamente niente :-)) )
Quel tipo di dato mi serviva per fare interscambiare  i valori di un
record gestito dalla classe, con una form, magari se dai un'occhiata
all'altro messaggio dal subj "SUGGERIMANTO PER CREAZIONE PROGRAMMA
DIDATTICO" li spiego meglio a cosa mi serviva.
Ciao e grazie ancora.
---
leju...@friends.panservice.it
leju...@tiscalinet.it
dbi...@tin.it
---
leju...@friends.panservice.it
leju...@tiscalinet.it
dbi...@tin.it

 DIDATTICO" li spiego meglio a cosa mi serviva.
Ho visto e in effetti in questo caso la struttura non e' necessaria, anzi!
puoi semplicemente far diventare le variabili della struttura proprieta'
della classe clsAnagrafica e lavorare direttamente con quella; rispetto al
tuo esempio diventerebbe quindi:
' Crea l'oggetto tabAnagrafica
Set tabAnagrafica = new clsAnagrafica
'impostiamo i campi dell'oggetto
tabAnagrafica.codice = 1
tabAnagrafica.cognome = "Pinco"
tabAnagrafica.nome = "Pallino"
' il metodo insert gestisce l'inserimento di un nuovo record nella
'tabella, non ha piu' bisogno di prendere i dati da una struttura esterna,
'perche' internamente al metodo insert puo' fare riferimento alle sue
'stesse proprieta'...
tabAnagrafica.Insert



Scusa io saro' cecato pero' nella finestra delle proprieta' vedo
soltanto DataBindigBehaving e DataSourceBehaving.
Comunque sia, modificando la prop. che dici tu cosa succede ? viene
esclusa la possibilita' di accedere alla classe da oggetti esterni
all'applicazione ?
Ciao.
---
leju...@friends.panservice.it
leju...@tiscalinet.it
dbi...@tin.it

 all'applicazione ?
Al contrario, in quel caso passi da classe privata (come hai ora, e nella
quale *non* puoi usare i tipi come hai descritto) a classe pubblica, che non
puo' essere creata da applicazioni esterne ma puo' essere manipolata (se
esiste un'altra classe creabile che fornisce un istanza).
Per non stravolgere il progetto comunque insisto sull' usare semplicemente
una classe e le sue proprieta' invece di una struttura...



Stai tranquillo il progetto non lo stravolgo, infatti come di cevo
serve solo per scopo didattico, ovvero cercare di capire vb.
Stavo pensando alla possibililita' di inglobare nella classe dati una
serie di funzioni per il controllo sull'esattezza dei dati (tipo campi
obbligatori, valori obbligatori, ecc...), in questo modo avre tre
classi, ess:
clsData
mi gestisce un'insieme di dati, e mi fa' i controlli necessari
sull'esattezza di dei valori inseriti
clsRecord
servira' per la gestione di
inserimento/variazione/eliminazione/ricerca/lock/unlock dei record che
saranna necessari per la memorizzazione dei dati di clsData (che sara'
incapsulata in questa classe).
frmData
gestira' il data entry per clsData
A questo punto mi domandavo se era possibile costruire delle
sottoclassi con dei metodi base per poi estenderli ad altre classi con
funzioni di ereditarieta' (mi sa che mi sono spiegato un po' male), mi
era sembreato di avere letto qualcosa a proposito.
