Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Obtener valor de una propiedad de una Tabla en un Form1 desde otro Form2 (https://www.clubdelphi.com/foros/showthread.php?t=89373)

Yugo 11-11-2015 01:56:42

Obtener valor de una propiedad de una Tabla en un Form1 desde otro Form2
 
Buenas, la duda que tengo es la siguiente: Tengo un Form1 donde coloco los componentes TTable (TablaAbierta), TDataSource (dsTablaAbierta), TDBGrid, TButton1 y TButton2.

Trato de abrir una tabla paradox seleccionándola desde un TOpenDialog que aparece tras pulsar el TButton1, para que sea visualizada en el TDBGrid y al pulsar el TButton2 se abra un TForm2 donde hay colocado un TEdit para capturar el nombre de la tabla abierta en el TForm1 mediante... Edit1->Text = Form1->TablaAbierta->TableName;

Pero algo falla y no soy capaz de verlo...


Código:

TOpenDialog *SelecTabla;
  SelecTabla = new TOpenDialog(this);

  String nomTabla;

  //Configuración del objeto TOpenDialog
  SelecTabla->Title = "Seleccionar la Tabla que desea abrir...";
  SelecTabla->Filter = "Tabla de Bases de Datos (*.DB) | *.DB";
  SelecTabla->Options << ofHideReadOnly << ofFileMustExist << ofEnableSizing;
  //Asignamos el directorio inicial por defecto del cuadro de diálogo
  SelecTabla->InitialDir = ExtractFilePath(Application->ExeName);

  if(SelecTabla->Execute())
  {
    nomTabla = ExtractFileName(SelecTabla->FileName); //contiene "nombreTabla.Extension"

    //Indicar la ruta donde reside la tabla que deseamos abrir
    TablaAbierta->DatabaseName = ExtractFilePath(SelecTabla->FileName);

    //Asignamos el nombre de la tabla que deseamos visualizar:
    TablaAbierta->TableName = nomTabla;  //pasar el nombre de la tabla CON [.DB]

    //Activar la tabla para trabajar con ella:
    TablaAbierta->Active = true; //Activar por último la tabla

    //Especificamos el conjunto de datos (TablaAbierta) que servirán de fuente de
    //datos a los objetos DBGrid y DBNavigator para visualizarlos en pantalla:
    dsTablaAbierta->DataSet = TablaAbierta;

    //Configuramos las propiedades del DBGrid y DBNavigator para enlazarlos con
    //Table1 y los hace visibles al usuario.
    DBGrid1->DataSource = dsTablaAbierta;
    DBGrid1->Visible = true;
    DBNavigator1->DataSource = dsTablaAbierta;
    DBNavigator1->Visible = true;


  }
  else //SelecTabla->Execute()==false
  {
    //Mensaje que aparece en caso de pulsar CANCELAR ó la 'X' de CERRAR ventana
    MessageDlg("Operación de apertura de tabla cancelada.",
                mtWarning, TMsgDlgButtons() << mbOK, 0);
  }


AgustinOrtu 11-11-2015 03:18:29

Depuraste el codigo? que es lo que falla?

Nunca trabaje con paradox, pero esto me hace ruido

Código PHP:

TablaAbierta->DatabaseName ExtractFilePath(SelecTabla->FileName); 

Si en el opendialog seleccionas el archivo C:\carpeta\hello.bd, ExtractFilePath te devuelve C:\carpeta\

Sigo haciendo puras conjeturas, pero de seguro te salta una excepcion de que el archivo no existe o algo asi

Siempre que te salgan errores es bueno para los foreros que nos indiques el mensaje de la excepcion y en que linea ocurre, algo muy facil de ver con el depurador. Simplemente corres la aplicacion con F9 y listo

ecfisa 11-11-2015 09:26:46

Hola Yugo.
Cita:

Empezado por Yugo (Mensaje 499162)
...
Trato de abrir una tabla paradox seleccionándola desde un TOpenDialog que aparece tras pulsar el TButton1, para que sea visualizada en el TDBGrid y al pulsar el TButton2 se abra un TForm2 donde hay colocado un TEdit para capturar el nombre de la tabla abierta en el TForm1 mediante... Edit1->Text = Form1->TablaAbierta->TableName;

Pero algo falla y no soy capaz de verlo...

Bueno, la verdad... tampoco veo el código que le asigna el valor al edit de Form2 :)

Si no te entendí mal, podes hacer:
Código PHP:

...
#include "Unit2.h"
...
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  if (
TablaAbierta->Active) {  // verificar si se abrió una tabla

    
if (Form2 == NULL)          // si Form2 no fué creado,
      
Form2 = new TForm2(this); // crearlo

    
Form2->Edit1->Text TablaAbierta->TableName// nombre de tabla a Edit

    
Form2->Show(); // Mostrar
  
}
  else
    
MessageBox(0"Debe elegir una tabla primero"""MB_ICONWARNING MB_OK);


Saludos :)

Yugo 12-11-2015 02:01:01

Gracias chicos por vuestro tiempo y vuestros aportes!!

La verdad es que releyendo mi mensaje, es cierto que me equivoqué... y además me expliqué algo mal jejeje. Mi intención era escribir el siguiente código en el evento OnCreate del Form2:
Cita:

Edit2->Text = Form1->Table1->TableName;
Incluyo las Units.h de cada uno de ellos respectivamente, pero nada... ni si quiera llega a compilar. El programa se bloquea (No responde). La verdad es que pienso que puede llegar a haber algún problema con él, porque he intentado compilar una nueva aplicación vacia New|Application sin introducir objetos ni código e igualmente se bloquea al pulsar compilar. Así que, por un lado me es imposible reportar el tipo de error producido y por otro lado, rectificar mi comentario para aclarar cómo quería obtener el nombre de la tabla1 en el Form2.

Un saludo y muchas gracias de nuevo!!

Ñuño Martínez 12-11-2015 17:15:09

Cita:

Empezado por Yugo (Mensaje 499235)
Incluyo las Units.h de cada uno de ellos respectivamente, pero nada... ni si quiera llega a compilar. El programa se bloquea (No responde). La verdad es que pienso que puede llegar a haber algún problema con él, porque he intentado compilar una nueva aplicación vacia New|Application sin introducir objetos ni código e igualmente se bloquea al pulsar compilar. Así que, por un lado me es imposible reportar el tipo de error producido (...)

Eso parece un problema de referencia circular. Es decir, a.h incluye b.h que incluye a.h que incluye b.h que incluye ...

Yugo 18-11-2015 12:52:34

Cita:

Empezado por Ñuño Martínez (Mensaje 499269)
Eso parece un problema de referencia circular. Es decir, a.h incluye b.h que incluye a.h que incluye b.h que incluye ...

Muchas gracias Ñuño!! Entiendo por tu comentario que, únicamente es necesario incluir las Units.h en aquellos módulos que vayan a hacer uso de ellas, es decir, no requiere luego hacer lo contrario, ¿cierto?

Ñuño Martínez 19-11-2015 10:57:08

Coligo por lo que escribes que deberías repasarte tus apuntes de "Iniciación a la Programación en Lenguaje C".

Perdón por la condescendencia, pero es que es de primero de primero de programación básica en C.


La franja horaria es GMT +2. Ahora son las 19:16:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi