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!