Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Propietario de un objeto en una función externa (https://www.clubdelphi.com/foros/showthread.php?t=86885)

Angel.Matilla 17-10-2014 18:42:21

Propietario de un objeto en una función externa
 
En BCB 6 tengo una función externa:
Código:

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

Cita:

Empezado por aguml (Mensaje 483263)
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:
Código PHP:

...
#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(Form1Poblacion);
}
... 

Ayuda.

.h
Código PHP:

...
class 
TfrmAyuda : public TForm
{
  
__published:    // IDE-managed Components
  
...
  
void __fastcall FormClose(TObject *SenderTCloseAction &Action);
  
void __fastcall FormDestroy(TObject *Sender);
 public:        
// User declarations
  
void __fastcall Ayuda(TFormFormTEditEdit);
 ...


form:
Código PHP:

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

void __fastcall TfrmAyuda::FormClose(TObject *SenderTCloseAction &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í:
Código PHP:

void Ayuda(TForm *FormularioTCustomEdit *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?:
Código PHP:

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.

Código PHP:


void Ayuda
(TForm *FormularioTCustomEdit *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;





La franja horaria es GMT +2. Ahora son las 11:41:23.

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