Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di tony83
    Registrato dal
    Feb 2005
    Messaggi
    3,179

    <GESTIONE FORM> Non aprire form già aperti

    Scusate quali sono le possbilià che abbiamo a disposizione per far si che si controlli che il form chiamato non sia già aperto e gestirlo, quando un form non esiste aprilo, quando è già aperto non riaprirlo ma al massimo riaggiornarlo e metterlo in primo piano?
    Tony

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Quando il form deve essere aperto, basta memorizzare il riferimento in una variabile, eventualmente impostandola a Nothing quando il form viene chiuso.

    Controllando quindi il valore di questo riferimento, è possibile sapere se il form esiste oppure no.

    Supponendo che il form debba essere solo nascosto e non "chiuso" in modo definitivo, basta ispezionare la proprietà Visible attraverso, appunto, il riferimento di cui prima.

    Per esigenze più complesse, istanze multiple dello stesso form e così via, il riferimento a ciascun form creato può essere memorizzato in strutture più complesse, come liste (ArrayList) e affini.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di tony83
    Registrato dal
    Feb 2005
    Messaggi
    3,179
    Originariamente inviato da alka
    Quando il form deve essere aperto, basta memorizzare il riferimento in una variabile, eventualmente impostandola a Nothing quando il form viene chiuso.

    Controllando quindi il valore di questo riferimento, è possibile sapere se il form esiste oppure no.

    Supponendo che il form debba essere solo nascosto e non "chiuso" in modo definitivo, basta ispezionare la proprietà Visible attraverso, appunto, il riferimento di cui prima.

    Per esigenze più complesse, istanze multiple dello stesso form e così via, il riferimento a ciascun form creato può essere memorizzato in strutture più complesse, come liste (ArrayList) e affini.

    Ciao!
    nel caso che sia già aperto però mi servirà riaggiornare tutto il contenuto e mettere il form in primo piano quindi teoricamente devo chiudere il precedente per riaprirne un'altro..

    Resta il fatto che teoricamente i form invisibile non mi piacciono molto perchè sprecano memoria inutile

    come posso fare gestendo la memoria e la pulizia del codice in maniera migliore?


    grazie ciao
    Tony

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da tony83
    nel caso che sia già aperto però mi servirà riaggiornare tutto il contenuto e mettere il form in primo piano quindi teoricamente devo chiudere il precedente per riaprirne un'altro..
    Sì, è vero, il tutto dipende comunque da ciò che devi fare.

    Se ciascun Form possiede un metodo con cui preleva e visualizza i dati aggiornati, basta invocarlo per ottenere l'effetto desiderato senza ricreare il form.

    Originariamente inviato da tony83
    Resta il fatto che teoricamente i form invisibile non mi piacciono molto perchè sprecano memoria inutile
    Non posso che confermare. Anche in questo caso, fermo restando questa condizione, dipende sempre da ciò che si vuole ottenere.

    Originariamente inviato da tony83
    come posso fare gestendo la memoria e la pulizia del codice in maniera migliore?
    Le soluzioni a grandi linee te le ho già elencate. La scelta ricade su di te, in base a come devono comportarsi i form che compongono la tua applicazione.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di tony83
    Registrato dal
    Feb 2005
    Messaggi
    3,179
    in questo caso:
    Se ciascun Form possiede un metodo con cui preleva e visualizza i dati aggiornati, basta invocarlo per ottenere l'effetto desiderato senza ricreare il form
    come posso lavorarci sopra?

    hai x caso qualche esempio di codice semplice semplice???

    grazie
    Tony

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da tony83
    come posso lavorarci sopra?
    hai x caso qualche esempio di codice semplice semplice???
    Dovresti spiegare precisamente come si comportano i form della tua applicazione.

    Quali form hai a disposizione? Cosa devono fare? Come devono essere visualizzati?

    Se non so come deve funzionare la tua applicazione e come deve comunicare con l'utente, non posso farti alcun esempio.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di tony83
    Registrato dal
    Feb 2005
    Messaggi
    3,179
    Originariamente inviato da alka
    Dovresti spiegare precisamente come si comportano i form della tua applicazione.

    Quali form hai a disposizione? Cosa devono fare? Come devono essere visualizzati?

    Se non so come deve funzionare la tua applicazione e come deve comunicare con l'utente, non posso farti alcun esempio.
    no intendevo dire qual'è il metodo migliore x fare questo:

    nel caso che sia già aperto però mi servirà riaggiornare tutto il contenuto e mettere il form in primo piano

    ed evitare quindi di chiudere il precedente per riaprirne un'altro
    Tony

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da tony83
    no intendevo dire qual'è il metodo migliore x fare questo:
    nel caso che sia già aperto però mi servirà riaggiornare tutto il contenuto e mettere il form in primo piano
    ed evitare quindi di chiudere il precedente per riaprirne un'altro
    Immagino che il Form interessato sia un "figlio" (non nel senso MDI del termine) del Form principale, cioè la responsabilità di aprire quel form ricade sul Form principale. Confermi?

    In tal caso, aggiungi un campo alla tua classe che rappresenta il form principale che appartenga allo stesso tipo del form secondario; esemplificando, qualcosa come

    codice:
    Public Class MyMainForm
        Private ChildForm As  MyChildForm
    End Class
    In questo modo, hai a disposizione una variabile utilizzabile da tutti i metodi (procedure/funzioni di una classe) per immagazzinare al suo interno il riferimento al Form secondario.
    Quando devi creare il form, scriverai un codice simile al seguente:

    codice:
    If ChildForm Is Nothing Then
        ChildForm = New MyChildForm()
    End If
    ChildForm.Show()
    In sostanza, se ChildForm è la variabile che contiene il riferimento al form secondario che hai creato, e che dovrà essere impostato a Nothing quando quel form viene distrutto - anche se mi pare di capire che esso dovrà essere presente in memoria per tutta la durata dell'applicazione - è sufficiente controllarne, appunto, l'equivalenza con Nothing per determinare se è necessario o meno creare il form secondario; in seguito, il form viene visualizzato con il metodo Show.

    Inserendo questo codice in una procedura del form principale, basta invocarlo ogni volta che serve rendere visibile il form.

    Va detto poi che se devi compiere inizializzazioni sul form stesso, puoi sempre introdurre un metodo all'interno della classe del Form secondario, qualcosa di simile a

    codice:
    Public Class MyChildForm
        Public Sub InitializeMe()
            ' Qui le tue inizializzazioni...
        End Sub
    End Class
    da richiamare prima di visualizzare il form

    codice:
    If ChildForm Is Nothing Then
        ChildForm = New MyChildForm()
    End If
    ChildForm.InitializeMe()
    ChildForm.Show()
    Ci sono tante alternative a questo approccio, è solo un esempio dimostrativo.

    Non ho verificato sintatticamente il codice, poiché lo scritto direttamente qui, quindi va senz'altro adattato e forse corretto un minimo; io preferisco sempre spostare l'attenzione verso il significato del codice, quando si tratta di spiegare qualcosa, piuttosto che dall'uso derivante dal semplice "copia e incolla".

    Insomma, concentrati sull'aspetto concettuale della soluzione proposta piuttosto che sui meri stralci di codice che hanno la semplice funzione di decorare la spiegazione teorica.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it L'avatar di tony83
    Registrato dal
    Feb 2005
    Messaggi
    3,179
    Originariamente inviato da alka
    Immagino che il Form interessato sia un "figlio" (non nel senso MDI del termine) del Form principale, cioè la responsabilità di aprire quel form ricade sul Form principale. Confermi?

    In tal caso, aggiungi un campo alla tua classe che rappresenta il form principale che appartenga allo stesso tipo del form secondario; esemplificando, qualcosa come

    codice:
    Public Class MyMainForm
        Private ChildForm As  MyChildForm
    End Class
    In questo modo, hai a disposizione una variabile utilizzabile da tutti i metodi (procedure/funzioni di una classe) per immagazzinare al suo interno il riferimento al Form secondario.
    Quando devi creare il form, scriverai un codice simile al seguente:

    codice:
    If ChildForm Is Nothing Then
        ChildForm = New MyChildForm()
    End If
    ChildForm.Show()
    In sostanza, se ChildForm è la variabile che contiene il riferimento al form secondario che hai creato, e che dovrà essere impostato a Nothing quando quel form viene distrutto - anche se mi pare di capire che esso dovrà essere presente in memoria per tutta la durata dell'applicazione - è sufficiente controllarne, appunto, l'equivalenza con Nothing per determinare se è necessario o meno creare il form secondario; in seguito, il form viene visualizzato con il metodo Show.

    Inserendo questo codice in una procedura del form principale, basta invocarlo ogni volta che serve rendere visibile il form.

    Va detto poi che se devi compiere inizializzazioni sul form stesso, puoi sempre introdurre un metodo all'interno della classe del Form secondario, qualcosa di simile a

    codice:
    Public Class MyChildForm
        Public Sub InitializeMe()
            ' Qui le tue inizializzazioni...
        End Sub
    End Class
    da richiamare prima di visualizzare il form

    codice:
    If ChildForm Is Nothing Then
        ChildForm = New MyChildForm()
    End If
    ChildForm.InitializeMe()
    ChildForm.Show()
    Ci sono tante alternative a questo approccio, è solo un esempio dimostrativo.

    Non ho verificato sintatticamente il codice, poiché lo scritto direttamente qui, quindi va senz'altro adattato e forse corretto un minimo; io preferisco sempre spostare l'attenzione verso il significato del codice, quando si tratta di spiegare qualcosa, piuttosto che dall'uso derivante dal semplice "copia e incolla".

    Insomma, concentrati sull'aspetto concettuale della soluzione proposta piuttosto che sui meri stralci di codice che hanno la semplice funzione di decorare la spiegazione teorica.

    Ciao!
    Immagino che il Form interessato sia un "figlio" (non nel senso MDI del termine) del Form principale, cioè la responsabilità di aprire quel form ricade sul Form principale. Confermi?
    Confermo..

    Ti ringrazio x tutto, è perfetta la spiegazione.. Ciao
    Tony

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Originariamente inviato da tony83
    Confermo..
    Ti ringrazio x tutto, è perfetta la spiegazione..
    Ok, ma non era necessario quotare tutto il messaggio per un semplice ringraziamento.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.