PDA

Ver la Versión Completa : Propietario de un objeto en una función externa


Angel.Matilla
17-10-2014, 18:42:21
En BCB 6 tengo una función externa:
void Ayuda(TForm *Formulario, TCustomEdit *Edit)
que uso para la ayuda de varios campos (códigos postales, pobleciones, provincias, etc.). Me funciona a la perfección salvo en el caso de las pobalciones.

Me explico: Si voy por la ayuda de poblaciones además del nombre de la población saco su código postal y la provincia, pero al tratar de asignarlos a los Tedit correspondientes me da un error de compilación.

Tengo este código:
Form->Poblacion->Text = Query->FieldByName("Nombre")->AsString;
Form->Poblacion->Tag = Query->FieldByName("Registro")->AsInteger;
donde Formulario es el formulario en que se encuentran los TEdit y que va en la declaración de la función, pero al compilar me dice que 'Poblacion' is not a member of 'TForm'

¿Cómo puedo llamar a un objeto de un formualrio en una función del estilo de la mostarda, teniendo en cuenta que en su declaración va implícito el formulario en que están los objetos? Había pensado a través de Owner o Parent del objeto, pero no se me ocurre cómo.

ecfisa
17-10-2014, 19:00:33
Hola Angel.

La verdad es que no me queda para nada clara la situación...

El código que mostras y que te genera el error, pareciera no tener relación con la función Ayuda que mencionas mas arriba.

Supongo que Población es un TEdit, pero ¿ Donde está declarado ? ¿ Quién es su parent ?

Saludos :)

Angel.Matilla
17-10-2014, 19:04:44
Hola ecfisa. A ver: Ayuda es un TForm que tiene un TListView y dos TButton nada más. Poblacion es un TEdit declarado en el formulario que va en la definición de la función: Supongamos que ese formulario se llamase Ficha; sería entonces Ficha->Poblacion, pero como esa función Ayuda la uso en distintos formularios por eso puse en la definición ese TForm *Formulario. Tengo un formulario Personas con esos datos (población, c. postal, provincia, etc.) y otro con los datos del propietario del programa que también lleva esos datos pero de dicha persona.

aguml
17-10-2014, 19:09:18
ademas pregunto yo algo mas. Supongo que el TEdit está en el form que le metes como parámetro asi que su parent será el form y mi pregunta es ¿Para que le pasa el puntero al TEdit si ya le pasas el del form y desde ese puedes acceder a todo lo que este contenga?

Angel.Matilla
17-10-2014, 19:12:58
ademas pregunto yo algo mas. Supongo que el TEdit está en el form que le metes como parámetro asi que su parent será el form y mi pregunta es ¿Para que le pasa el puntero al TEdit si ya le pasas el del form y desde ese puedes acceder a todo lo que este contenga?
Para saber sobre que campo estoy pidiendo la ayuda.

ecfisa
17-10-2014, 20:20:45
Hola Angel.

Está un poco mas claro pero todavía no alcanzo a entender bién la situación... De todos modos fijate si te sirve de este modo.

form invocador de la ayuda:

...
#include "Unit2.h" // Formulario de ayuda

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Poblacion->Text = "un texto";
Poblacion->Tag = 1;
if (frmAyuda == NULL)
frmAyuda = new TfrmAyuda(this);
frmAyuda->Show();
frmAyuda->Ayuda(Form1, Poblacion);
}
...


Ayuda.

.h

...
class TfrmAyuda : public TForm
{
__published: // IDE-managed Components
...
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall FormDestroy(TObject *Sender);
public: // User declarations
void __fastcall Ayuda(TForm* Form, TEdit* Edit);
...
}


form:

...
void __fastcall TfrmAyuda::Ayuda(TForm* Form, TEdit* Edit)
{
// aquí lo que desees hacer con los argumentos
ShowMessage(Form->Name + " - " + Edit->Name + " ,contenido: "+Edit->Text);
}

void __fastcall TfrmAyuda::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}

void __fastcall TfrmAyuda::FormDestroy(TObject *Sender)
{
frmAyuda = NULL;
}


Saludos :)

aguml
17-10-2014, 21:43:15
y digo yo, ¿No te interesa mas usar como parametrosel puntero al form y un enum(poblacion=1,nombre,apellido...) y dentro de la funcion usar un switch que dependiendo del valor use un edit u otro? Por ejemplo Ayuda(fomulario,localidad); y con eso te quitas complicaciones.

escafandra
18-10-2014, 01:28:23
Yo tampoco tengo muy clara la situación pero si ayuda la declaras así:
void Ayuda(TForm *Formulario, TCustomEdit *Edit)

Donde Edit es el edit del formulario sobre el que obtienes ayuda (Poblacion), ¿No sería esto lo que tienes que hacer en la función ayuda?:
Edit->Text = Query->FieldByName("Nombre")->AsString;
Saludos.

Toni
21-10-2014, 14:16:12
Hola,

En este caso como la funcion Ayuda es genericay ademas esta compilada de forma externa te puede ser comodo utilizar los metodos FindComponent. Esto te va a permitir de forma dinamica acceder a cualquier objeto que tengas en el formulario que le pasas a la funcion ayuda.



void Ayuda(TForm *Formulario, TCustomEdit *Edit)
{

// En el caso del formulario Poblaciones rotorna 2 campos adicioanales.
if(Formulario->Name=="Poblaciones")
{
TEdit *CodigoPostal = (TEdit *)Formulario->FindComponent("CodigoPostal");
TEdit *Provincia = (TEdit *)Formulario->FindComponent("Provincia");

if(CodigoPostal != NULL) // Para evitar problemas por si no localiza el campo dentro del form.
CodigoPostal ->Text = Query->FieldByName("CodigoPostal ")->AsString;
if(Provincia != NULL)
Provincia->Text = Query->FieldByName("Provincia")->AsInteger;
}

// Valor de retorno generico para todos los formularios
Form->Nombre->Tag = Query->FieldByName("Nombre")->AsString;

}