Newsgroup: it.comp.programmare.win32
Titolo: [MFC] passaggio dati tra CView e CDialog

Salve a tutti,
riposto una mia domanda in forma più generale visto che nessuno ha risposto
alla mia precedente richiesta specifica.
In che modo posso scambiare dati tra la classe CView (o una sua derivata) e
una classe CDialog costruita all'interno di una funzione membro della CView?
La situazione tipo è questa: nella mia CView ho un campo EDIT "read-only".
Normalmente questo campo non viene modificato se non tramite un comando
specifico che apre un dialog in cui viene richiesto di inserire proprio quel
campo EDIT. In che modo assegno il valore inserito tramite la finestra di
dialogo al campo EDIT della finestra View?
--
Bye
Johnny
http://digilander.iol.it/Superpork


... Non so se ho capito bene la domanda, comunque io farei cosě:
Nella dialog definisci una variabile membro CString m_sStringa e la colleghi
al controllo EDIT, tramite AppWizard oppure leggendone direttamente il
valore (GetWindowText) quando stai per chiudere la dialog);
poi nella tua CView, (nel punto dove devi aprire la dialog) inserisci:
...
CTuaDialog dlg;
int iRes = dlg.DoModal();
if (iRes == IDOK)
{
    CString s = dlg.m_sStringa;
    ... ora nella variabile s hai il valore dell'EDIT e lo puoi inserire
nell'EDIT che hai nella vista
}
Buon lavoro,
Luke

.... :-/
che scemo che sono. Pensavo che l'oggetto CDialog non esistesse piů dopo il
DoModal.... e non avevo pensato a questa soluzione.
Grazie


Ok,
ora ho capito come passare dati tra la finestra Dialog e la View.... e per
fare l'inverso?
Mi serve ottenere il contenuto di un controllo Edit che si trova nella View
quando ho già aperto la Dialog.
Ho provato all'interno di OnInitDialog di recuperare l'handle della finestra
View (Owner del Dialog) con chiamate come GetParent o GetOwner ma non mi
restituisce handles validi. Se riuscissi a recuperare l'handle della finesta
View potrei poi utilizzare GetDlgItem giusto?
C'è qualcosa di strano comunque nel funzionamento di ClassWizard:
una volta creata la finestra di dialogo volevo aggiungere dei membri di
variabili ma ClassWizard nella pagina "Member Variables" non mi mostrava
nemmeno uno dei componenti che avevo messo nella finestra di dialogo. Ho
dovuto aggiungerli manualmente nel codice....
e ancora... anche la funzione OnInitDialog non c'è stato modo di aggiungerla
tramite il Wizard... non la metteva tra le funzioni virtuali disponibili...
ho dovuto aggiungerla a mano anche questa.....
Qualcuno sa aiutarmi?


 dialogo al campo EDIT della finestra View?
Di solito si usano delle variabili membro publiche definite nella classe
della dialog. Qualcosa tipo:
class CMyDialog: public CDialog
{
...
public:
    CString m_text;  // Che ad esempio collegherai a un campo edit
                     // e gestirai con DDX/DDV
...
};
...
void CMyView::OnMyCommand()
{
    CMyDialog dlg;
    GetDlgItemText( IDC_EDIT, dlg.m_text);
    if( dlg.DoModal() == IDOK)
        SetDlgItemText( IDC_EDIT, dlg.m_text);
}
--
Lorenzo

ok ok
questo l'ho capito!
e il passaggio inverso (leggi l'altro mio messaggio)?


 ho dovuto aggiungerla a mano anche questa.....
Bastava mappare il messagio WM_INITDIALOG tramite ClassWizard
PICCOLO CONSIGLIO:
Mi sembra che ti manchino un po' i fondamentali, ti consiglio di consultare
l'help o qualche manuale altrimenti, procedendo a tentativi utilizzando il
VC++, che già è ostico di per se, finirai per pigliare a calci il monitor
!!!
Ciao, Luke


se rileggi quanto scritto ti accorgerai che il mio problema è cercare di
sfruttare al meglio il wizard (visto che ce l'hanno messo).... questo si
scontra con i comportamenti anomali che ti ho citato.
....lo so bene anch'io che OnInitDialog mappa il messaggio WM_INITDIALOG ma
torno a ripetere "perchè il Wizard non mi mostra OnInitDialog tra le
possibili funzioni virtuali di cui fare l'override?".
PS: normalmente uso MSDN e seguo il manuale "Programmare Visual C++ 5a
edizione" di Kruglinski,Shepard e Wingo.... inoltre ho svolto una tesi di
laurea programmando con le API.... sto cercando di ampliare le mie
conoscenze avvicinandomi al VisualC++.... bastano come fondamentali?


 e il passaggio inverso (leggi l'altro mio messaggio)?
In generale e` sempre una brutta idea far prendere dei dati direttamente a
una dialog; dovrebbe esserci una separazione logica e funzionale netta, e
quasi sempre c'e` il modo per evitare questi "trucchi". In ogni caso un
metodo per fare cio` che vuoi potrebbe essere quello di passare alla dialog
anche l'istanza della vista; copiaincollando il mio codice:
class CMyDialog: public CDialog
{
...
public:
    CMyView* m_view;
...
};
...
void CMyView::OnMyCommand()
{
    CMyDialog dlg;
    dlg.m_view = this;
    if( dlg.DoModal() == IDOK) { ... }
}
--
Lorenzo

 wrote in message
knBG7.45906$sq5.2...@news.infostrada.it...

...penso di si.
Ovviamente non volevo essere offensivo  ma sono stato tratto in inganno
dalle domande.
A proposito può capitare che il classwizard "sbrocchi" presentando i difetti
che hai descritto. In questo caso (ovviamente se non è un problema di
installazione) prova a fare così:
1) Chiudi il progetto
2) Dalla directory del progetto elimina il file TuoProgetto.clw
3) Riapri il progetto ed accedi a classwizard. A questo punto il sistema
ricrea il file TuoProgetto.clw
P.S.  Se non funziona così non so che dire !!!
Bye, Luke