Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C#] Comunicazione fra form

    Premessa, si parla di C# 2003.

    Sto facendo una form implementata in un progetto che parte se non arrivano parametri a linea di comando.

    La mia applicazione vuole dei parametri, se non li trova parte questa form che cerca di recuperare dall'utente i parametri.

    Il mio problema è questo, la form che faccio partire deve essere modulare, interna al progetto ma eseguita fuori dal contesto.

    La logica è questa:

    Trovo i parametri:
    Application.Run(new Principale(args));
    ...

    Non li trovo:
    Application.Run(new Toppa());
    ...

    Il primo tentativo è stato quello che una volta che Toppa ha finito bene il suo ciclo richiama Application.Run(new Principale(args)); ma mi fa il gesto dell'ombrello perché: "Impossibile avviare un secondo ciclo di messaggi su un thread singolo. Utilizzare invece Application.RunDialog o Form.ShowDialog".

    Il bello è che i due rimedi suggeritimi non esistono

    Il secondo tentativo è stato richiamare Toppa passandogli un array per riferimento (Application.Run(new Toppa(ref args)) e poi rilanciare Application.Run(new Principale(args)); con quell'array che si è lavorato Toppa. Solo che l'array risulta vuoto, anche se Toppa il suo array referenziato interno lo ha riempito.

    Avete suggerimenti?

    Grazie

  2. #2
    Questa cosa proprio non la capisco.

    Se scrivo:
    codice:
    private string _args;
    
    public StandAlone(ref String args)
    {
    	InitializeComponent();
    	this._args=args;
    	MessageBox.Show(object.ReferenceEquals(this._args,args).ToString());
    }
    La messagebox mi scrive True, ma se invece faccio così:

    codice:
    private string _args;
    
    public StandAlone(ref String args)
    {
    	InitializeComponent();
    	this._args=args;
    	this._args="ciao";
    	MessageBox.Show(object.ReferenceEquals(this._args,args).ToString());
    }
    La messagebox mi dice False.

    Che devo fare per non far decadere il legame di referenza fra i due oggetti stringa?

  3. #3
    La soluzione più semplice che mi viene in mente, visto che la strada delle referenze non funziona (sono 2 ore che ci giro intorno ma non ne vengo a capo) sarebbe quella di trovare un modo per farmi restituire dall'oggetto un qualcosa nel momento della sua chiusura.

    Praticamente, se io avvio la form così:

    Application.Run(new Toppa(args));

    Fintanto che Toppa vive chi ha chiamato Application.run non va avanti.

    Quando chiudo Toppa il chiamante riparte.

    Esiste un qualche modo per farmi restituire un qualcosa da Toppa prima che muoia?

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    ti conviene fare una main application che chiama prima un'istanza della form (o cos'altro sia) toppa e alla sua chiusura chiama l'altra..

    per farti restituire qualcosa dallo showDialog della form toppa (presupponendo che sia una form) o ridefinisci il metodo showDialog o fai un nuovo metodo che all'interno chiama showDialog e ritorna ciò che ti interessa..

  5. #5
    Il bello è che i due rimedi suggeritimi non esistono
    Form.ShowDialog esiste eccome, ma è un metodo d'istanza, per cui
    codice:
    Toppa toppaForm = new Toppa();
    toppaForm.ShowDialog();
    .
    per farti restituire qualcosa dallo showDialog della form toppa (presupponendo che sia una form) o ridefinisci il metodo showDialog o fai un nuovo metodo che all'interno chiama showDialog e ritorna ciò che ti interessa..
    Guarda che basta semplicemente assegnare all'interno del form un valore (di quelli consentiti) alla proprietà DialogResult.

    In ogni caso personalmente lascerei nel main l'avvio del form principale, al quale passerai gli argomenti tramite il costruttore; questo, se vede che non ci sono gli argomenti adeguati, mostrerà il form Toppa tramite ShowDialog come mostrato prima.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Mh, risposte molto interessanti, mh, domani le provo

    Tnx!

  7. #7
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Guarda che basta semplicemente assegnare all'interno del form un valore (di quelli consentiti) alla proprietà DialogResult.
    certo ma se deve passare qualcosa di diverso?

  8. #8
    Ho provato e ha funzionato.

    Allora, il mio problema era far partire una form Toppa la quale, al termine del suo ciclo vitale, mi doveva restituire dei dati utili per la prosecuzione della form principale.

    L'idea era creare questa Toppa che poi potevo implementare in diversi progetti con il minimo lavoro di riadattamento possibile.

    Se la mia applicazione viene avviata con dei parametri passati a riga di comando parte normalmente e tira invettive se i parametri sono sbagliati.

    Se invece viene aperta senza parametri (classico doppio click) allora cerca di aiutare l'utente a crearli questi parametri.

    In poche parole chiedo i parametri di accesso al DB.

    Nel braccetto della Main che apro se args.Length==0 per prima cosa costruisco l'oggetto senza usare l'Application.Run, ma usando lo ShowDialog

    codice:
    Toppa to=new Toppa();
    to.ShowDialog();
    All'interno di Toppa ho creato un metodo pubblico GetArgs che restituisce un array contenente i parametri che sono stati generati all'interno di Toppa.
    L'array avrà le stesse informazioni che conterrebbe normalmente l'args del Main.

    Cliccando sul pulsante Ok di Toppa (che farà tutti i vari controlli del caso) istanzio l'array (che sarà globale nella classe) e chiudo l'applicazione.

    Se Ok da errori o se chiudo male Toppa (con la x o con annulla) l'array sarà null.

    A questo punto il puntatore torna al Main, l'oggetto to ancora è attivo quindi posso recuperare l'array e infine disfarmi di Toppa:
    codice:
    string [] args2 = to.GetArgs();
    to.Dispose();
    Si chiama args2 perché args già esiste nel Main.
    Se args2 non è null allora posso far partire pure l'applicazione main con Application.Run(new Principale(args2));

    Sono proprio soddisfatto del risultato, grazie ancora per l'aiuto

  9. #9
    Ottima soluzione, complimenti; ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

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.