Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Costruzione di una maschera e relativi eventi da codice

Per un programma che deve gestire diversi tipi di inserimento, vorrei dare
all'utente la possibilità di selezionare un sottoinsieme di campi, l'ordine
in cui devono essere elaborati, ed eventualmente la posizione nella form, e
poi di salvarla e richiamarla quando ne ha bisogno.
Naturalmente però ho bisogno di gestire una serie di eventi, sia a livello
di form(controlli di congruità, scrittura di un log, ecc.., che a livello di
campi (i controlli più classici).
Un'idea che mi è venuta è quella di creare una formcon TUTTI i campi e poi
rendere invisibili quelli che non sono stati selezionati e modificare da
codice l'ordine di tabulazione e la posizionesulla form nell'evento load.
Così, credo, funzionerebbe, ma siccome i campi sono un centinaio il
caricamento della form sarà lentissimo.
Ovviamente l'ideale sarebbe creare la form da codice ma, mi chiedevo, è
possibile agganciare ad un controllo inserito a run-time il codice di
gestione di un certo evento (a naso direi di no, essendo compilato, ma non
si sa mai...)?
qualcuno ha qualche idea, o suggerimento, anche che non vada in questa
direzione, ma che risolva il problema ?
Grazie a tutti in anticipo
Ciao
Alfonso

Se la permutazione dei gruppi di controlli non è 
proprio totale, ovvero se la presenza di un gruppo
di controlli è mutuamente esclusiva a quella di
uno o più gruppi, potresti provare a disegnare
una serie di UserControls.
Sul form Container gestisci la presenza/assenza
o semplicemente le dimensioni degli UC (se width = 0
e Height = 0 ...), il loro Zorder; i relativi eventi 
sono gestibili parametrizzando delle function in un 
modulo .bas comune.
Al limite fissi un valore-soglia, un flag, che 
condizioni l'esecuzione del codice delle function.
Io, in situazione analoga, ho creato una successione
che emula un wizard; propri del form container 
sono solo i cmd Next, Previous, Cancel, Apply.
Il resto sono frames UC che si alternano.
Non trascurare di verificare quali sono le 
risoluzioni video dei monitor degli Users.
Se convivono situazioni eterogenee: auguri.
In 800*600, potresti aver necessità di ridimensionare
i controlli...
Se optassi per gli UC ti consiglierei di gestirne
la sequenza tramite una collection:
la popoli e la svuoti dinamicamente nei click
di Next e Previous.
E, in generale, è pericoloso lasciare che 
uno User possa arbitrariamente decidere quanti 
controlli caricare: proponi tu diversi set possibili
tra i quali scegliere; questo ti *solleva* da
disallineamenti nelle valorizzazioni e favorisce
l'omogeneità tra i dati che devi registrare.
Ciao
	Adriano


 campi (i controlli più classici).
[SNIP]
Crea una form vuota e inserisci questo codice, preso pari pari dalla guida, che
dovrebbe fare al caso tuo (aggiunta di controllo a run-time e gestione
dell'evento):
Option Explicit
Private WithEvents btnObj As CommandButton
Private Sub btnObj_Click()
   MsgBox "Pulsante aggiunto in modo dinamico."
End Sub
Private Sub Form_Load()
   Set btnObj = Controls.Add("VB.CommandButton", "btnObj")
   With btnObj
      .Visible = True
      .Width = 2000
      .Caption = "Salve"
      .Top = 1000
      .Left = 1000
   End With
End Sub
per i dettagli cerca nell'help "Metodo Add (insieme Controls)"
Ciao
--
Luca Dormio
luca....@tin.it

> Alfonso Moscato:

  Sin dai tempi antichi in casi del genere io ho usato il sistema
di piazzare sul form un controllo, con indice zero, per ogni
tipologia di controlli da usare, usando poi una matrice di oggetti
da popolare a runtime gestendo l'eventuale load dei controlli con
indice superiore a zero.
  Dato pero` che sicuramente questa metodologia la conosci deduco
tu l'abbia scartata quindi la risposta di Arj dovrebbe essere
sicuramente (o meglio probabilmente, visto il mio mediocre grado
di approfondimento delle questioni da lui esposte) piu`
rispondente.
  O forse non ho capito proprio niente?
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 [...]

Sì mi sembra una buona idea. In questo modo posso crearmi dei controlli che
hanno già dentro di sè tutte le verifiche di integrità. Quello che mi rimane
da fare è soltanto gestire gli eventuali controlli che si incrociano tra due
UC, e non dovrebbe essere impossibile.
La collection ok, ma non potrei usare un array di controlli (non so se con
gli UC si può utilizzare)?
Ciao e grazie
Alfonso
"Arj" <A...@Arj.exe> ha scritto nel messaggio
news:3AFBA9A4...@Arj.exe...

[...]

 ha scritto nel
messaggio news:9dgd8q$hutsa$1...@ID-52090.news.dfncis.de...
[...]


 voglio poter gestire i vari eventi dei controlli.
Se l'elenco di tutti i possibili campi e' finito e stabilito a priori, e quindi
l'utente ha semplicemente la possibilita' di creare un form scegliendo una
qualsiasi combinazione di campi, allora il sistema che ti suggerivo dovrebbe
andare bene:
in *design* utilizzi un
Public WithEvents ...
per ogni possibile controllo, quindi inserisci il codice in tutti gli eventi che
ne hanno bisogno; il risultato e' una form vuota ma con *tutti* i gestori di
evento definiti e compilati. In fase di runtime quello che devi fare e'
Controls.Add ...
per ogni controllo presente nella lista personalizzata dall'utente, ad esempio:
L'utente vuole un form che contenga solo i campi Cognome, Nome, Titolo di studio
e il tasto Aggiorna; nel tuo form avrai
'[...] dichiarazione di altri controlli non selezionati nel nostro caso
Public WithEvents txtCognome  As TextBox
Public WithEvents txtNome     As TextBox
Public WithEvents cboTitolo   As ComboBox
Public WithEvents cmdAggiorna As CommandButton
'[...] dichiarazione di altri controlli non selezionati nel nostro caso
'questi sono i gestori di evento stabiliti in design
Private Sub txtCognome_Change()
If Len(txtCognome) > 50 Then
    MsgBox "La lunghezza massima del campo e' 50"
End If
End Sub
Private Sub txtNome_Change()
If Len(Nome) > 30 Then
    MsgBox "La lunghezza massima del campo e' 30"
End If
End Sub
Private Sub cboTitolo_Click()
If cboTitolo.ListIndex = -1 Then
    MsgBox "Selezionare un titolo di studio"
End If
End Sub
Private Sub cmdAggiorna_Click()
If AggiornaDB Then
    MsgBox "Aggiornamento completato"
Else
    MsgBox "Errore in fase di aggiornamento"
End If
End Sub
Private Sub Form_Load()
For Each ControlloCustom in ListaControlliCustom
    Select Case ControlloCustom.Nome
        '[...] case su altri controlli
        Case "Cognome"
            Set txtCognome = Controls.Add("VB.TextBox", "txtCognome")
            With txtCognome
              .Visible = True
              .Width = ControlloCustom.Width
              .Top = ControlloCustom.Top
              .Left = ControlloCustom.Left
           End With
        Case "Nome"
            Set txtNome = Controls.Add("VB.TextBox", "txtNome")
            With txtNome
              .Visible = True
              .Width = ControlloCustom.Width
              .Top = ControlloCustom.Top
              .Left = ControlloCustom.Left
           End With
        Case "Titolo"
            Set cboTitolo = Controls.Add("VB.ComboBox", "cboTitolo")
            With cboTitolo
              .Visible = True
              .Width = ControlloCustom.Width
              .Top = ControlloCustom.Top
              .Left = ControlloCustom.Left
           End With
        Case "Aggiorna"
            Set cmdAggiorna = Controls.Add("VB.CommandButton", "cmdAggiorna")
            With cmdAggiorna
              .Visible = True
              .Caption "Aggiorna archivio"
              .Width = ControlloCustom.Width
              .Top = ControlloCustom.Top
              .Left = ControlloCustom.Left
           End With
        '[...] case su altri controlli
    End Select
Next
End Sub
dove ControlloCustom e' un'ipotetica classe, struttura o quant'altro creato da
te per memorizzare le impostazioni scelte dall'utente in fase di
personalizzazione.
Prova un po'... magari ho toppato di nuovo nell'interpretare il problema ma non
mi sembra, in fondo questa non e' altro che una variante piu' pulita e leggera
(e appena un po' piu' complicata) del "metto tutti i controlli invisibili in
design"



[...]

 qualche idea ?
[SNIP]
Basta definire una variabile e metodo pubblico nella form, diciamo
Private CurrentList As <Collection, array o quello che serve>
Public Sub InitForm(ListaControlliCustom As <Collection, array o quello che
serve>)
'ListaControlliCustom e' il solito elenco di opzioni scelte dall'utente,
'lo memorizziamo semplicemente nella variabile interna, che verra' poi
'interpretata nel Form_Load.
Set CurrentList = ListaControlliCustom
End Sub
quando devi visualizzare le diverse istanze usi invece qualcosa di questo tipo:
'frmCustom e' la form vuota definita in design
Dim frmUtente1 As frmCustom
Dim frmUtente2 As frmCustom
Set frmUtente1 = New frmCustom
frmUtente1.InitForm(ListaUtente1)
frmUtente1.Show
Set frmUtente2 = New frmCustom
frmUtente2.InitForm(ListaUtente2)
frmUtente2.Show
dove ListaUtente1 e ListaUtente2 sono due diverse personalizzazioni.


 > controllo, e pensavo che mi proponessi di farlo a design time.. Ora ho
[...]