C/Visual C - Intercambio Mensajes

 
Vista:

Intercambio Mensajes

Publicado por Nelek (816 intervenciones) el 21/06/2006 08:55:47
Hola de nuevo,

Hay alguna manera de que los cambios en un dialogo NO modal, se vean reflejados en otro dialogo NO modal, que comparten el mismo nivel en la jerarquia?

Hasta ahora lo que estoy haciendo con los dialogos modales es, declaro las variables privadas que me interesan (ya sean propias o de un nivel superior de jerarquia para determinar las propias), creo metodos de set (para despues de crear el objeto con el que llamo a la ventana y pasarle lo que me interesa) y de get (para cuando el usuario confirma, volviendo al view y guardando lo que me interesa).

Pero ahora me enfrento a dialogos no modales, donde la grafica de las salidas, depende de los valores de la grafica de entrada y, estos, se pueden modificar, debiendo verse reflejadas las alteraciones en el otro dialogo.

Lo mejor seria aprovechar algun OnChange de los controles del dialogo de entradas, para mandar un flag al dialogo de salidas, no? O deberia escribirme mi propio mensaje sobrecargado? (En caso de ser asi, algun ejemplo basico plis?)

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Intercambio Mensajes

Publicado por fernando.gomez (1603 intervenciones) el 22/06/2006 07:50:49
Pues mira, probablemente lo más sencillo sería que tomaras un puntero al CDialog donde se deben ver reflejados los datos, dentro del que va a generar los datos, y te crees una función que actualice cada vez que alguno de tus parámetros cambie.

La forma más complicada, pero quizás la mejor, sea que te crees una estructura con todos los datos que necesitas, te crees un nuevo mensaje de windows

#define WM_ENVIODATOS WM_USER+1

y hagas un ::SendMessage del diálogo origen al destino y le envíes este nuevo mensaje al diálogo que recibe, el cuál recibes con un ON_COMMAND en tu mapa de mensajes.

Finalmente, a esa estructura con los parámetros se la envías dentro del mensaje a través de LPARAM o WPARAM.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Intercambio Mensajes

Publicado por Nelek (816 intervenciones) el 22/06/2006 09:20:01
Hola,

me imaginaba que lo mejor es crear un mensaje personalizado pero la cosa es el nivel que tengo y el tiempo que me queda (que no es demasiado, ni de uno ni de otro).

Creo que lo mas factible para mi (aunque quiza no lo mejor) es usar al Doc como intermediario, es decir... Si una entrada tienen algun cambio en sus parametros tiene que ser almacenado en el doc, entonces decirle a la ventana de salida (la que refleja los datos) cual es la entrada que se ha modificado para buscarla en el doc y actualizar lo que haya cambiado y volver a calcular las cosas para presentarlas en pantalla.

Este codigo es el que viene en la clase CView para unirse con el CDoc
/////////////////////////////////////////////////////////////////////////////
// CFPSView Diagnose
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
void CFPSView::AssertValid() const
{ CScrollView::AssertValid(); }

void CFPSView::Dump(CDumpContext& dc) const
{ CScrollView::Dump(dc); }

CFPSDoc* CFPSView::GetDocument()
{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFPSDoc)));
return (CFPSDoc*)m_pDocument;
}
#endif //_DEBUG

y para coger datos luego uso...
CFPSDoc* pDoc = GetDocument ();
ASSERT_VALID (pDoc);

Puedo usar eso mismo en los Dialog? o tendria que crearme una View personalizada?

Es que como los dialogos que me faltan son NO modales... no puedo traerme los datos a la view, comprobarlos y mandarlos al doc, como estaba haciendo hasta el momento. Así que tenia la intencion de mandarlos directamente al Doc con esto y luego cogerlos en el otro dialogo. Funcionara?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Intercambio Mensajes

Publicado por fernando.gomez (1603 intervenciones) el 22/06/2006 22:28:59
Pues sí, sí podrías emplear el documento como intermediario... Pero aún así, tendrías que avisarle al otro diálogo que los datos cambiaron -o que el otro diálogo esté en un loop constante revisando los datos. En cualquier caso, requerirías del puntero al documento, quizás se lo puedes pasar en el constructor.

O bien, puedes usar un callback. El mensaje personalizado no lleva tiempo en cualquier caso.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Intercambio Mensajes

Publicado por Nelek (816 intervenciones) el 23/06/2006 09:12:21
Aha,

yo habia pensado, como cada ventana corresponde a un unico elemento, declarar un parametro de modificacion, algo asi como el SetModifiedFlag del Doc pero añadiendo como parametro el nombre del elemento que cambia, algo asi como: void SetModify (CString szName) y un timer en la ventana (al final no voy a usar dialogos no modales, sino ventanas nuevas) donde se tienen que reflejar los datos para ir chekeando si ha habido cambios o no.

La funcion de actualizacion la tengo mas o menos clara y la tendria que llamar en el OnInitialUpdate, en el OnPaint y en el OnSetFocus, si es este el evento que dice cuando una ventana se activa al hacerle click en ella (cuando su barra de titulo pasa de ser grisacea a azul). Pero no tengo tan claro como hacer el mensaje que haga ejecutarse mi UpdateWnd () teniendo la ventana abierta pero sin tenerla activa.

Me gustaria mas hacerlo con algun mensaje que fuera tipo OnSetFlag y que cuando ese "chivato" se pusiera a true, que entonces las ventanas de salida abiertas comprobaran si la entrada que se ha modificado les compete o no, y en caso de ser asi que tomaran los datos. Desde el punto de vista de los recursos creo que es mejor asi que crear un timer para que se chequee continuamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar