Newsgroup: it.comp.lang.visual-basic
Titolo: Array di controlli su + form

Ciao a tutti,
ho alcune form sulle quali ho messo un controllo (flexgrid).
Vorrei non dover scrivere lo stesso codice per gli eventi di questi
controlli quando devono fare la stessa cosa.
Se fossero però sulla stessa form creerei degi array e gestirei la cosa
con l'index.
Ma essendo su form diverse come posso fare?
Grazie
Ciao
A.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Ma essendo su form diverse come posso fare?
crei un modulo con tutte le funzioni che ti servono e negli eventi dei
controlli nei vari form scrivi soltanto la chiamata alla funzione.
ciao,
Marco

 con l'index.
Cerca il thread <.NET "Illuminare i campi"> di qualche giorno fa, in
particolare la risposta di Luca.
Ciao
--
Math Parser, VB.Framework : 
http://www.neodatatype.net
Sito Comune               : 
http://www.it-lang-vb.net

 wrote in message news:5cQZa.71903
PS: Il discorso vale anche se non stai usando .NET.



Magari... in VB6 quel sistema purtroppo ce lo sognamo
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Magari... in VB6 quel sistema purtroppo ce lo sognamo
Perchč?
Non puoi derivare oggetti, ma si puņ simulare la cosa comunque scrivendo un
controllo wrapper.


 controllo wrapper.
Ma devi creare uno user control, rimappare una per una le
property/eventi/metodi del textbox, (si, ho capito che lo fa il wizard,
pero'...) e quant'altro.
Soprattutto devi fisicamente sostituire tutti i textbox esistenti e
controllare eventuale codice che si riferisce alla classe 'TextBox' perche'
smette di funzionare; inoltre alcune property, ovvero quelle in sola lettura
a runtime tipo Multiline e Scrollbars, non riesci proprio a rimapparle (io
per lo meno non so come fare).
Per carita', qualcosa riesci a fare, ma certo e' tutta un'altra storia...


Per carita', qualcosa riesci a fare, ma certo e' tutta un'altra storia...
A confronto anche la vituperata MFC diventa una passeggiata ;-)
-- 
ciao, hal

 Ma essendo su form diverse come posso fare?
utilizzando opportunamente l'API SetParent puoi spostare da un contenitore
ad un altro qualsiasi controllo che esponga la proprieta' hWnd.
quindi con un semplice
setparent mioform.hwnd, miocontrollo.hwnd
trasferisci il controllo già esistente su altro form con tutti gli eventi,
metodi e proprieta' e relativo codice gia' impostati.
fai molta attenzione al caricamento\scaricamento dei vari controlli nei
form.
beppe

 ad un altro qualsiasi controllo che esponga la proprieta' hWnd.
[SNIP]
Pero' se vuoi usarne piu' di uno contemporaneamente, peggio ancora
caricandoli con dati diversi, sei nei guai.


 caricandoli con dati diversi, sei nei guai.
partendo dal presupposto che il problema fosse la non riscrittura del codice
nei vari form per tipologia di controllo, ho dato la risposta piu'
semplicistica; infatti nulla mi vieta di utilizzare un array di controlli e
di spostarli dove meglio credo.
es: in form1 ho il controllo textbox T index 0; nell'evento keypress di T(0)
faccio controlli sulla validita' del premuto.
voglio caricare uno stesso controllo in form2 ed in form3, quando chiamati
rispettivamente da command1 e command2.
nel form1
sub command1_click()
    load T(1)
    T(1).visible=true
    T(1).text=""
    T(1).top=100
    T(1).left=100
    form2.show 1
end sub
sub command2_click()
    load T(2)
    '//
    'ecc. ecc.
    '//
    form3.show 1
end sub
sub T_keypress(index as integer, keyascii as integer)
    select case keyascii
        case 48 to 57
        case else
            keyascii=0
    end select
end sub
nel form2
sub form_load()
    setparent form1.T(1).hwnd, me.hwnd
end sub
sub form_unload(cancel as integer)
    unload form1.T(1)
end sub
lo stesso nel form3 ma con indice T(2).
e' chiaro che ciascun controllo clonato dovra' avere le proprie
impostazioni; se ad esempio non provvedo a resettare il contenuto del T(1)
nel momento in cui lo vado a caricare, questo conterra' la stringa gia'
inserita in T(0) nel form1, quindi direi che non e' un problema della
soluzione proposta, quanto di farne un uso oculato e corretto.
beppe

 Ma essendo su form diverse come posso fare?
Oltre alle vie già suggerite, te ne passo una terza, esemplificata al volo
(il codice è "bruttino", ma riesco ad avere poco tempo anche in ferie...),
ma penso in modo comprensibile:
Nuovo progettto:
file progetto1.vbp:
=============
Type=Exe
Form=Form1.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\WINNT\
System32\stdole2.tlb#OLE Automation
Class=Class1; Class1.cls
Module=Module1; Module1.bas
Form=Form2.frm
IconForm="Form1"
Startup="Sub Main"
HelpFile=""
Title="Progetto1"
Command32=""
Name="Progetto1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="exIT s.r.l."
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[MS Transaction Server]
AutoRefresh=1
file Module1.bas:
============
Attribute VB_Name = "Module1"
Option Explicit
Public prova As New Class1
Sub main()
    Form1.Show
    Form2.Show
End Sub
file Class1.cls:
==========
VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "Class1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Dim WithEvents MyForm As Form
Attribute MyForm.VB_VarHelpID = -1
Dim WithEvents TextBoxes As TextBox
Attribute TextBoxes.VB_VarHelpID = -1
Public Property Set formattivo(frm As Form)
    Set MyForm = frm
    MyForm.KeyPreview = True
End Property
Private Sub MyForm_KeyPress(KeyAscii As Integer)
    Set TextBoxes = MyForm.ActiveControl
End Sub
Private Sub textboxes_KeyPress(KeyAscii As Integer)
    MsgBox "premuta " & KeyAscii & " in " & MyForm.Name
End Sub
file Form1.frm (e, identico, form2.frm):
===========================
VERSION 5.00
Begin VB.Form Form1
   Caption         =   "Form1"
   ClientHeight    =   3195
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  'Windows Default
   Begin VB.TextBox Text1
      Height          =   495
      Left            =   600
      TabIndex        =   0
      Top             =   1320
      Width           =   2415
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Sub Form_Activate()
    Set prova.formattivo = Me
End Sub
ciao
ugo


p.s.
se devi elaborare array di controlli, tuttavia, non puoi usare la
withevents.
Dovrai gestire il tutto direttamente nella
MyForm_KeyPress
ciao
ugo