Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[VB2010] Nome di oggetti form

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

[VB2010] Nome di oggetti form

Postdi Ivan_J_147 » 30/03/11 08:53

Ciao a tutti.
Da poco sono passato a VB2010, e sono ancora poco pratico dell'ambiente. Vi chiedo quindi scusa se il mio dubbio può essere stupido o banale.
Considerando che in VB2010 anche i form sono oggetti, ho creato un form frmDX, in cui è presente questa sub in risposta all'evento ResizedEnd.

Codice: Seleziona tutto
Private Sub frmDx_ResizeEnd(sender As Object, e As System.EventArgs) Handles Me.ResizeEnd
    frmMonitor.RidimensionamentoFrmDx(Me)
End Sub


Nel frmMonitor qui sopra citato invece ho istanziato 4 form in questo modo:
Codice: Seleziona tutto
Dim frmDxTop As New frmDx
Dim frmDxFront As New frmDx
Dim frmDxFree As New frmDx
Dim frmDxSide As New frmDx


A questo punto, quando ridimensiono uno dei 4 form, e si avvia la sub RidimensionamentoFrmDx, vorrei poter riconoscere quale form sto ridimensionando.
Scrivendo però:
Codice: Seleziona tutto
Public Sub RidimensionamentoFrmDx(frm As Form)
     debug.print frm.Name
End Sub

il programma scrive sempre "frmDx", trovando quindi il nome del form creato, ma non delle sue istanze.
Come posso ricavare quale istanza sto ridimensionando?
Grazie in anticipo per l'aiuto...
Ivan_J_147
Utente Junior
 
Post: 86
Iscritto il: 04/09/06 15:32

Sponsor
 

Re: [VB2010] Nome di oggetti form

Postdi hydra » 30/03/11 09:10

Ma tu il metodo lo richiami sull'evento ResizedEnd di ogni form o solo su un form? Perchè nel secondo caso ovviamente ti darà in uscita sempre lo stesso nome.
Avatar utente
hydra
Moderatore
 
Post: 7002
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Re: [VB2010] Nome di oggetti form

Postdi Ivan_J_147 » 30/03/11 10:08

i form li creo dinamicamente (ovvero li istanzio nel form_load del frmmonitor), quindi, che io sappia, non posso gestire separatamente l'evento resizeEnd.
Ho visto che facendo così posso distinguere i vari form:
Codice: Seleziona tutto
Public Sub RidimensionamentoFrmDx(frm As Form)
        Dim Index As Integer
        If (frm.Equals(frmDxTop)) Then
            Index = 0
        ElseIf (frm.Equals(frmDxFront)) Then
            Index = 1
        ElseIf (frm.Equals(frmDxFree)) Then
            Index = 2
        ElseIf (frm.Equals(frmDxSide)) Then
            Index = 3
        End If
end sub

ma mi sembra una soluzione poco funzionale quando i form cominciano a diventare tanti.
Avrei bisogno di controllare una proprietà in modo perlomeno da poter buttare tutto in un Select case.
Dici quindi che non è possibile?
Ivan_J_147
Utente Junior
 
Post: 86
Iscritto il: 04/09/06 15:32

Re: [VB2010] Nome di oggetti form

Postdi hydra » 30/03/11 10:24

In realtà quello che tu crei è un'istanza del form, ma il form in se è un form in tutto e per tutto, quindi ha le sue proprietà e i suoi eventi. Quindi devi comunque utilizzare l'evento ResizedEnd in ogni form per catturare quell'evento sul form.
Dovresti poi crearti un metodo pubblico (nel form monitor o in una classe separata)
Codice: Seleziona tutto
Public Sub RidimensionamentoFrmDx(frm As Form)

Poi ti dichiari nei vari form delle variabili pubbliche che puntino al form principale
Codice: Seleziona tutto
public pMonitor as frmMonitor

quindi quando crei l'istanza al form, assegni il riferimento al form principale
Codice: Seleziona tutto
frmDxTop = new frmDxTop()
frmDxTop.pMonitor = me
frmDxTop.Show()

a questo punto nel form frmDxTop puoi accedere al metodo globale
Codice: Seleziona tutto
pMonitor.RidimensionamentoFrmDx(me)


PS: è un po' che non programmo in vb, quindi alcune parentesi potrebbero essere superflue.
Avatar utente
hydra
Moderatore
 
Post: 7002
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Re: [VB2010] Nome di oggetti form

Postdi Ivan_J_147 » 30/03/11 13:44

ah ok! speravo ci fosse già qualche proprietà che facesse sto lavoro, ma se non c'è la tua soluzione mi sembra ottima!!
grazie 1000!!
Ivan_J_147
Utente Junior
 
Post: 86
Iscritto il: 04/09/06 15:32

Re: [VB2010] Nome di oggetti form

Postdi hydra » 30/03/11 14:05

Ma infatti io non riesco a capire perchè devi creare un metodo che richiami in un evento della finestra e che ti dice che finestra ha chiamato il metodo, quando basta che metti il codice nell'evento. :roll:
Avatar utente
hydra
Moderatore
 
Post: 7002
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Re: [VB2010] Nome di oggetti form

Postdi Ivan_J_147 » 30/03/11 14:51

allora, nella mia applicazione ho un form mdi (frmmonitor) e 4 form child.
Quando scatta l'evento in uno dei 4 form, devo fare alcune operazioni che coinvolgono oggetti del frmmonitor. Io quindi potrei, come dici tu, gestire tutto nell'evento del form child creato, però in tal caso perderei la "duttilità" del form. Nel senso che se decidessi di utilizzarlo come child anche in un altro form parent mi troverei a dover modificare l'evento. In questo modo invece posso utilizzare il form ovunque, perchè non va a interagire col form parent.
Quando io all'inizio della discussione ho scritto
Codice: Seleziona tutto
Private Sub frmDx_ResizeEnd(sender As Object, e As System.EventArgs) Handles Me.ResizeEnd
    frmMonitor.RidimensionamentoFrmDx(Me)
End Sub

era per semplificare il problema.
In realtà nel mio programma l'evento è così dichiarato:
Codice: Seleziona tutto
Private Sub frmDx_ResizeEnd(sender As Object, e As System.EventArgs) Handles Me.ResizeEnd
      Select Case Sistema.prp_formAttivo.Name
            Case "frmMonitor"
                frmMonitor.RidimensionamentoFrmDx(Me)
      End Select
End Sub

Così quando dovrò usare il form in altri form parent dovrò solo aggiungere una riga di codice.
Spero di essermi spiegato decentemente. ;)
Ivan_J_147
Utente Junior
 
Post: 86
Iscritto il: 04/09/06 15:32

Re: [VB2010] Nome di oggetti form

Postdi hydra » 30/03/11 15:12

Aaaaah, ma vedi che stiamo parlando di mdiparent e child. Allora si è diverso. C'è un modo per recuperare l'elenco dei child aperti, adesso a memoria non mi ricordo come. Forse con me.MDIChildren.
Avatar utente
hydra
Moderatore
 
Post: 7002
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Re: [VB2010] Nome di oggetti form

Postdi Ivan_J_147 » 30/03/11 15:31

si ok, però dovrei usare ancora il metodo Equal o, come mi dicevi, creare una variabile che tenga traccia dell'istanza. Mi serve a poco sapere che sono MDIchildren. o sbaglio..?
Ivan_J_147
Utente Junior
 
Post: 86
Iscritto il: 04/09/06 15:32

Re: [VB2010] Nome di oggetti form

Postdi hydra » 30/03/11 16:01

Per quanto riguarda gli eventi, puoi crearli dinamicamente anche da codice. Quindi potresti quando crei il form creare anche l'evento, andando però ad associare ogni volta lo stesso evento. Se metti ad esempio di avere un form mdi con un menù per creare un form, nel codice puoi mettere una cosa tipo
Codice: Seleziona tutto
int frmID = 0;

private void nuovaToolStripMenuItem_Click(object sender, EventArgs e)
{
    Form frmAdd = new Form();
    frmAdd.MdiParent = this;
    frmAdd.Name = frmID++.ToString();
    frmAdd.FormClosing += new FormClosingEventHandler(frmAdd_FormClosing);
    frmAdd.Show();
}

L'istruzione
Codice: Seleziona tutto
frmAdd.FormClosing += new FormClosingEventHandler(frmAdd_FormClosing);
ti permette di creare l'evento Closing per ogni nuovo form che crei.
Poi definisci l'evento con
Codice: Seleziona tutto
void frmAdd_FormClosing(object sender, FormClosingEventArgs e)
{
    Form f = (Form)sender;
    MessageBox.Show(f.Name);
}

In questo modo nella variabile f avrai il riferimento al form che ha fatto scattare l'evento (e nello specifico ti mostra il nome della finestra).

Se invece metti di avere un altro menuitem per visualizzare l'elenco dei form child, puoi scrivere una cosa tipo
Codice: Seleziona tutto
private void listaToolStripMenuItem_Click(object sender, EventArgs e)
{
    List<Form> formsList = this.MdiChildren.ToList<Form>();

    foreach (Form frm in formsList)
    {
        MessageBox.Show(frm.Name);
    }
}

Questo ti mostra per ogni mdichild aperta un messagebox col nome della finestra.

L'esempio è in c# ma non dovresti aver difficoltà a tradurlo in vb. :D
Avatar utente
hydra
Moderatore
 
Post: 7002
Iscritto il: 19/07/04 08:06
Località: Vallis Duplavis

Re: [VB2010] Nome di oggetti form

Postdi Ivan_J_147 » 09/04/11 10:18

ooook! afferrato il concetto!!
Ora vedrò quale soluzione è meglio adottare, anche perchè come ho già scritto i form che vado a creare dinamicamente sono solo 4 (ed è praticamente impossibile che io in futuro debba aggiungerne altri), quindi posso tranquillamente evitare implementazioni più efficaci ma meno leggibili.
Grazie 1000 per l'aiuto!! ;)
Ivan_J_147
Utente Junior
 
Post: 86
Iscritto il: 04/09/06 15:32


Torna a Programmazione


Topic correlati a "[VB2010] Nome di oggetti form":


Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti