Newsgroup: it.comp.lang.visual-basic
Titolo: In modulo si, in Dll no

Perchè la funzione seguente funziona bene se la metto in un modulo del
progetto,mentre smette di funzionare(mi da sempre False) se la metto in una
Dll (Active X)
Function Completo(ByVal nomeform As Object) As Boolean
Dim Obj As Object, opt As Boolean, cek As Boolean, comb As Boolean
Completo = True
  Do
        For Each Obj In nomeform.Controls
             'OptionButton
          If TypeOf Obj Is OptionButton Then
                If Obj.Value = True Then
                opt = True
                Else
                opt = False
                End If
          End If
             'CheckBox
          If TypeOf Obj Is CheckBox Then
                If Obj.Value = 1 Then
                cek = True
                Else
                cek = False
                End If
          End If
             'ComboBox
          If TypeOf Obj Is ComboBox Then
               If Obj.ListIndex >= 0 Then
               comb = True
               Else
               comb = False
               End If
            End If
              'ListBox
            If TypeOf Obj Is ListBox Then
               If Obj.ListIndex = -1 Then
               Completo = False
               Exit Do
               End If
            End If
             'MaskEditBox
          If TypeOf Obj Is MaskEdBox Then
             If Not IsDate(Obj.Text) Then
                Completo = False
                Exit Do
                End If
          End If
             'TextBox
          If TypeOf Obj Is TextBox Then
             If Len(Obj.Text) < 1 Then
                Completo = False
                Exit Do
                End If
          End If
        Next Obj
        Exit Do
  Loop
If opt = False Or cek = False Or comb = False Then
Completo = False
End If
End Function
Grazie
-- 
Gulp ! Forse mi sono perso qualcosa !

Dll (Active X)
L'espressione "smette di funzionare" e' troppo generica e non puo'
essere usata per formulare una diagnosi a distanza.
Hai fatto 30 pubblicando il codice, ora, se vuoi, fai 31 pubblicando
se vengono sollevate delle eccezioni e quali e, possibilmente in
corrispondenza di quale istruzione.
Vedrai che se ti sforzerai di fare questo, probabilmente troverai la
soluzione anche da solo.
-- 
ciao, hal

[咒ulp] scrisse:
(snip)
a parte tutto il resto... che senso ha un ciclo do... loop che prevede come
ultima istruzione, non condizionale, un exit do?
bastava e avanzava il for each, mi pare...
--
Salutoni
Sergio

[©Gulp] scrisse:
(snip)
cosě, a occhio: se ci sono piů check o option, basta che l'ultimo sia
"uncheched" che la funzione ti restituisce "false".
mi sembra sia fatta alquanto maluccio, in effetti :-(
--
Salutoni
Sergio

 [ŠGulp] scrisse:

Ci sono anche degli Exit Do interni, sui quali solo la logica puň
"giocare"...

 "giocare"...
non bastava un exit for, in quel caso?
--
Salutoni
Sergio

[*CSSoft* = 
news...@cssoft2001.com
 in
news:bl8sdr$9g4b5$
1...@ID-173193.news.uni-berlin.de
] ha scritto:

Effettivamente, sì.

 ha scritto nel messaggio
news:emlfnvkn93u4cbe74...@4ax.com...


 [©Gulp] scrisse:


 ha scritto nel messaggio
news:bl8q59$9fr8m$1...@ID-173193.news.uni-berlin.de...


Scusate il quot a fondo messaggio...mi si è sballato qualcosa.


 ha scritto nel messaggio
news:bla8fh$9uo2s$1...@ID-184132.news.uni-berlin.de...



Ma se il primo oggetto della lista dentro al For mi da un exit for, come
vengono controllati tutti gli altri oggetti?


 come vengono controllati tutti gli altri oggetti?
Gulp, la logica del tuo progetto (indipendentemente da DLL o BAS) non č
affatto chiara o, se lo fosse, appare errata. Potresti spiegare cosa
vorresti ottenere? Grazie.

 che incontra True, opt rimane true !!
Allora... da dove cominciamo...
L'idea è anche giusta, il problema è "calarla nella realtà". Tu hai fatto
una routine che fa la convalida dei dati inseriti su una form, e siccome sei
una personcina furba, hai cercato di farlo con una funzione esterna, in modo
da poter facilmente riutilizzare il codice.
A questo punto però ci scontriamo con il fatto che non conosciamo a priori
la logica di convalida, per cui tu ne hai "scritta" una nel codice: a parte
gli errori, direi che la tua intenzione era quella di:
- rifiutare l'introduzione se nessun checkbox è spuntato
- rifiutare l'introduzione se nessun option button è premuto/bollinato
- rifiutare i textbox vuoti, i listbox e i combobox nei quali non è stata
effettuata la scelta e i maskedit privi di una data valida.
e la domanda, a questo punto, sorge spontanea: che cosa fai se i gruppi di
opzione sono più di uno, e sono fatti tutti di checkbox? Secondo la tua
logica basterebbe che fosse selezionata una opzione in un gruppo per rendere
accettabile l'introduzione...
Direi che bisogna pensarci ancora un po'.
--
Salutoni
Sergio

altrimenti mi da sempre False !!
Quindi occorre tracciare il valore delle variabili e giro che compie
il codice. 
Piu' facile da fare che da dire ;-)
-- 
ciao, hal

 [*©Gulp* = 
g...@cyber.com
 in


 Piu' facile da fare che da dire ;-)
Cosě facendo ho trovato che a darmi problemi č solo la sezione di codice
relativa a
CheckBox,ma anche questa, se metto questo codice in una Private del form
funzione,
se lo stesso codice lo provo dentro alla funzione di cui sopra: canna!
Do
For Each Obj In Me.Controls
            If TypeOf Obj Is CheckBox Then
                If Obj.Value = 1 Then
                cek = True
                 Exit Do
                 End If
             End If
Next Obj
Exit Do
Loop
-- 


 Sergio
Ma io ci penso anche di piů !
A  me basta che almeno uno dei check presenti sia spuntato e, chiaramente,
ma questo č scontato per le caratteristiche intrinseche dell'oggetto, che un
solo Option sia True
per considerare Completo il form
E cosa mi racconti di mezzo 3D dedicato a Do ;-)  .... beh, dai almeno li mi
puoi dire che non era del tutto male ?
sempre con simpatia :-)))
Grazie Ciao
Gulp


 :-))
Ora quel che vuoi ottenere è chiaro.
Resta il problema sollevato correttamente da CSSoft relativamente ai
_diversi_ gruppi di OptionButton...
Direi che è risolvibile solo creandosi dei vettori per Container di
appartenenza e testare i vari OptionButton come se fossero oggetti di tipo
distinto dal Container stesso.
In ogni caso, io propongo sempre una condizione iniziale per gli
OptionButton, in modo che (per ogni gruppo) un'opzione sia sempre indicata.
Io lo riscriverei come segue. Nota (non ho provato, nemmeno allo scopo di
riprodurre il problema iniziale, ovvero DLL vs BAS) che la form viene
passata e gestita per riferimento, non per valore come facevi tu (salvo il
buonismo di VB e l'eventuale proprietà predefinita, che "valore" può essere
un oggetto? Non riuscirei mai a comprenderlo).
Inoltre, che io sappia, nella DLL devi includere tutti i tipi di oggetti,
MaskEdit compreso, viceversa non dovrebbe compilarsi.
Function Completo(oggetto_form As Object) As Boolean
Dim Obj As Object, opt As Boolean, cek As Boolean, comb As Boolean
Completo = True
opt = False
cek = False
comb = False
For Each Obj In oggetto_form.Controls
'OptionButton
If TypeOf Obj Is OptionButton Then
If Obj.Value Then opt = True
End If
'CheckBox
If TypeOf Obj Is CheckBox Then
If Obj.Value Then cek = True
End If
'ComboBox
If TypeOf Obj Is ComboBox Then
If Obj.ListIndex >= 0 Then comb = True
End If
'ListBox
If TypeOf Obj Is ListBox Then
If Obj.ListIndex < 0 Then
Completo = False
Exit For
End If
End If
'MaskEditBox
If TypeOf Obj Is MaskEdBox Then
If Not IsDate(Obj.Text) Then
Completo = False
Exit For
End If
End If
'TextBox
If TypeOf Obj Is TextBox Then
If Obj.Text = "" Then
Completo = False
Exit For
End If
End If
Next Obj
If opt = False Or cek = False Or comb = False Then Completo = False
End Function

[*Lupo* = 
LupoOrmaiR...@libero.it
 in
news:blbt3k$acnae$
1...@ID-174464.news.uni-berlin.de
] ha scritto:
Versione riveduta e corretta in modo da non restituere False se non esistono
oggetti di tipo OptionButton e/o CheckBox e/o ComboBox:
Function Completo(oggetto_form As Object) As Boolean
    Dim Obj As Object, opt As Boolean, cek As Boolean, comb As Boolean
    Dim presenti_opt As Boolean, presenti_cek As Boolean, presenti_comb As
Boolean
    Completo = True
    opt = False
    cek = False
    comb = False
    presenti_opt = False
    presenti_cek = False
    presenti_comb = False
    For Each Obj In oggetto_form.Controls
            'OptionButton
        If TypeOf Obj Is OptionButton Then
            presenti_opt = True
            If Obj.Value Then opt = True
        End If
            'CheckBox
        If TypeOf Obj Is CheckBox Then
            presenti_cek = True
            If Obj.Value Then cek = True
        End If
            'ComboBox
        If TypeOf Obj Is ComboBox Then
            presenti_com = True
            If Obj.ListIndex >= 0 Then comb = True
        End If
            'ListBox
        If TypeOf Obj Is ListBox Then
           If Obj.ListIndex < 0 Then
                Completo = False
                Exit For
           End If
        End If
            'MaskEditBox
        If TypeOf Obj Is MaskEdBox Then
            If Not IsDate(Obj.Text) Then
                Completo = False
                Exit For
            End If
        End If
            'TextBox
        If TypeOf Obj Is TextBox Then
            If Obj.Text = "" Then
                Completo = False
                Exit For
            End If
        End If
    Next Obj
    If opt = False And presenti_opt = True Then Completo = False
    If cek = False And presenti_cek = True Then Completo = False
    If comb = False And presenti_comb = True Then Completo = False
End Function

se lo stesso codice lo provo dentro alla funzione di cui sopra: canna!
Canna *che cosa*?
-- 
ciao, hal

 sempre con simpatia :-)))
grazie :-) , ma non credo di aver completamente afferrato il senso di questo
post...
--
Salutoni
Sergio

Uhaoo !
Devo starti sempre alle calcagna...da te s'impara sempre qualcosa !! :-))
Grazie Lupo
Ciao.


 Devo starti sempre alle calcagna...da te s'impara sempre qualcosa !! :-))
...stare alle calcagna delle zampette di un canide...
...o tempora o mores...   ;)
ciao
ugo

 Sergio
Non non ci va perchè ingegnere si scrive senza la i..... ma "ingegneristico"
non esiste... !
Anche se oggi ciò che si mette tra virgolette è sempre accettato !
Per quanto riguarda la sostanza....si del casino ne ho fatto un bel po'.
Non me la sono presa per niente delle osservazioni... e come potrei?
Sono d'accordo che servono ad imparare .Da voi tutti infatti ho imparato un
sacco di cose.
Per quanto riguarda l'incomprensibilità del post... ti dirò che oltre che
casinista, sono anche "ermetico"... è fatta ! :-)))
Cercavo di convincerti che quel Do era "buono".... sarebbe stata oltremodo
dura!!!   :-)))
Guarda tra le risposte di Lupo il codice proposto "depurato" da "abomini" ed
errori nefandi.
Ciao Sergio


 Devo starti sempre alle calcagna...
Ho rivisto adesso, c'č un errore. L'ho messo apposta per "vedere se stavi
attento" ;-)
No, mi č proprio scappato. Lo trovi da solo, cosě comprendi anche la logica.
Suggerimento: Manca una "b"...
Piuttosto, il problema per cui la funzione nella DLL non andava č risolto?
Se sě, fammi una cortesia: Prova a rimettere quel ByVal per la form e vedi
se funziona ugualmente.
Grazie.

 se funziona ugualmente.
Per oggi ho esaurito il tempo.Potrň provare Giovedě.
Mi impegno a farti sapere qualcosa...magari aprendo un nuovo 3d
Ciao


 ha scritto nel messaggio
news:blcpta$b0p22$1...@ID-184132.news.uni-berlin.de...


 OK?
Direi di no. Va trattato come i ListBox, MaskEdit e TextBox..., quindi (nota
anche cos'ho commentato, in quanto diventa inutile):
Function Completo(oggetto_form As Object) As Boolean
    Dim Obj As Object, opt As Boolean, cek As Boolean, comb As Boolean
    Dim presenti_opt As Boolean, presenti_cek As Boolean, presenti_comb As
Boolean
    Completo = True
    opt = False
    cek = False
    'comb = False
    presenti_opt = False
    presenti_cek = False
    'presenti_comb = False
    For Each Obj In oggetto_form.Controls
            'OptionButton
        If TypeOf Obj Is OptionButton Then
            presenti_opt = True
            If Obj.Value Then opt = True
        End If
            'CheckBox
        If TypeOf Obj Is CheckBox Then
            presenti_cek = True
            If Obj.Value Then cek = True
        End If
            'ComboBox
        If TypeOf Obj Is ComboBox Then
            'presenti_comb = True
            If Obj.ListIndex < 0 Then
'                Al posto del test sopra, piů "generalmente" metterei
'                (per ammettere un campo non presente nell'elenco, ma
digitato nel testo, vedi tu)
'                quanto segue:
'            If Obj.Text = "" Then


         End If
Eh si... era proprio quell' "opzione" sul testo digitato a fare la
differenza. Anche se funziona solo
cosi':
    'ComboBox
        If TypeOf Obj Is ComboBox Then
            presenti_comb = True
            If Obj.ListIndex >= 0 Then
            comb = True
            ElseIf Obj.ListIndex < 0 Then
             If Obj.Text = "" Then
                Completo = False
                Exit For
             End If
            End If
        End If
Grazie


A questo punto... non faresti cosi' ? :
    'ComboBox
        If TypeOf Obj Is ComboBox Then
            presenti_comb = True
            If Len(Obj.Text) > 1 Then
            comb = True
            Else
            Completo = False
               Exit For
             End If
          End If


           End If
Francamente mi sto confondendo. Se vuoi che la funzione restituisca False
anche se _un solo_ ComboBox ha un testo vuoto, così come avviene per (ad
esempio) i TextBox, a me pare che ti basti uscire dal For appena scopri un
combobox con la proprietà Text vuota...
Ho, effettivamente un dubbio: Se io seleziono un elemento di un combo e poi
ne elimino il testo, l'elemento resta selezionato? Forse sì, ma allora la
domanda è: tu recupererai il valore dell'elemento selezionato o il testo? Se
il testo (come normalmente si fa per un combo, non per un listbox che non ha
zona testo), mi permetterei di insistere che basta testare solo la proprietà
Text e quindi punterei nuovamente sull'ultima che ho postato...

Ho provato in tutte le salse, prima selezione della voce del combo,poi
digitando il testo, poi cancellando il testo, poi riselezionando la voce
dopo la cancellazione del testo:
questa funziona bene:
If TypeOf Obj Is ComboBox Then
            presenti_comb = True
            If Len(Obj.Text) < 1 Then
              Completo = False
              Exit For
            End If
End If
Ok Lupo. Possiamo considerare conclusa la "faccenda".
Resta il fatto che CSSoft aveva MOLTA ragione dicendo che era una parziale
soluzione del problema.Questa Function che volevo chiamare Completo
(riferito al form) completa non è.
Mi riferisco ai buchi dati dai CheckBox perchè se sono più d'uno e li testo
accettandone anche uno solo... perchè allora non farli OptionButton? (già)
se poi parliamo di questi ultimi e ne inserisci alcuni nel form (dove ne
"testi" valido uno) e alcuni in un frame... diciamo che sei spacciato ?
Ti ringrazio molto.Se mi posso permettere, dirò che per questa volta
"abbiamo studiato assieme" è stato interessante ed istruttivo.
Per quanto riguarda il ByVal e ByRef , ho provato e il tutto funzione in
entrambi i modi... Bah !?
Ciao.


 in entrambi i modi... Bah !?
Anche nella DLL?

 Anche nella DLL?
La domanda presuppone un errore... cosa dovrebbe succedere?.
Il tutto sembra funzionare, come ti scrivevo... a meraviglia in entrambi i
casi...non è che scopro a cose fatte di aver involontariamente fatto partire
un "razzo nucleare" con detonazione ritardata ?
Grazie.


 ritardata ?
No, continuiamo a volare bassi...

 Magari stasera ci faccio un ragionamento e magari un po' di codice.
Ci ho ripensato, nel senso che mentre ragionavo sul codice (a parte la sua
complessità) mi pare d'aver compreso che ... non serve. Mi spiego.
Innanzi tutto, non è corretto dire che puoi trasformare i vari CheckBox in
gruppo/i di OptionButton perchè i primi, pur se raggruppati logicamente
(indipendentemente cioè dal loro Container), ti consentono 0/una/più/tutte
attivazioni/spunte, mentre i secondi (nell'ambito di ogni gruppo
logico/"fisico" determinato dal Container) una sola attivazione.
Ma, proprio per quanto detto sopra, non credo che sia possibile fare
qualcosa di generalizzato per quanto riguarda i CheckBox, ovvero penso che
la loro "validazione" debba essere fatta secondo logica ed esplicitamente,
non in una Function generica, proprio perchè, se la scelta del controllo è
oculata e corretta, possono essere tutti unchecked, tutti checked o misti.
Per gli OptionButton, un po' per gli stessi motivi di logica e per lo
specifico utilizzo di tale controllo, darei per scontato che, per ogni
gruppo, uno debba essere attivato sin dall'inizio, in termini propositivi.
Per intenderci e IMHO^100, se vedessi una maschera che mi si presenta con
uno o più gruppi di OptionButton completamente vuoti/senza pallino, mi
verrebbe un immediato attacco di diarrea.
Seriamente, che senso ha prevedere delle opzioni e non fornirne un default?
Ovviamente ben sapendo/pretendendo che una scelta dovrà essere fatta...
Inoltre, non trascuriamo il fatto che, spesso e volentieri (certo, non
sempre) lo stato di un determinato controllo (Option o Check o, persino,
List o Text) determina anche la struttura della finestra, ovvero un
adeguamento contestuale e immediato. Quindi, per finire, io non mi porrei
proprio il problema di testare se l'operatore ha indicato un'opzione per
ogni gruppo, ma pretenderei (perchè mi pare logico) che un'opzione sia
presente sin dall'inizio e, quindi (non potendo disattivare un'opzione se
non attivandone un'altra), anche alla fine.

 alla fine.
Confermo il fatto che leggendo e dialogando in questo NG si impara
sempre...anche se, a volte si deve ricevere qualche "rimbrotto".... "è un
mondo difficile !..." :-)))
Grazie
Ciao
