Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Incluir un data module dos veces? (https://www.clubdelphi.com/foros/showthread.php?t=53266)

Antonioveneroso 15-02-2008 20:15:03

Incluir un data module dos veces?
 
Estoy haciendo una aplicación donde, entre otras cosas, doy de alta clientes.
En la form de Altacliente, tengo un combobox, el cual contiene los nombres de los asesores (a cada cliente se le asigna un asesor). Los asesores se leen de una base de datos.
La form de Altacliente llama a Cliente.cpp (y Cliente.h), donde se realizan las operaciones con el cliente (altas, bajas, etc...).
Para comunicarme con la base de datos, tengo un datamodule con todos los componenetes necesarios (winsocks, sessions, database, queries, etc), y este datamodule lo incluyo en cada form que se comunica con la base de datos.
El problema que tengo es que, sin incluyo el datamodule en Cliente.cpp, me marca errores del tipo "múltiples declaraciones de <alguna variable>", comprensible porque el datamodule ya está incluido en la form de AltaCliente.
En Cliente.cpp incluyo la form AltaCliente porque los datos los voy tomando de la forma "strcpy(Nombre, AltasClientes->txtNombre->Text.c_str());"
E incluyo el datamodule en Cliente.cpp porque aquí es donde se hace la llamada a la query para ingresar los datos a la base de datos.
Mi pregunta es: ¿cómo accedo a lo que hay en el datamodule desde Cliente.cpp para realizar las operaciones (altas, bajas, etc)?
Espero haber sido lo suficientemente claro, y si no lo fui, pregunten, estoy así como que necesitado de esta información.
De antemano muchísimas gracias por la ayuda que me puedan brindar.
Saludos!

reevil 15-02-2008 20:34:23

la verdad no se si entendi bien tu pregunta pero segun yo podrias hacer en Cliente.cpp algo como:
Código:

AltaCliente->Datamodule-> ....
...

asi usarias en Cliente.cpp el Datamodule Declarado en AltaCLiente
no se si eso te ayude en algo :o
saludos

Antonioveneroso 15-02-2008 20:50:24

Anda pues eso es lo que intenté en un principio! Pero no me deja...
El problema es que el datamodule lo creé hace un tiempo, lo guardé como... creo que se les llama módulos (aparece en una de las pestañas cuando das click en File->New->Other).
Entonces lo único que hago es crear un proyecto nuevo y agrego el datamodule con ya todo hecho... ¿me explico?
Entonces, yo supuse que sería tan sencillo como llamarlo:
"VAltasClientes->RemoteDM->bla bla bla...", pero me marca error. (RemoteDM is not a member of TVAltasClientes).
Como referencia: el archivo (el datamodule) se llama "Unit2.cpp", la clase se llama "TRemoteDM".
Gracias por tu rápida respuesta.
Saludos!

Antonioveneroso 04-03-2008 19:12:06

Después de cambiar algunas partes del sistema, sigo teniendo este mismo problema, me dice que hay múltiples declaraciones de <variable>. No entiendo por qué, pues el DataModule sólo está declarado en un lugar.
Dejo el código donde lo tengo declarado, a ver si alguien puede ayudarme con esto:

Código:

#include "ModuloConexion.h" //Aquí está el DataModule
#include "cAsesor.h"
 
int Asesor::Alta_Asesor(){
/* Aquí van las operaciones */
}
void Asesor::Baja_Asesor(){
/* Aquí van las operaciones */
}
void Asesor::Modifica_Asesor(){
/* Aquí van las operaciones */
}
void Asesor::Consulta_Asesor(){
/* Aquí van las operaciones */
}
int Asesor::Llena_Campos(){
/* Aquí van las operaciones */
}

Yo digo que el error está por ahí, porque los errores que lanza son estos:

Cita:

[C++ Error] winsock2.h(109): E2238 Multiple declaration for 'fd_set'
[C++ Error] winsock.h(54): E2344 Earlier declaration of 'fd_set'
[C++ Error] winsock2.h(112): E2146 Need an identifier to declare
[C++ Error] winsock2.h(153): E2238 Multiple declaration for 'timeval'
[C++ Error] winsock.h(97): E2344 Earlier declaration of 'timeval'
[C++ Error] winsock2.h(209): E2238 Multiple declaration for 'hostent'
[C++ Error] winsock.h(153): E2344 Earlier declaration of 'hostent'
[C++ Error] winsock2.h(222): E2238 Multiple declaration for 'netent'
[C++ Error] winsock.h(166): E2344 Earlier declaration of 'netent'
[C++ Error] winsock2.h(229): E2238 Multiple declaration for 'servent'
[C++ Error] winsock.h(173): E2344 Earlier declaration of 'servent'
[C++ Error] winsock2.h(241): E2238 Multiple declaration for 'protoent'
[C++ Error] winsock.h(185): E2344 Earlier declaration of 'protoent'
[C++ Error] winsock2.h(327): E2238 Multiple declaration for 'in_addr'
[C++ Error] winsock.h(269): E2344 Earlier declaration of 'in_addr'
[C++ Error] winsock2.h(385): E2238 Multiple declaration for 'sockaddr_in'
[C++ Error] winsock.h(319): E2344 Earlier declaration of 'sockaddr_in'
[C++ Error] winsock2.h(395): E2238 Multiple declaration for 'WSAData'
[C++ Error] winsock.h(329): E2344 Earlier declaration of 'WSAData'
[C++ Error] winsock2.h(411): E2146 Need an identifier to declare
[C++ Error] winsock2.h(546): E2238 Multiple declaration for 'sockaddr'
[C++ Error] winsock.h(492): E2344 Earlier declaration of 'sockaddr'
[C++ Error] winsock2.h(586): E2238 Multiple declaration for 'sockproto'
[C++ Error] winsock.h(501): E2344 Earlier declaration of 'sockproto'
[C++ Error] winsock2.h(625): E2238 Multiple declaration for 'linger'
[C++ Error] winsock2.h(625): E2228 Too many error or warning messages

escafandra 05-03-2008 00:02:01

No entiendo si ese código es una cabecera.h o un fragmento de archivo .cpp.
No debes incluir código en una cabecera, a no ser que sea código inline.

Por otro lado, si una cabecera no está diseñada con cuidado, y se abre desde dos puntos distintos del proyecto, el compilador puede dar errores de múltiple definición.

Ejemplo:
Código:

#ifndef CabeceraH
#define CabeceraH
// CabeceraH será el mismo nombre del archivo cabecera, por ejemplo. QUE NO SE REPITA....
//---------------------------------------------------------------------------
//DEFINICIONES
.
.
.
//---------------------------------------------------------------------------
#endif

Esta técnica asegura que el compilador sólo leerá una vez las definiciones.
En ocasiones, algunas cabeceras del sistema, son muy complejas, con múltiples condicionantes que, si no las conocemos, nos darán errores aparentemente inexplicables.

Saludos.

Antonioveneroso 05-03-2008 17:12:31

Es un fragmento de cAsesor.cpp. El cAsesor.h está definido así:
Código:


#if !defined(_ASESOR_H)
#define _ASESOR_H
class Asesor
{
public:
    int Alta_Asesor();
    void Baja_Asesor();
    void Modifica_Asesor();
    void Consulta_Asesor();
    int Llena_Campos();
private:
    char * Nombre;
    char * Telefono;
    char * Correo;
};
#endif  //_ASESOR_H

¿Crees que el error sea por la diferencia de la línea? Dices que debería ser #ifndef _ASESOR_H, y staruml (aplicación con la cuál generé las clases) lo definió como está aquí.
Voy a probar cambiándolo, a ver si ya funciona.
Gracias por la ayuda!

Editando:
No, no es por la línea... sigue marcando esos errores...

escafandra 05-03-2008 17:43:19

No, con esa cabecera no vas a tener problemas. Creo que el error lo tienes en otro punto. Fijate que los mensajes de error son para la cabecera winsock2.h que es del sistema (S.O.). Probablemente la forma de incluir esa cabecera no esté bien debido a condicionantes de compilación escritos en las mismas cabeceras. Esa cabecera la tienes incluida en alguna parte. Si está incluida a su vez en otra cabecera creada por tí, trata de incluirla en el archivo.cpp correspondiente.

Saludos;)

Antonioveneroso 05-03-2008 18:44:31

Yo no he incluido esos archivos en ninguno de los creados por mí, y por más que busco dónde prodrían estar incluidos, no los encuentro...
Estoy utilizando una manejador de base de datos llamado NexusDB, utilizando una arquitectura cliente/servidor. Para que Nexus pueda conectarse desde mi máquina al servidor, requiere saber dónde tengo 213 archivos .hpp y .h.
Usando Borland para buscar en todos los archivos del proyecto algún indicio de winsock.h o winsock2.h me dice que en ningún lugar se hace referencia a esos archivos...

escafandra 05-03-2008 19:43:28

Pues evidentemente existe una referencia, de lo contrario no saltaría el compilador. La llamada es desde una de las cabeceras de tu sistema, que probablemente, no es compatible con las de Borland.

Ten en cuenta que una libreria.h puede incluir otra(#include) y esta, a su vez otra y otra...

Winsock es un sistema de comunicación en red (Socket). Investiga esta pista en tus librerías.h

Saludos.

Antonioveneroso 05-03-2008 19:48:13

Yo creo que el problema está en que falta algo en el archivo de cAsesor.cpp y/o cAsesor.h, porque si incluyo el ModuloConexion.h en las ventanas creadas en Borland, el problema desaparece... como por arte de magia... sólo que no he encontrado qué podría agregar a mis clases para que deje de enviarme esos errores...

escafandra 05-03-2008 20:06:16

Cita:

Empezado por Antonioveneroso (Mensaje 270954)
Yo creo que el problema está en que falta algo en el archivo de cAsesor.cpp y/o cAsesor.h, porque si incluyo el ModuloConexion.h en las ventanas creadas en Borland, el problema desaparece... como por arte de magia... sólo que no he encontrado qué podría agregar a mis clases para que deje de enviarme esos errores...


Pues como te he comentado, las directivas condicionales del preprocesador, pueden hacer que "algo se compile o no". Busca defines. Una variable definida con un #define puede ser la que haga la "magia".

Saludos.;)


La franja horaria es GMT +2. Ahora son las 06:01:55.

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