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 

Como acceder a funciones de una clase desde fuera?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Como acceder a funciones de una clase desde fuera? Responder citando

Hola a todos!
Espero explicarme bien y que me podais ayudar.

Tengo en un archivo de cabecera la declaracion de una objeto (componente VCL) , que tiene variables y funciones, y una funcion, que esta declarada fuera de la clase.
A esta funcion la que llamo desde una funcion de la clase.
Lo que quiero hacer en la funcion externa a la clase, es que me ejecute una funcion de la clase.

La razon de que la funcion este fuera de la clase, es por que la funcion que la llama es algo asi:

int funcion_de_la_clase
( funcion_ext CallbackFunc, void * x);

es decir a la funcion de la clase se le pasa una funcion como parametro que tiene que tener la forma:

void __cdecl funcion_ext (int num, void *x);

y si declaro esta funcion dentro de la clase
me modifica el tipo de la funcion, y luego me da error ("Cannot convert .....").

A ver si alguien me puede decir como declarar la funcion dentro de la clase para que no me de error, o en su defecto como acceder a una funcion (publica) de la clase desde la funcion declarada fuera.

MUCHISIMAS GRACIAS, por leer este rollazo!

Por cierto:
Enhorabuena por la pagina a quien corresponda!!

Volver arriba
Mensaje    Asunto: Como acceder a funciones de una clase desde fuera? Responder citando

Vamos a ver, es la tercera vez que leo tu mensaje y... no lo tengo demasiado claro aun, pero vamos a intentarlo.
Para que nos entendamos, llamamos a las "funcines" de una clase metodos, asi nos aclararemos mejor.

Un objeto es una variable, tienes que ver que alcance tiene esa variable. Si cuando llamas al metodo de la clase, el objeto no existe aun, mal plan. Si existe, no deberias tener problemas en poner pej.
funcionX()
{
Objeto->Metodo(), o Objeto.Metodo().
}
Aparte de la declaracion del objeto, lo has construido? (si es que lo requiere) me refiero a hacerle la reserva de memoria con "new".

Creo pensar que lo que quieres es meter una clase dentro de una dll (por la directiva __cdecl), y la quieres usar desde fuera, ¿es asi?, si es asi creo tener aun algun ejemplo.

No se si te he podido dar una pista, pero la verdad es que, si no me pones un trozo de codigo pequeñito donde se vea un poco claro...

¿Que error te da al llamar de la funcion al metodo? te permite compilarlo?

Volver arriba
Mensaje    Asunto: Como acceder a funciones de una clase desde fuera? Responder citando

Hola JR!

Creo que lo que pasa es que no hago el new, pero el caso es que tampoco se donde hacerlo.

A ver si ahora me explico mejor.
Estoy haciendo un componente, usando una biblioteca de funciones (3 archivos, 2 archivos.h y 1 archivo.lib).
Los metodos del componente, usan las funciones de estas librerias.

Archivo mi_componente.h:

#ifndef Usb2canH
#define Usb2canH

#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>

#include "isCANdrv.h"

#define CERO 0x00
#define TODO 0xff

========>//metodo para la recepcion automatica
void __cdecl Recepcion_Auto (unsigned char Puente, void* pcontext);

//---------------------------------------------------------------------------
class PACKAGE TUsb2can : public TComponent
{
private:
CAN_Message_type FMensajeRx,FMensajeTx;

unsigned char FNrPuente;

enum TVel_CAN {Kb10=1,Kb20=2,Kb50=3,Kb100=4,Kb125=5,
Kb250=6,Kb500=7,Kb800=8,Kb1000} FVelocidadCAN;

unsigned short FMensajeID;

bool FConectado;

bool FAutoRx;

....

protected:
void __fastcall Estado (bool estado);
void _fastcall Recibe_Auto (bool autorx);

public:
__property CAN_Message_type Mensaje =
{read = FMensajeRx , write = FMensajeTx};

__fastcall TUsb2can(TComponent* Owner);

void __fastcall Cambia_Velocidad ( BYTE Velocidad);

void __fastcall Conectar (void);

void __fastcall Desconectar (void);

void __fastcall Enviar(void);

void __fastcall Enviar
(unsigned short Identificador,unsigned char *Datos);

void __fastcall TxRemoto (unsigned short Identificador);

void __fastcall Recibir(void);


__published:
__property unsigned char NrPuente =
{read=FNrPuente , write=FNrPuente ,default=CERO};
__property TVel_CAN VelocidadCAN =
{read=FVelocidadCAN , write=FVelocidadCAN , default=5};

__property bool Conectado =
{ read = FConectado ,write = Estado , default = false};

=======> __property bool AutoRx =
{ read = FAutoRx , write = Recibe_Auto , default = false};

.....
};
//---------------------------------------------------------------------------
#endif

Con esto, declaro las variables y los metodos del objeto. (He omitido lo de gestionar eventos, por que se hacia muy largo).

Si te fijas donde esta la flecha, el metodo de escritura de la propiedad AutoRx, llama a un metodo llamado "Recibe_Auto".

Este metodo lo tengo implementado en mi_componente.cpp:

//metodo para activar la auto recepcion
void _fastcall TUsb2can::Recibe_Auto (bool autorx)
{
if (autorx)
{FAutoRx=true;
======> unsigned char error=isCAN_StartMessageHandler
(FNrPuente , Recepcion_Auto , NULL);
if ((FOnError)&&(error!=0))
FOnError(this,error);
}
else
{FAutoRx=false;
unsigned char error=isCAN_StopMessageHandler(FNrPuente);
if ((FOnError)&&(error!=0))
FOnError(this,error);
}
}

Si vuelves a mirar en la siguiente flecha, veras que el metodo llama a una funcion, a la que se le pasa como parametro otra funcion, que para que funcione, tiene que ser de la forma:

void __cdecl funcion_ext (unsigned char num, void *x);

Esta funcion esta declarada, justo antes de la declaracion de la clase (arriba del todo).
Y si la declaro dentro de la clase, no me funciona por que cambia el tipo de la funcion.

Lo que quiero que haga esta funcion es llamarme al metodo "Recibir" del objeto

void __cdecl Recepcion_Auto (unsigned char NrPuente, void* pcontext)
{
TUsb2can->Recibir();
}

Y me da este error.
[C++ Error] Usb2can.cpp(148): E2108 Improper use of typedef 'TUsb2can'

Lo que hace el metodo "Recibir", lo puedo hacer desde fuera, pero entonces no puedo meter lo que recibo en el buffer de recepcion del objeto.

JODER QUE ROLLO TE HE SOLTADO!

Espero no cansarte, y que me puedas ayudar.

SALU2!

Volver arriba
Mensaje    Asunto: Como acceder a funciones de una clase desde fuera? Responder citando

Buenas
Bueno te cuento como se has de iniciar un objeto de esa clase en tu aplicacion:

#include <vcl.h>
#pragma hdrstop
#include "project1.h"
#include "tu_componente.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TUsb2can *tu_Objeto=new TUsb2can(this);

// resto de eventos de la aplicacion

De esta manera dejas totalmente visible tu objeto para toda la aplicacion, y lo dejas iniciado. Ya no deberias tener problemas con los metodos publicos.
Yo hago esto con las dll, tal vez te sirva para el componente.

Tiene buena pinta el componente ese que estas haciendo...
una pregunta, para qué es el modificador
__cdecl ?.
Nunca he hecho un componente, no se realmente para que sirve ese modificador. Lo que si he hecho ha sido encapsular clases en dll, en ellas los metodos publicos que quiero llamar desde las aplicaciones los declaro con el modificador:
__declspec(dllexport) void Clase::metodo()

Bueno, suerte con el componente. Ya me contaras que tal.
Un saludo

Volver arriba
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.