Newsgroup: it.comp.lang.visual-basic
Titolo: Esistenza label

Ciao a tutti;
Vorrei sapere come poter individuare l'esistenza di una label o comunque
di un controllo in un form da codice..
Grazie
Peter
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 di un controllo in un form da codice..
Scandaglia l'insieme Nome_Form.Controls

 ha scritto nel messaggio
news:bd795h$1cq$1...@news.newsland.it...
: Ciao a tutti;
:
:
: Vorrei sapere come poter individuare l'esistenza di una label o comunque
: di un controllo in un form da codice..
:
'Sto cercando Label1
Dim ctrl As Control
For Each ctrl In Me.Controls
If ctrl.Name = "Label1" Then Beep
Next
End Sub

End Sub
Ad essere pignoli, metterei un exit for dopo averla trovata ;-)
-- 
ciao, un hal che risparmia cicli di cpu ;-)

 Ad essere pignoli, metterei un exit for dopo averla trovata ;-)
Ad essere più che pignoli, testerei anche l'Index. :-P

Ad essere più che pignoli, testerei anche l'Index. :-P
Solo se so che il controllo e' indicizzato.
-- 
ciao, un hal che cerca di evitare un test per ogni ciclo :-P

 
Se la label esiste Typename(nomeDellaLabel) ti restituisce "Label"
Se nomeDellaLabel non esiste ti restituisce Empty.
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 Se nomeDellaLabel non esiste ti restituisce Empty.
Sagace! ;-)

Il 6/23/2003 10:32 PM, Lupo scrisse:

Con sto caldo ogni riga non scritta e' un refolo di vento ...
:-)


Se nomeDellaLabel non esiste ti restituisce Empty.
Ehm, funziona anche con Option Explicit?
-- 
ciao, hal



SI
Volendo allargare a tutti i controlli
Private Function Exist(ByVal Ctrl As Control) As Boolean
   On Error GoTo Exist_Error
    Dim a As String
    a = Ctrl.Name
    Exist = True
   On Error GoTo 0
   Exit Function
Exist_Error:
    Exist = False
End Function
Debug.Print Exist(Label1)
Anch'io volevo dire la mia eheheheheh
Alessandro
-- 
Morfeus®
Free Joint
 :PII

   On Error GoTo Exist_Error
Ahecco, catturando l'errore ;-)
Ma anche il gestore degli errori ha un costo...
... probabilmente piu' basso di quello che sarebbe un loop su un form
con molti controlli ;-)
In ogni caso, perche' mai dovrei cercare una label con un certo nome?
Non sarebbe codice portabile, imho.
-- 
ciao, hal

 Non sarebbe codice portabile, imho.
non cerchi il nome a dire la verità ;)
No io penso che TypeName sia la migliore soluzione al problema chiesto,
 ma volendo estendere la ricerca(e sono OT) a *qualsiasi controllo*  la
proprietà name
di sicuro c'è per un controllo insiema ad altre sette se non ricordo
male...
Come ha, giustamente, sollevato Lupo molto probabilmente la ricerca serve
per
controlli inseriti a run-time altrimenti è da "pazzi" ed inutile cercare un
controllo che
sicuramente mi sono preso la briga di trascinare sulla Form,ergo il mio
metodo è OT
sicuramente ma lo avevo anche detto...


sicuramente ma lo avevo anche detto...
Proprio OT non direi, e' speculazione (leggi: seghe mentali) sul
visual basic.
-- 
ciao, hal

 visual basic.
già è vero speculo di brutto anche senza VB
Alessandro
Morfeus®
Free Joint
 :PII

aggiungi pure i Kb di un modulo?
Se posso scrivo sempre codice generico e riutilizzabile: in effetti
scrivo poco ;-)
-- 
ciao, hal

nella tua di funzione Byref non mi piace
Perche' non ti piace ByRef?
-- 
ciao, hal

 scrivo poco ;-)
hai ragione dovrei prenderti a modello ;)
ehhmm in effetti scrivere POCO,Generico e riutilizzabile è quello
che ho sempre sperato di fare
ByRef dicevo non mi piace perchè non mi piace e non mi è mai piaciuto
come impostazione predefinita di vb,nel nostro caso poi non ne vedo la
praticità
ad ogni modo vedi se ti piace di più così
Private Function ControlExists(ByVal Ctrl As Variant) As Boolean
   On Error resume next
    Dim a As String
    a = Ctrl.Name
    ControlExists=(err.number=0)
End Function
è il risultato di Exist xor ControlExists


Grazie 1000 a tutti
Ciao 


Private Function ControlExists(ByVal Ctrl As Variant) As Boolean
perche' Variant? E se ricevi qualcosa che non deriva da Control?
Lo scopri a runtime invece che a compile time.
-- 
ciao, hal

 perche' Variant? E se ricevi qualcosa che non deriva da Control?
mmmhh
Ad essere pignoli non c'è nessuno che ti batte ;)
Si in effetti non è risolutivo e definitivo,ma questa sega è servita ...:)
Penso che alla fine se e dico se dovessi servirmene implementerei più la
tua che la mia...ovvero cercherei di settare un controllo come controllo
esistente del form passato per "valore" e gestirne l'errore


mi serve modificarne il Valore,poichè uso una copia
Nel caso degli oggetti la differenza fra ByRef e ByVal puo' creare
confusione..
Quando ricevi un oggetto ByVal non ricevi una copia dell'oggetto,
ma una copia del riferimento, tant'e' che l'area di memoria a cui
punta il puntatore che ricevi e' la stessa dell'oggetto originario.
Ti diro' di piu': se passi un oggetto ByVal ottieni solo di
incrementare il contatore interno dei riferimenti all'entrata della
funzione e decrementarlo all'uscita, cosa che non succede se usi
ByRef.
Il passaggio di oggetti ByRef, per lo meno all'interno dello stesso
processo, e' quindi leggermente piu' performante del passaggio ByVal e
le proprieta' pubbliche dell'oggetto sono modificabili in entrambi i
casi.
Lo puoi verificare anche senza disassemblare il programma.
Prendi un form e mettici una label, due command button ed il seguente
codice:
Option Explicit
Private Sub TestByRef(ByRef a_Ctl As Control)
    Me.Caption = "ByRef: " & ObjPtr(a_Ctl) & " - " & VarPtr(a_Ctl)
End Sub
Private Sub TestByVal(ByVal a_Ctl As Control)
    Me.Caption = "Byval: " & ObjPtr(a_Ctl) & " - " & VarPtr(a_Ctl)
End Sub
Private Sub Command1_Click()
    TestByRef Label1
End Sub
Private Sub Command2_Click()
    TestByVal Label1
End Sub
Adesso nota come variano ObjPtr e VarPtr ;-)
-- 
ciao, hal
...per la precisione ;-)

 Adesso nota come variano ObjPtr e VarPtr ;-)
si ho notato che uso una *copia* in memoria della Variabile Parametro ;)


mmmhh va bene farò sempre così :)
Non *sempre*, pero', c'e' differenza tra il marshaling in-process e
out-of-process. Se l'oggetto va passato ad un componente
out-of-process allora e' sempre preferibile usare il ByVal, perche'
cosi' si evita, all'uscita della funzione, della seconda copia del
riferimento ricevuto.
Quando si chiama un metodo/proprieta' di un componente out-of-process
in realta', poiche' non e' consentito condividere lo stesso spazio di
indirizzi, ci si rivolge ad un proxy che impersona l'oggetto remoto e
si occupa di passare la chiamata a quest'ultimo tramite uno stub
sull'altro processo.
Con il ByVal viene copiato il riferimento per il server e la cosa
finisce li', mentre se si passa l'oggetto ByRef viene rifatta la copia
anche al ritorno.
C'e' uno schemino qui:
How Marshaling Affects ActiveX Component Performance
http://msdn.microsoft.com/library/en-us/vbcon98/html/vbconinprocessoutofprocesscodecomponents.asp
-- 
ciao, hal
meno male che si voleva solo testare l'esistenza di una label ;-)

always use ByVal to declare arguments that will contain object references.
che poi io mi ricordavo di aver letto sui "portatili" di F.Balena e che se
non ricordo
male non parlava di oggetti richiamabili da processi "esterni".Riguardo al
fattoche l'essere predefinito in VB6 è un errore,a mio avviso,e che in
VB.net
è stato rimediato rimpiazzandolo con il più efficente ByVal
non fà che convicermi ancora di più su:
*nella tua funzione ByRef non mi piace*
Public Function ControlExists(ByRef a_Form As VB.Form, _
ByVal a_ControlName As String _
) As Boolean
forse non era a gusto...anche se credo di essere un buongustaio
*Sbaracchiaon appartiene alla categoria di Sbrit,Sbruzz e lo "" appunto
l'ho appreso in puglia,Lecce
Ciao


l'ho appreso in puglia,Lecce
Che tradotto in italiano sarebbe?
-- 
ciao, hal

 Che tradotto in italiano sarebbe?
Sborrata Boreale,credo comunque l'effeto è quello
Ciao e Grazie
Alessandro


è stato rimediato rimpiazzandolo con il più efficente ByVal
In 
vb.net
 le classi non sono oggetti COM, quindi non e' proponibile il
confronto con vb6 (che e' COM dalla testa ai piedi).
-- 
ciao, hal
vabbe', se ne hai voglia possiamo divertirci a smontare un po' anche
vb.net
 ;-)

poichè è più di OOP
e riguardo alle classi di .Net non sono Com ma non sono nemmeno Classi Vb6,
forse il componente che si avvicina di più ai Com in .Net è il modulo,molto
IMHO, che non è il modulo di vb(infatti io mi costruisco i componenti nei
nuovi moduli)
