C/Visual C - MUY IMPORTANTE: POR FAVOR AYUDA

 
Vista:

MUY IMPORTANTE: POR FAVOR AYUDA

Publicado por Nelek (816 intervenciones) el 28/07/2006 15:56:56
Hola a todos (en especial a fernando)

Me quedan 3 semanas para entregar mi proyecto y me queda muy poco para acabarlo. Pero lo que me queda no logro hacerlo funcionar como toca.

Mi proyecto es un simulador para regulacion de procesos.

Tengo todas las entradas de datos primarias ya realizadas. Lo guardo todo en el Documento y todo va bien.

EL PROBLEMA: la entrada de datos secundarios, que son los que se usan para la simulación realmente. Haciendolo como hasta ahora, a base de dialog boxes es imposible, llevo dos semanas intentandolo y nada. Tengo muchos metodos de los que necesito para adecuar los datos, hacer las graficas y demas que si que funcionan pero el conjunto entero no lo hace.

He intentado crearme ventanas nuevas derivando de CWnd, pero cuando le introduzco los controles no aparecen en la ventana. Pese a que las creaciones me devuelven los resultados correctos.

Creo que lo mejor es que utilice diferentes Views para el mismo Documento, pero no se que tengo que hacer para realizarlo. Es decir, leyendo la ayuda, los comandos los entiendo, pero el problema es que solo son eso, comandos. No hay ninguna explicacion del metodo a seguir.

He consultado todos los ejemplos que vienen en el cd de MSDN pero no hay ninguno que trabaje con un solo documento y varias vistas, los que más se aproximan son el SNAPVW y el VIEWEX. Pero tampoco me sirven porque en ellos se crean diferentes parejas de Documento/Vista y yo he de usar un unico documento con varias vistas. Una normal y corriente y las otras derivadas del CFormView para poder añadir controles en la vista.

Que pasos tengo que seguir para poder lograrlo?

NO ESTOY PIDIENDO EL CODIGO, SOLO EL PROCEDIMIENTO (lo mas detallado posible, si, pero con que sea una explicación en palabras ya me apañaría bastante)

POR FAVOR, SIN AYUDA NO VOY A PODER ACABAR y tiraría a la basura 6 meses de trabajo, por no decir la doble titulacion y los dos años en el extranjero que llevo.
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:MUY IMPORTANTE: POR FAVOR AYUDA

Publicado por x (63 intervenciones) el 28/07/2006 17:25:34
yo no tengo experiencia con MFC, solo en lo que es SDK asi que lo unico que puedo hacer es tratar de darte alguna idea... que tipo informacion son tus datos secundarios? y como es eso de que mediante dialog boxes es imposible?
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:MUY IMPORTANTE: POR FAVOR AYUDA

Publicado por Nelek (816 intervenciones) el 31/07/2006 10:49:32
Te explico,

La cosa está en que mis datos "primarios" son los que corresponden al objeto en sí:

Tengo tres tipos de objetos principales:

Entradas, Salidas y Reguladores.

Dentro se guardan, en primera instancia, nombre, unidad de medición, intervalo de funcionamiento, resolución, tipo de proceso regulador... Eso a la hora del analisis. Luego tambien guardo, si esta seleccionado, donde su ubica en la pantalla... (pero esos ya no me sirven para la regulacion en si, solo para la presentacion del programa)

Y una vez hecho esto y conectados, vienen los parametros de "segunda instancia" que son los atributos, el tipo de curva para el analisis, valor de los puntos de dicha curva, valor del punto de trabajo real...

Los problemas que se me presentan con los DialogBox son:

En primer lugar, que no dependen del Frame, por lo que se quedan siempre por encima de la aplicacion tapando la superficie de trabajo, cuando hay uno solo abierto no pasa nada, pero cuando hay mas... es un poco engorroso ir modivendo cada vez todas las ventanas para poder acceder a otros elementos.

En segundo lugar, como mi puñetero tutor es muy estricto con lo de la estructura he tenido que definirme casi todos los objetos como privados y crearme los tipicos Get y Set, el problema es que para los dialogbox me resulta muy dificil la sincronización del documento. Es decir, si yo cojo y me traigo mi objeto "Entrada" al dialog y me pongo a entrar o modificar los datos que depende de el, pero antes de cerrar el dialogo con ok o cancel, modifico la superficie de trabajo... al darle al Ok o al cancel, dichas modificaciones no se guardan. Por lo que tengo que ir añadiendo restricciones a los metodos de los demas sitio para que contemplen si hay o no abiertos dialogboxes para permitir o no las operaciones.

Tambien tengo problemas porque, por narices han de ser NoModales (no como los de primera instancia de introduccion de elementos), entonces, cuando creo el nuevo Dialogo y le mando los parametros, si intento algo en algun mensaje que se ejecute antes que el OnPaint, se desbarajusta la cosa y no me actualiza bien la grafica, el windowtext del dialogo o cosas asi.

En 4 lugar, desde una vista, esta el "evento/mensaje" OnDraw" donde yo simplemente pongo llamadas a funciones, en dichas funciones luego me creo mis DeviceContext, los uso, les quito el elemento y libero el recurso. Y funciona, en el dialogbox no logro hacer eso, por lo que tengo que escribir lo que seria el contenido de varias funciones distintas dentro del OnPaint, perdiendo claridad y estructura. He intentado crearme las funciones del tipo: void InicializaGrafico (CPaintDC* dc) y luego llamar a la funcion InicializaGrafica (&dc) y me compila bien, pero luego no funciona ni a la de tres.
Tambien he intentado hacer un ReleaseDC y un dc.delete antes de llamar a las funciones de la grafica para que solo haya un dispositivo en uso simultaneamente y tampoco funciona...

Etc, etc...

La verdad es que ya me he quedado sin ideas en cuanto a lo de los dialogboxes, he intentado cosas con casi todas las funciones miembro que podian interesarme y no he logrado hacer que funcione como yo tenia pensado que lo iba a hacer.

Luego tambien he intentado crearme nuevas ventanas por distintos metodos. Uno por ejemplo, creando una clase derivada de CMDIChildWindow, la llamo y se abre perfectamente. Se pone el fondo que quiero y todo parece ir bien. Pero luego introduzco una funcion que responda al doble click con algo tan simple como escribir una frase en la ventana, llamar a un AfxMessageBox o cosas asi y no funciona, cuando compilo y abro la ventana al hacer doble click, el debbuger reconoce los click, los doble click y demas, pero no se ejecuta nada de lo que hay dentro de la funcion. Ni siquiera he logrado cambiar el contenido de una string publica del documento creada adrede para hacer la prueba. CString szPrueba ="Texto inicial" y luego coger el puntero global al documento (que en cualquier otro sitio, dialogboxes, la vista principal... si que funciona) y hacer pGlobalDoc->szPrueba = "Texto modificado" y tampoco le hace nada.

Tambien he intentado crear una nueva ventana derivandola de la CWnd (generica) y la creo, se queda abierta (antes se cerraba automaticamente) pero cuando le intento introducir controles (botones, listbox, etc) por codigo, no me reconoce ninguno.

Luego he intentado, dentro del MainFrame, crear plantillas MDITemplate nuevas como en el ejemplo de MSDN "SNAPVW" pero claro, lo que logro asi es crearme nuevas parejas Documento/Vista, con lo que la nueva vista tiene un documento nuevo, donde no hay nada grabado.

He intentado cosas tambien con los metodos CDocument::AddView, ::GetNextView etc, (que son los que a mi me interesa que me expliqueis, si es posible) pero se ve que hago algo mal porque me da siempre fallos de compilacion, assertions, o directamente no hace nada.

Por eso pido el procedimiento, porque las ayudas y los manuales te explican los comandos de manera independiente. Pero no te dicen "Pasos a seguir para añadir una vista al documento", que es lo que realmente necesito, porque supongo que no sera tan simple como llamar a un unico comando, sino que tendre que llamar al CDoc::AddView en un sitio, pero configurar la View de cierta manera, decirle a la aplicacion que va a trabajarse con varias Views...

Sinceramente, espero que alguno de vosotros me pueda ayudar, si no... No se si podre acabar el proyecto, ni si conseguire mi doble titulacion (con lo estrictos que son lo alemanes pra estas cosas... :( no me fio ni un pelo)
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

Puede que lo haya conseguido

Publicado por Nelek (816 intervenciones) el 31/07/2006 16:03:23
Al final despues de dejarme los ojos y los cuernos con manuales y ejemplos, creo que lo he conseguido.

Cuando este seguro ya contestaré yo mismo a este mensaje para decir como lo he hecho.
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

Esto es lo que hice por ahora

Publicado por Nelek (816 intervenciones) el 31/07/2006 16:38:52
Bueno, aqui comento lo que he hecho hasta el momento para el que le pueda servir.

Yo creo una aplicacion con el asistente y derivo mi clase MyView de CScrollView (pq es la que me interesa). Y acabo con el asistente.

Despues, en la vista de clases del area de trabajo anyado un nuevo formulario al proyecto (es lo que hecho ahora, pero en verdad lo hare con tres distintos).

Luego modificaciones que he hecho (copio codigo de mi prueba), que tengo prisa:

**** Esto en el CMyApp.cpp
BOOL CMetodosApp::InitInstance()
{
//.... Mas codigo
m_pDocTemplate = new CMultiDocTemplate(
IDR_METODOTYPE,
RUNTIME_CLASS(CMetodosDoc),
RUNTIME_CLASS(CChildFrame), // Benutzerspezifischer MDI-Child-Rahmen
RUNTIME_CLASS(CMetodosView));
AddDocTemplate(m_pDocTemplate);

m_pNewDocTemplate = new CMultiDocTemplate(
IDR_PARAMVIEW_TMPL,
RUNTIME_CLASS(CMetodosDoc), // Dokumentklasse
RUNTIME_CLASS(CMDIChildWnd), // Rahmenklasse
RUNTIME_CLASS(CParamView)); // Ansichtklasse
AddDocTemplate(m_pNewDocTemplate);
//...Mas codigo
}

***** MyApp.h
//Estos Includes estan normalmente en el cpp PASARLOS AL HEADER
#include "MainFrm.h"
#include "ChildFrm.h"
#include "MetodosDoc.h"
#include "MetodosView.h"
#include "ParamView.h"

class CMetodosApp : public CWinApp
{
public:
CMetodosApp();

CMultiDocTemplate* m_pDocTemplate;
CMultiDocTemplate* m_pNewDocTemplate;

//... Mas codigo

DECLARE_MESSAGE_MAP()
};

extern CMetodosApp theApp; //IMPORTANTE

***** MyMainFrame.cpp
void CMainFrame::CreateMyNewFrame(CDocTemplate* pTemplate,
CRuntimeClass* pViewClass)
{
CMDIChildWnd* pMDIActive = MDIGetActive();
ASSERT(pMDIActive != NULL);
CDocument* pDoc = pMDIActive->GetActiveDocument();
ASSERT(pDoc != NULL);

CMDIChildWnd* pNewFrame
= (CMDIChildWnd*)(pTemplate->CreateNewFrame(pDoc, NULL));
if (pNewFrame == NULL)
return; // not created
ASSERT_KINDOF(CMDIChildWnd, pNewFrame);
pTemplate->InitialUpdateFrame(pNewFrame, pDoc);
}

**** MyMainFrame.h
//Esto anyadirlo para que se reconozcan (no se si es necesario pero asi va)
class CMetodosView; //Esta es la de original del asistente derivada de ScrollView
class CParamView; //Esta es la anyadida derivada de FormView

class CMainFrame : public CMDIFrameWnd
{
//.... Mas codigo
void CreateMyNewFrame(CDocTemplate* pTemplate, CRuntimeClass* pViewClass);
//... Mas codigo
}

*********
El VC++ crea un nuevo tipo de fichero al anyadir el FormView, es decir, te sale una ventana donde eliges que tipo de aplicacion quieres iniciar. Y segun la que elijas se guardan las cosas bajo un fichero de extension X o Y. Para evitar que se ralle y se piense que hay dos tipos de programas distintos, es decir que trabaje solo con un documento, se desde el editor de recursos, en el apartado STRINGTABLE, se editan los campos correspondientes a los formularios anyadidos. En mi caso se ha quedado asi:

IDR_METODOTYPE -> \nFPSView\nFPS\nFPS Dateien (*.fs)\n.fs\nFPS.Document\nFPS Dokument //Este es el que generas al rpincipio metiendote en el asistente paso 4 opciones avanzadas

IDR_PARAMVIEW_TMPL ->\nParamView\n\n\n\nFPS.Document\nFPS Dokument
//Este es el que se genera automaticamente al anyadir el nuevo FromView, y es asignado al menu de dicho formulario

NOTA: Los importantes de quitar son los que especifican el nuevo tipo de extension y el nombre del filtro. Los otros son el caption de la ventana donde se acopla la vista y lo que se ve en el explorer (total, como vas a guardar todo desde el serialize del documento y ese ya esta bien... si quieres puedes dejar la string table del formulario con todos los campos vacios, es decir \n\n\n\n\n\n)

Ahora ya es cuestion de implementar las cosas en las vistas segun te interese.

IMPORTANTISIMO EL NO TENER NINGUN DATO QUE SE IMPORTANTE FUERA DEL DOCUMENTO PORQUE SI NO CORRES RIESGOS DE NO ACTUALIZAR COMO TOCA Y PERDER COSAS

NOTA: Esto es lo que he sacado en el dia de hoy, llevaba tiempo probando otros metodos y nada, pero eso no quiere decir que esto este perfecto, asi que por favor si alguien ve fallos o cosas que se pueden mejorar que los postee.
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