ritorno di valori su dialog

ciao a tutti, utilizzo delle dialog comuni a varie pagine per effettuare ricerche, ad esempio in questo caso per un calendario

  // A SECONDA DEL CHIAMANTE DOBBIAMO VALORIZZARE I CAMPI GIUSTI !!
  if Me.Parent.Name = "Movimenti_Buoni" then
    if Movimenti_Buoni.Tipo.ToText="INI" then
      Movimenti_Buoni.TxtDataIni.Text = self.iCalendar1.now.ShortDate
    else
      Movimenti_Buoni.TxtDataFin.Text = self.iCalendar1.now.ShortDate
    end if
  end if
  if Me.Parent.Name = "Statistiche" then
    if Statistiche.Tipo.ToText="INI" then
      Statistiche.TxtDataIni.Text = self.iCalendar1.now.ShortDate
    else
      Statistiche.TxtDataFin.Text = self.iCalendar1.now.ShortDate
    end if
  end if
  if Me.Parent.Name = "Log_Dialog" then
    if Log_Dialog.Tipo.ToText="INI" then
      Log_Dialog.TxtDataIni.Text = self.iCalendar1.now.ShortDate
    else
      Log_Dialog.TxtDataFin.Text = self.iCalendar1.now.ShortDate
    end if
  end if

se per il chiamante una webpage funziona, se invece, come nell’ultimo caso, un’altra dialog (type sheet) no, mi d errore:
“this item does not exist”

ovviamente, sulla dialog ci sono i textfield con il nome giusto…

Forse una soluzione più semplice potrebbe essere questa:

  • Nel dialog comune crei 2 proprietà di tipo TextField, una che si chiama TxtDataIni ed una TxtDataFin.
  • Quando chiami il dialog comune, prima di mostrarlo, associ le 2 proprietà ai campi di destinazione che dovranno essere valorizzati, tipo:
    dialogComune.TxtDataIni = chiamante.TextFieldCheDovràRicevereLaDataInzio
    dialogComune.TxtDataFin = chiamante.TextFieldCheDovràRicevereLaDataFine
  • Nel codice dialog sarà ora sufficiente definire:
    TxtDataIni.Text = self.iCalendar1.now.ShortDate
    e siccome dialogComune.TxtDataIni è associato al controllo di destinazione, il valore sarà visualizzato nel textfield del chiamante.

O, come regola generale anche per evitare di lasciare associazioni che impediscono la chiusura, all’accettazione di un valore (ovvero quando chiudi la dialog) metti il valore in una propriet (magari la lasci vuota o nil se hai annullato l’operazione) e la chiamante va a vedere nel suo “mondo” cosa vuol dire quella risposta.

Alla chiusura di una dialog i controlli non esistono, ma le propriet si.

Il suggerimento di Pietro non sbagliato, ma con un po’ di lavoro si pu migliorare e rendere ogni finestra indipendente e senza legami con le altre.

allora ho seguito il consiglio di antonio, ho creato una property nella dialog chiamata che valorizzo correttamente (verificato con msgbox)
poi lancio la self.close per chiudere la dialog.

quando ritorno sulla dialog chiamante, ho provato a leggere la property della dialog chiamata ma forse non l’evento giusto,
io l’ho messa dopo la chiamata alla dialog

grazie pietro, il tuo metodo risolve il mio problema!

Leggere il risultato dopo la chiamata funziona nel desktop

Sul web diverso devi leggerlo all’evento dismissed della finestra chiamata.

Detto che la soluzione suggerita funziona, ma sta attento a i riferimenti incrociati
Per rendere indipendente dalla chiamante (o dalla catena) sul web devi aggiungere l’handler per l’evento dismissed
ad esempio nella webPage puoi avere un pulsante con:
dim w as new mySheetDialog
addHandler w.dismissed, WeakAddressOf replyFromSheet
w.show

dove replyFromSheet un metodo che ha un parametro di tipo webdialog
Sta a te verificare che tipo di dialog e poi leggendone i dati decidere cosa fare.

In questo modo ad esempio puoi usare metodi diversi o discriminare con isA
Alla dialog puoi aggiungere altri parametri che ti permettono di comprendere cosa fare.

Vantaggi?
Sei sicuro di avere gli elementi separati senza riferimenti incrociati.
Puoi cambiare nome agli oggetti della webPage senza doverti preoccupare di modificare anche la dialog
Alla fine alla dialog chiedi qualcosa e quel qualcosa di deve restituire.

Ovviamente devi chiudere la dialog per far funzionare tutto per cui ogni azione che deve restituire il valore (o annullare l’operazione) deve fare il self.close delle dialog in quanto quando avviene questo evento verr richiamato l’evento dismissed

Sul desktop invece il flusso si interrompe alla chiamata delle dialog per cui quando la chiudi nella prima istruzione dopo averla mostrata puoi vederne il risultato.