PDA

Ver la Versión Completa : Obtener valor de una propiedad de una Tabla en un Form1 desde otro Form2


Yugo
11-11-2015, 01:56:42
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...


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


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.

...
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:

...
#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:
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
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
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.