Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Formas fsMDIChild

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Formas fsMDIChild Responder citando

Hola que tal.. mi problema es el siguiente
Tengo una forma fsMDIChild1 de la cual paso a otra forma fsMDIChild2,
de la siguiente forma:

Código:
Tfrm2 *frm2 = new Tfrm2(this);
        frm2->Show();


Trabajo en frm2 pero quiero que en frm1 se realice una función que he realizado llamando dicho método desde frm2... pero no puedo ejecutar dicha función... por que el entero que realizo para realizar dicha función me marca que no esta declarado...
De hecho si pongo
Código:
frm1->Edit->Text = "Hola"

me marca un error de memoria...

Como puedo hacer trabajar a dicha funcion desde el formulario frm2??

Saludos Cordiales
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Que tal WaKo13, puedes agregar el código completo y dar mas detalles del proceso que intentas hacer?....

Saludos.
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Pues lo que intento hacer es filtrar en un dbgrid para que las operaciones que realizé en la forma frm2 se reflejen en frm1
En frm1 tengo el siguiente procedimiento:

Código:
void __fastcall Tfrm1::Filtrar()
{
        dtm->ADOTable->Active = false;
        dtm->ADOTable->Filtered = false;
        AnsiString _ID = AnsiString(ID); //ID esta declarado como entero y publico y es inicializado al momento que se crea la forma
        dtm->ADOTable->Filter = "ID = " + _ID;
        dtm->ADOTable->Filtered = true;
        dtm->ADOTable->Active = true;
        this->dbGrid->Refresh();
}


entonces en frm2 realizo ciertos calculos, pero cuando yo vaya a cerrar frm2 quiero que esos calculos ya aparezcan reflejados en frm1

Código:
void __fastcall Tfrm2::BitBtn2Click(TObject *Sender)
{
        Update();
        frm1->Filtrar();
        Close();
}


Es lo que intento realizar... pero me marca un error de violación de memoria por que haciendo un watch a la variable ID cuando el metodo es llamado desde frm2 esta solo contiene ???

Saludos Cordiales
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Bueno, aún asi no logro comprender lo que necesitas.

Si trabajas con formularios MDIChild ¿es necesario que frm2 también lo sea?, porque no utilizar un form normal, ya que solo lo utilizas para realizar algún tipo de cálculo.

Según tengo entendido los forms de tipo MDI se utilizan para crear aplicaciones de interfaz de documentos múltiples (MDI), un ejemplo de este tipo de aplicaciones es Word.

Posiblemente tu problema puede ser por la forma en como los estas trabajando. En C++ builder viene un ejemplo de como realizar este tipo de aplicaciones.

Si quieres puedes crear la aplicacion desde Menú File->New->Other... del cuadro de díalogo seleccionas la pestaña "Projects" y clic en "MDI Application". Ahi puedes ver el código y analizar como se trabaja con las ventanas MDIChild.

Saludos!
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

No compredo que es lo que necesitas, pero al parecer quieres ejecutar un procedimiento que se encuentra dentro del frm1, pero desde el frm2, si es asi, vamos a ver unas cosas primero

Creacion de la segunda (frm2) en modo child (hijo), al crear una forma se supone que esta se encuentra referenciada por un nombre.
algo como frm2->Name = "forma2", y el primer formulario que tambien es MDChild debe contener algo como esto frm1->Name = "forma1", ahora para crear la forma si esta es dinamicamente (en tiempo de ejecucion), la forma de crearlo debe hacerse de la siguiente manera. un tip que me ha resultado es el siguiente

1.- Verificar que la Forma NO se encuentre habierta.
2.- si existe referenciarme a ella por su nombre y realizar las operaciones.

entonces el codigo para crear la segunda forma MDChild, puede parecerse al siguente

Este codigo puede servirte para abrir todas tus formas MDChild, desde el Menu Principal, por ello esta el operador this, pero si las formas se van a lanzar desde otra Ventana MDChild, deves cambiar el puntero this, por el nombre de tu form principal por ejemplo puede ser
FPRINCIPAL <-- suponiendo que asi se llame el form principal.


Código:

void __fastcall TFPrincipal::AbrirForma2Click(TObject *Sender)
{
   int hija=0;
   bool existe=false;
   while(hija<this->MDIChildCount)
   {
      Application->ProcessMessages();
      if(this->MDIChildren[hija]->Name=="Form2"){
         this->MDIChildren[hija]->WindowState=wsNormal;
         this->MDIChildren[hija]->BringToFront();
         existe=true;
         break;
      }
      hija++;
   }
   if(!existe)
   {
      Tfrm2 *frm2 = new Tfrm2(this);
      frm2->Name = "forma2"; // para no perderla
        frm2->Show();
   }
}

bien despues de abrir la forma 2, ahora nos vamos al metodo que debe usarse para ejecutar el procedimiento que actualiza tus datos... con la misma tematica.
1.- Ver si no se esta ejecutando.
2.- si lo esta traerlo al frente y ejecutar el proceso.

aun que hay un pequeño cambio con respecto a la forma de abrir ya que estamos en un MDCHild, devemos hacer referencia al Form Principal, que lanza a estas dos ventanas

Código:

void __fastcall Tfrm2::BitBtn2Click(TObject *Sender)
{
   int hija=0;
   bool existe=false;
   while(hija<FPRINCIPAL->MDIChildCount)
   {
      Application->ProcessMessages();
      if(FPRINCIPAL->MDIChildren[hija]->Name=="forma1"){
         FPRINCIPAL->MDIChildren[hija]->WindowState=wsNormal;
         FPRINCIPAL->MDIChildren[hija]->BringToFront();
         FPRINCIPAL->MDIChildren[hija]->Filtrar();

         existe=true;
         break;
      }
      hija++;
   }
   if(!existe)
   {
                       // si no existe entonces la creamos, jeje
      Tfrm1 *frm1 = new Tfrm1(FPRINCIPAL);
      frm1->Name = "forma1"; // para no perderla
        frm1->Show();
   }
}


Espero que con esto puedas componer lo que necesitas

Saludos!!
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchas Gracias César me ha servido de mucho tu ayuda... era justo lo que necesitaba....

Saludos Cordiales
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.