Newsgroup: it.comp.lang.visual-basic
Titolo: form che restituisce dei parametri

Salve a tutti.
Allora, dovrei realizzare un semplice form di ricerca cliente in un
database, solo che questa funzionalità deve essere accessibile da quasi
tutti i form del mio programma... Mi servirebbe quindi una funzione, oppure
una procedura che, chiamata da un form qualsiasi del mio programma mi faccia
apparire il form di ricerca e, se trovato il cliente, mi restituisca nei
parametri codice, indirizzo nome amministratore e comune i relativi dati del
cliente trovato, di modo che dal form chiamante io li utilizzi come + mi
pare...
avrei pensato di dichiarare in un modulo qualcosa del genere
public function cercaClienti (codice as integer amm,comune,nome,indirizzo as
string)
  frmCercaCliente.show
  'istruzioni per la ricerca
 'assegnazione dei valori trovati in codice amm comune ecc
end function
dagli altri form mi chiamo la funzione cercaclienti...
Secondo la vostra esperienza è corretto ciò che voglio are o potete
consigliarmi qualcosa di + efficiente?

in pratica il mio problema è fermare l'esecuzione della routine chiamante
finchè il form di ricerca non viene chiuso e i parametri sono stati
impostati.
(ho provato a dichiarare public in un modulo tutti i parametri)

non voglio pensare che devo mettere nella sub (meglio una sub che una
function) pubblica un loop che si interrompa solo quando, dal form di
ricerca, cliccando sul pulsante conferma modifico un valore booleano public
del tipo "trovato"... non è una soluzione degna di visual basic! :-)

[*Paolo C.*=
paolo...@libero.it
] ha scritto:

Per quanto mi riguarda, ogni form di scelta è assolutamente modale, nè
riuscirei a concepire il contrario.
Alla chiusura metto le scelte in una stringa visibile anche al chiamante e
vado via come un treno.
In alternativa, è possibile mettere in un EXE esterno la form delle scelte,
è attendere (c'è un'API apposta che ora non rammento) che l'applicazione/EXE
sia terminata. In questo caso le scelte le deposito su un file temporaneo e
con nome univoco.
O, ancora, fare un "Server", ma, in tutta sincerità, non mi pare che ne
valga la pena.

spiego meglio il mio problema:
ho un form di lettura, modifica aggiunta di cartellini di lavoro. Quando
devo aggiungere un nuovo cartellino, dato che i cartellini sono in relazione
molti ad 1 con i clienti, devo conoscere il codice cliente da inserire nella
chiave esterna della tabella cartellini: l'utente però non può certo
ricordarsi i codici di tutti i clienti, perciò ho bisogno di realizzare una
ricerca per nome comune o uno degli altri campi.
Come avevo idealizzato la soluzione:
dal form dei cartellini clicco sul pulsante Aggiungi Cartellino. Mi si apre
il form di ricerca del cliente, io lo cerco, lo trovo e clicco sul pulsante
Conferma del form di ricerca. A questo punto si chiude il form di ricerca e
il codice cliente è automaticamente inserito nel campo idcliente e l'utente
può continuare ad inserire gli altri dati del cartelino di lavoro.
Come risolveresti tu questa situazione?

 Come risolveresti tu questa situazione?
L'ho scritto: Il form di ricerca è modale e anche l'universo si ferma sino
alla sua chiusura.

 il codice cliente è automaticamente inserito nel campo idcliente
in realtà il codice è memorizzato nela variabile pubblica codiceCliente che
ho dichiarato in un modulo

scusami... dovrei almeno leggere con + attenzione le risposte che mi si
danno :-P
ma come faccio ad impostare questo form di ricerca come modale? nell
proprietà del form non vedo nulla che sia inerente...

e poi logicamente lo devo chiudere con il metodo unload e non con hide vero?

 proprietą del form non vedo nulla che sia inerente...
Porca pupattola.
Hai detto di avere, pur taroccata, la guida. Usala!
Giuro (!) che ti curo e questa č l'ultima risposta che ti dņ se non avrai
dimostrato di aprire l'Help.
Form_Ricerca_Cliente.Show vbModal

 hide vero?
E, da che ci sei, rileggi le risposte.
Anche senza alcuna interpretazione, quindi con una lettura letterale, c'è
quel che ti chiedi.
Quando (lasciamo stare il come) si chiude un form modale?

perchè ho la capacità di far innervosire anche i + pazienti come te? :-P
Ti giuro, io ho cercato Modale, Form a scelta obbligatoria ecc... ma mai a
pensare che era un argomento del metodo show! :-)
No dai... non fare così... sto programma che sto facendo possiamo dire di
averlo realizzato al 50% io e te :-)

 dire di averlo realizzato al 50% io e te :-)
No, no, io non mi assumo responsabilità :-P

ok...
allora, dato il numero dei miei post riporterņ in una settimana l'intera
MSDN sul NG :-)
cmq ragionando, se l'ho impostato modale con il metodo show... basta che
utilizzo hide e funziona!
in effetti hai ragione, anche per come imposto io i programmi i form
dovrebbero essere tutti modali, pertanto č una nuova clausola che aggiungerņ
sempre
come al solito grazie mille!!!

 che utilizzo hide e funziona!
Occhio che il metodo Hide toglie solo il form dal video, ma non lo scarica.
La prossima volta (nella stessa sessione di lavoro) che l'userai non si
dovrebbe verificare il Load (ma non ho provato e potrei dire una
schiocchezza) che, magari, contiene tue istruzioni importanti di
preparazione.
Perchè non usare direttamente l'Unload così te lo togli di torno e la
prossima volta sarà come se fosse la prima?

 database, solo che questa funzionalità deve essere accessibile da quasi
Io, di solito, in tutti i progetti che faccio metto una classe
VariabiliStato che contiene tutte quelle variabili che possono essere
utilizzate dalla maggior parte delle maschere/funzioni del programma.
Non uso un modulo semplicemente perchè cosi' le posso racchiudere
all'interno di un contenitore (la classe, appunto) e cosi' possono essere
viste e richiamate semplicemente.
Per cui in un problema come il tuo scriverei in una variabile di questa
classe (o comunque in una variabile globale) il valore rilasciato da quella
maschera.
Comunque un altro metodo che ho utilizzato è il seguente:
Mettiamo che le due maschere siano:
-> frmChiamante (la maschera di partenza)
-> frmNuova (la maschera aperta da frmChiamante)
Mettiamo semplicemente che nella frmNuova l'utente debba selezionare delle
voci da una combo e questi valori selezionati debbano essere visualizzati
in una textbox della maschera chiamante.
Allora farei cosi':
------------------------------------
Sub frmChiamante_ClickSuQualcosa
        Dim DatiTemp as collection
        '### Inizializza una collezione locale
        '### Questa collezione sarà il riferimento
        '### per una collezione presente nella form nuova
        Set DatiTemp=new collection
        '### Faccio partire frmNuova_Load
        '### Ovviamente una variabile globale di frmNuova
        '### dev'essere DatiDaPassare, una collezione.
        call frmNuova.load
 
        '### Imposto il riferimento della variabile di 
        '### frmNuova alla variabile locale
        Set frmNuova.DatiDaPassare=DatiTemp
        '### Finalmente visualizzo frmNuova, modale.
        call frmNuova.show(1)
 
        '### Prima che frmNuova si chiuda completamente,
        '### scriverà i suoi dati nella sua variabile
        '### DatiDaPassare
        '### Siccome DatiDaPassare ha lo stesso riferimento
        '### di DatiTemp, i dati sono stati scritti su 
        '### DatiTemp, e quindi io in DatiTemp ho i dati
        '### che mi servivano
End Sub
---------------------------------
---------------------------------
'### Prima che la form nuova venga chiusa, scrive i dati
'### nella collezione di passaggio
Sub frmNuova_QueryUnLoad
        Dim k as long
 
        For k=0 to combo1.listcount-1
                if combo1(k).selected then
                        call DatiDaPassare.add(combo1.list(k))
                end if
        next k
End Sub 
---------------------------------
Spero che il metodo ti sia chiaro.
Il vero vantaggio di questa soluzione è che frmNuova può essere chiamata da
qualsiasi altra maschera, senza alcun problema.
Inoltre non hai bisogno di dichiarare alcuna variabile globale e non è cosa
da poco.
-- 
Ciao,
        Fabrizio
        <=- 
http://www.negusweb.it
 -=>