Newsgroup: it.comp.lang.visual-basic
Titolo: Public Sub o Private Sub?

Salve,
come da subject, qualcuno mi dice la differenza nello scrivere in un
codice "Public Sub" o "Private Sub"? Mi hanno fatto venire un
dubbio...
Aspetto mews, grazie.
Saluti, ciao ciao.

Scusa ma dubbio di che tipo?
Da quello che ne so io (poco lo ammetto), il public/private riguarda la
visibilità della tua sub, mi spiego:
se private sarà accessibile solo all'interno del modulo in cui l'hai
dichiarata, cioè la puoi "chiamare" solo da routine dichiarate all'interno
dello stesso modulo,
se public sarà accessibile anche dalle sub di altri moduli.

dello stesso modulo, se public sarà accessibile anche dalle sub di altri moduli.
Esatto, Private solo nel modulo corrente, Public a tutto il progetto.
Grazie, ciao ciao.

Skunk hai dei problemi con le dichiarazioni ... ho appena risposto ad un tuo
post in cui chiedevi cosa sono le property Get/Let ...
Ma non ti conviene prendere un buon libro ?
        Come al solito ... OT
            Ciao

Ma non ti conviene prendere un buon libro ?
Si, lo farņ, perņ appena vedo qualcosa che non conosco chiedo che č,
poi quando compro il libro capirņ ancora meglio pechč grazie alle
vostre risposte ho gią avuto chiarimenti.

Caduto sulla programmazione a oggetti :)) Un buon libro sulla
programmazione a oggetti mi servirebbe, vedendo meglio queste due
property...ho visto che non conosco la programmazione a oggetti.
Esiste qualcosa in rete, nel sito comune o da qualunque altra parte,
un documento che non siano per forza 20.000 pagine, qualcosa che mi
dia i concetti di base, giusto per capire e muovermi un po nella
programmazione a oggetti? Che poi qualcosa la ricordo, polimorfismo,
ereditarietà...vabbè, meglio cominciare da 0.
Aspetto news, grazie.
Saluti, ciao ciao.

 vostre risposte ho già avuto chiarimenti.

se public sarà accessibile anche dalle sub di altri moduli.
Aggiungo solo, per completezza a quanto detto da Valentina, che utilizzando una Public Sub in un
modulo di form o di classe, vai ad implementare un metodo per quell'oggetto.
Questo solo nel caso in cui un indomani non ti venga il dubbio "come faccio ad aggiungere un metodo
alla mia form?"
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

 alla mia form?"
moreno non ridere ma faccio io una domanda.
intanto mettiti seduto, ho gia' detto che con gli oggetti mi ci trovo come
paperino coi soldi...
quindi se io in form1 scrivo
    public sub pippo
        command1_click
    end sub
posso da form2 fare
    form1.pippo
e premere quel form1.command1 anche da altre parti del programma ?

    form1.pippo
Si che pupo, se lo provi vedi che funziona anche :))


come no ...
però provoca il caricamento del form (se questo non è già caricato) ...
Non è più conveniente fare direttamente form1.command1_click ?
Ciao

 Si che pupo, se lo provi vedi che funziona anche :))
ciao sknuk grazie
non ho provato ma di te mi fido nel modo piu' assoluto :)
saluti ciao ciao
be', da quella via ci ho provato :)
funziona, ma ancora non capisco perche'
Option Explicit
Private Sub Command1_Click()
    Form1.pippo '= Command1_Click
End Sub
Private Sub Command2_Click()
    Form1.Command1_Click
End Sub
command1 funziona e command2 no.
eppure le coordinate di quale pulsante premere gliele do'.
uff... mmm... "_private_ command1_click" ?

e premere quel form1.command1 anche da altre parti del programma ?
Fai una prova:
Nella Form1 mettici tre pulsanti: command1, Command2 e command 3:
Private Sub Command1_Click()
	MsgBox "Ciao al mondo intero (e anche a quello parzialmente scremato...)"
End Sub
Private Sub Command2_Click()
	Call Command1_Click
End Sub
Private Sub Command3_Click()
	Form2.Show
End Sub
Poi implementa il metodo pippo come hai fatto tu:
public sub pippo
        command1_click
end sub
Nella Form2, invece, mettici altri 3 pulsanti:
Private Sub Command1_Click()
	Call Form1.Command1_Click
End Sub
Private Sub Command2_Click()
	Form1.pippo
End Sub
Private Sub Command3_Click()
	Form1.Command1.Value = True
End Sub
Ora avvia.
Se clicchi su command1, ovviamente ti viene mostrata la msgbox...
Se clicchi si command2, viene richiamato l'evento click del command1 e quindi appare la msgbox...
E fino a qui OK.
Ora clicca sul terzo pulsante e visualizza la form2:
Clicca sul command1 di quest'ultma: viene richiamato l'evento Click del command1 della form1, ma
viene generato un errore, poiché non è possibile richiamare una procedura di risposta ad evento al
di fuori del modulo in cui tale metodo è implementato poiché è dichiarata come Private, logico, no?
Quindi gli unici due metodi per richiamare tale procedura sono:
command2: chiamando il metodo pippo
command3: impostando a True la proprietà .Value del pulsante command1
Ovviamente nel caso di questo semplice esempio, è preferibile il secondo metodo, ma nel caso in cui
sia necessario svolgere più operazioni e soprattutto in diverse parti del codice (ovvero le
situazioni tipche in cui si ricorre ad una sub routine) ecco che l'implementazione di un metodo per
la form assume un significato diverso...
Spero di essermi spiegato sufficiyjentemente bane, visto il critico che ho davanti... ;-PPP
Ma l'implementazione di un metodo in un modulo di form è un buon metodo, oppure no? In tal caso
resta sempre un metodo, non buono, ma metodo... si potrebbe aprire un nuovo thread... ;-PPP


Non è più conveniente fare direttamente form1.command1_click ?
Non si può per il motivo che ho detto nell'altro post.
Comunque il form viene caricato in ogni caso, visto che si fa riferimento ad un suo oggetto...
giusto?


Hemm, quanto detto da te è chiarissimo, l' ho capito persino io :))
Però scusa...ma tutto questo, ma quando lo utilizzi? Ma che scopo ha
chiamare da un form all' altra procedure interne ad uno dei due form?
Ma a questo punto non conviene fare un modulo, poiazzarci dentro le
funzioni che ti servono e richiamare, da uno e dall' altro form,
sempre la stessa funzione dallo stesso modulo?

 ha scritto

si', di solito faccio cosi'.
ma scoprire possibilita' mi fa sempre piacere, anche perche' mi sembra di
mettere meglio a fuoco alcuni concetti che tendono a sfuggirmi.
ammetto anche che a volte interpreto la prg a oggetti in modo non proprio
elegante, cioe' uso gli oggetti che stanno sui form :)
'form1
    if pippo then form2.text1="pippo"
'form2
    private sub text1_change
        ...
non e' il massimo, anzi tira con decisione al minimo, ma all'inizio mi ha
consentito di far girare velocemente programmi (funzionanti, nb :))

 resta sempre un metodo, non buono, ma metodo... si potrebbe aprire un
nuovo thread... ;-PPP
ti sei spiegato benissimo, M.o Sirri, e grazie, ma sul giudizio di valore
non aspettarti risposte da me. arriveranno da ben altri :)))

sempre la stessa funzione dallo stesso modulo?
come diceva il mio prof di Informatica all'università: "La sua è una buona domanda..." 
Il problema è che diceva così quando non sapeva la risposta... ;-PPP
Guarda, un esempio pratico piuttosto recente lo ha dato Hal1961 in un post di qualche giorno fa,
quando diceva (cito):
"
Un sistema banalissimo (ce ne saranno sicuramente di migliori) potrebbe
essere quello di incapsulare la chiamata alla Show, aggiungendo un metodo
pubblico al form da chiamare che abbia gli stessi argomenti di Shoe e magari
anche qualcos' altro che ti puo' essere utile. Per esempio:
Public Function ShowMe (Optional nShowMode As long = 0, _
                                    Optional varParams As Variant) As Long
    If (Not IsMissing(varParams)) Then
        // gestisco i miei parametri aggiuntivi
    End If
    If (nShowMode == vbModal) Then
            // qui faccio qualcosa
    End If
    // mostro il form
    Me.Show nShowMode
    ShowMe = 1
End Function
Da fuori, la chiamata sara'
Manager.ShowMe vbModal
oppure
Manager.ShowMe
"
L'esempio nel caso specifico permetteva di stabilire se la form veniva visualizzata come modale o
meno...
In ogni caso, generalizzando questo esempio, un motivo può essere ogni qual volta si necessita di
implementare un metodo già esistente...



Moreno ... sei sicuro che non funzioni ... ovviamente Command1_Click deve
essere dichiarato public ...

 deve essere dichiarato public ...
dichiarato public funziona, ma e' contro l'information hiding cui
VB tenta di arrivare
per i commandbutton si fa prima Comman1.Value = True
questo genera l'evento click
--
Fibia "Sakamoto" FBI
URL: 
www.geocities.com/fibiafbi
E-Mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Membro #25 delle BT Sez. Sud

essere dichiarato public ...
OK, in questo caso sì... ma non credi sia poco elegante?
