IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

[Linker Error] Unresolved external ?


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut [Linker Error] Unresolved external ?
    bonjour,
    j'ai déclaré plusieurs fonction mais lors de l'exécution il m'affiche cette liste d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Linker Error] Unresolved external '_Form1' referenced from E:\TPMAIL\SERVEUR\PROJECT2.OBJ
    [Linker Error] Unresolved external 'inserer(System::AnsiString, System::AnsiString)' referenced from E:\TPMAIL\SERVEUR\UNIT1.OBJ
    [Linker Error] Unresolved external 'recherche(System::AnsiString, System::AnsiString)' referenced from E:\TPMAIL\SERVEUR\UNIT1.OBJ
    [Linker Error] Unresolved external 'add_client_to_open_list(System::AnsiString)' referenced from E:\TPMAIL\SERVEUR\UNIT1.OBJ
    [Linker Error] Unresolved external 'Save_Message(System::AnsiString, System::AnsiString, System::AnsiString)' referenced from E:\TPMAIL\SERVEUR\UNIT1.OBJ
    [Linker Error] Unresolved external 'recherche_nom(System::AnsiString)' referenced from E:\TPMAIL\SERVEUR\UNIT1.OBJ
    [Linker Error] Unresolved external 'get_msg_list(System::AnsiString)' referenced from E:\TPMAIL\SERVEUR\UNIT1.OBJ
    [Linker Error] Unresolved external 'charger_un_message(System::AnsiString, System::AnsiString, System::AnsiString, System::AnsiString&)' referenced from E:\TPMAIL\SERVEUR\UNIT1.OBJ
    [Linker Error] Unresolved external 'delete_client_from_open_list(System::AnsiString)' referenced from E:\TPMAIL\SERVEUR\UNIT1.OBJ
    qu'est ce que veux dire ces erreur?

  2. #2
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Pour toutes excepté la première, c'est que tu n'as pas mis Unit1:: devant le nom des fonction dans le .cpp

  3. #3
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    bonjour
    alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inserer(AnsiString nom,AnsiString pass)
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unit1::inserer(AnsiString nom,AnsiString pass)

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Oui, mais uniquement dans ton .cpp
    En faite j'ai dit une bétise, par défaut la classe s'appelle TForm1, en fait il faut que tu remplace Unit1 de mon message précédent par le nom de la classe (que tu peut voir dans le .h, juste après le mot clef class)

  5. #5
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    il ne marche pas les même erreurs

  6. #6
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Peut tu me montrer ton code dans unit1.cpp et Unit1.h s'il te plaie, ca aiderai à résoudre le problème

  7. #7
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    pas de problème
    unit1.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    AnsiString protocole[10]={
                            "ouvrircompte",
                            "fermercompte",
                            "nouvaucompte",
                            "Envoyermessage",
                            "Consultation",
                            "Lireunmessage",
                            ""};
      enum Requsts{         Ouvrircompte=0,
                            Fermercompte,
                            Nouvauxcompte,
                            Envoyermessage,
                            Consultation,
                            Lireunemessage };
     
    int nb=0;        //nombre de clients connectés
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,TCustomWinSocket *Socket)
    //{
    /*nb++;
    Form1->Label4->Caption=IntToStr(Form1->ServerSocket1->Socket->ActiveConnections);
     
    } */
    //---------------------------------------------------------------------------
     /*void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    nb--;
    this->Label4->Caption=IntToStr(nb);  */
    //}
    //---------------------------------------------------------------------------
    //                 decodage d'un requtte
    //
    ///////////////////////////////////////////////////////////////////////
    void decoder(AnsiString requtte,AnsiString &nom,
                   AnsiString &mot_passe,AnsiString &arg3,AnsiString &message)
    {
    AnsiString  separa="+";
    nom=requtte.SubString(0,requtte.Pos(separa)-1);
    requtte=requtte.SubString(requtte.Pos(separa)+1,requtte.Length()-nom.Length());
    mot_passe=requtte.SubString(0,requtte.Pos(separa)-1);
    requtte=requtte.SubString(requtte.Pos(separa)+1,requtte.Length()-mot_passe.Length());
    arg3=requtte.SubString(0,requtte.Pos(separa)-1);
    requtte=requtte.SubString(requtte.Pos(separa)+1,requtte.Length()-arg3.Length());
    message=requtte;
    }  
    /////////////////////////////////////////////////////////////////
    //              Traitement des requttes
    //
    ///////////////////////////////////////////////////////////////////
     
    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
     {
    AnsiString requtte=Socket->ReceiveText();
    AnsiString  cle,nom,mot_passe,arg3,message;
    decoder(requtte,cle,nom,mot_passe,arg3);
     
    if(cle==protocole[Nouvauxcompte])
    {
           if(recherche_nom(nom))
                      Socket->SendText("NACK");
            else
            {
                      inserer(nom,mot_passe);
                      Socket->SendText("OK") ;
            }
     }
    if(cle==protocole[Ouvrircompte])
    {
           if(!recherche(nom,mot_passe))
                      Socket->SendText("ce compte n'existe pas ");
            else
            {
                      add_client_to_open_list(nom);
                      Socket->SendText("OK") ;
            }
     }
     if(cle==protocole[Envoyermessage])
     {
            if(recherche_nom(nom))
               if(recherche_nom(mot_passe))
                     {
                      Save_Message(mot_passe,nom,arg3);
                      Socket->SendText("OK");
                     }
               else
                   Socket->SendText("NACK");
            else
                 Socket->SendText("NACK");
     }
     if(cle==protocole[Consultation])
     {
            if(recherche_nom(nom))
            {
            AnsiString reponse="OK|";
            reponse+=get_msg_list(nom);
            Socket->SendText(reponse);
            }
            else
            Socket->SendText("NACK|");
     }
     if(cle==protocole[Lireunemessage])
     {
            if(charger_un_message(nom,mot_passe,arg3,message))
            {
            Socket->SendText(message);
            }
            else
              Socket->SendText("");
     
     
     }
     if(cle==protocole[Fermercompte])
     {
     delete_client_from_open_list(nom);
     }
    }      
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      ServerSocket1->Active=true;
      Form1->Caption="Serveur chaine (Actif)";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
       ServerSocket1->Active=false;
       Form1->Caption="Serveur chaine (desactiver)";
    }
    //---------------------------------------------------------------------------
    unit1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ADODB.hpp>
    #include <DB.hpp>
    #include <DBGrids.hpp>
    #include <DBTables.hpp>
    #include <Grids.hpp>
    #include <ScktComp.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
            TTable *Table1;
            TDataSource *DataSource1;
            TServerSocket *ServerSocket1;
            TDBGrid *DBGrid1;
            TButton *Button1;
            TQuery *Query1;
            TButton *Button2;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
            //   void __fastcall ServerSocket1Accept(TObject *Sender,
            //  TCustomWinSocket *Socket);
           // void __fastcall ServerSocket1ClientDisconnect(TObject *Sender,
            //  TCustomWinSocket *Socket);
            void __fastcall ServerSocket1ClientRead(TObject *Sender,
              TCustomWinSocket *Socket);
     
    private:	// User declarations
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

  8. #8
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Elles sont déclaré ou tes focntions inserer, recherche, add_client_to_open_list, Save_Message, recherche_nom, get_msg_list, charger_un_message, et delete_client_from_open_list ?

  9. #9
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    elles sont déclarées dans unit2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    //---------------------------------------------------------------------------
     
     
    #pragma hdrstop
     
    #include "Unit2.h"
    #include "Unit1.h"
     
     
    //---------------------------------------------------------------------------
     
    #pragma package(smart_init)
    ///////////////////////////////////////////////////////////////////////
    //                         rechercher dans un bd
    //
    ///////////////////////////////////////////////////////////////////////
     TForm1::bool recherche(AnsiString nom,AnsiString pass)
    {
    TLocateOptions Option; // Creer un objet option
       Option << loCaseInsensitive; // Rajout de l'option "ne fait pas attention à la casse"
    Variant locvalues[2];
    locvalues[0] = Variant(nom);  //
    locvalues[1] = Variant(pass); // Valeuers
    return Form1->Table1->Locate("Nom;Mot de pass",VarArrayOf(locvalues, 1),Option);
    }
    ///////////////////////////////////////////////////////////////////////
    //
    //
    ///////////////////////////////////////////////////////////////////////
    TForm1::bool recherche_nom(AnsiString nom)
    {
      TLocateOptions Option; // Creer un objet option
       Option << loCaseInsensitive; // Rajout de l'option "ne fait pas attention à la casse"
    Variant l(nom);
    return Form1->
           Table1->
           Locate("Nom;",l,Option);/* Recherche l'enregistrement suivant
       les critères */
     
    }
    //////////////////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////////////////
    TForm1::inserer(AnsiString nom,AnsiString pass)
    {
    Form1->Table1->Insert();
    Form1->Table1->FieldByName("Nom")->AsString=nom;
    Form1->Table1->FieldByName("Mot_pass")->AsString=pass;
    Form1->Table1->Post();
    /*Creat_Message_DB(nom);
    Save_Message(nom,"System","Félicitations "+nom); */
    }
     
    ///////////////////////////////////////////////////////////////////////
    //                Créer une base de données pour sauvgarder
    //                les messages de client
    //                Exemple : Client1_messages.MB
    //
    ////////////////////////////////////////////////////////////////////////
     
     
    TForm1::Creat_Message_DB(AnsiString account_name)
    {
    TTable *DB=new TTable(NULL);
    DB->Active=false;  // The Table component must not be active
    DB->DatabaseName = "DATA\\MSG\\";
    DB->TableType = ttParadox;
     
    DB->TableName =account_name+"_messages";
     
    if (!DB->Exists) // Don't overwrite an existing table
    {
     // describe the fields in the table
      DB->FieldDefs->Clear();
      TFieldDef *pNewDef = DB->FieldDefs->AddFieldDef();
      pNewDef->Name = "Source";
      pNewDef->DataType = ftString;
      pNewDef->Size =20;
      pNewDef->Required = true;
      pNewDef =DB->FieldDefs->AddFieldDef();
      pNewDef->Name = "Date de réception";
      pNewDef->DataType = ftString;
      pNewDef =DB->FieldDefs->AddFieldDef();
      pNewDef->Name = "Message";
      pNewDef->DataType = ftMemo;
      pNewDef->Size = 240;
      DB->CreateTable();
    }
    }
    //////////////////////////////////////////////////////////////////////
    //                      Sauvgarder un message dans la bese de
    //                      données des message de client
    //
    ///////////////////////////////////////////////////////////////////////
     
    TForm1::Save_Message(AnsiString account_name,
                 AnsiString source,
                 AnsiString msg)
       {
    TDateTime dt;
    TTable *DB=new TTable(NULL);
    DB->Active=false;  // The Table component must not be active
    DB->DatabaseName = "DATA\\MSG\\";
    DB->TableName =account_name+"_messages";
    DB->Active=true;  // The Table component  be active
    //              insert a new record for the message
    DB->Insert();
    DB->FieldByName("Source")->AsString=source;
    DB->FieldByName("Date de réception")->AsDateTime=dt.CurrentDateTime();
    DB->FieldByName("Message")->AsString=msg;
    DB->Post();
    DB->~TTable();
    }
    ///////////////////////////////////////////////////////////////////////
    //               Ajoter une enregestrement dans la liste des
    //                            comptes ouverts
    //
    ///////////////////////////////////////////////////////////////////////
     TForm1:: void add_client_to_open_list(AnsiString nom)
      {
            Form1->ListBox1->AddItem(nom,NULL);
      }
    ///////////////////////////////////////////////////////////////////////
    //               supp une enregestrement dans la liste des
    //                            comptes ouverts
    //
    ///////////////////////////////////////////////////////////////////////
      void delete_client_from_open_list(AnsiString nom)
      {
      int index=0;
      if((index=Form1->ListBox1->Items->IndexOf(nom))>=0)
         Form1->ListBox1->Items->Delete(index);
      }
    //////////////////////////////////////////////////////////////////////
    //                         Former une lise des messages
    //                         d'un client
    //
    ///////////////////////////////////////////////////////////////////////
     
    TForm1::AnsiString get_msg_list(AnsiString account_name)
    {
    AnsiString msglist;
    TTable *DB=new TTable(NULL);
    DB->Active=false;  // The Table component must not be active
    DB->DatabaseName = "DATA\\MSG\\";
    DB->TableName =account_name+"_messages";
    DB->Active=true;        // The Table component  be active
    DB->First();            // go to first record
    int n=DB->RecordCount;  // get number of records
    msglist=IntToStr(n);
    msglist+="|";
    for(int i=0;i<n;i++)
    {
    msglist+=DB->FieldByName("Source")->AsString;
    msglist+=",";
    msglist+=DB->FieldByName("Date de réception")->AsString;
    msglist+="|";
    DB->Next();
    }
    DB->~TTable();
    return(msglist);
    }
    /////////////////////////////////////////////////////////////
    //             Charger un message d'un client
    //               le message est dans l'arg message
    //////////////////////////////////////////////////////////////
    TForm1::bool charger_un_message(AnsiString account_name,AnsiString date,
                    AnsiString source ,AnsiString &message  )
    {
    TTable *DB=new TTable(NULL);
    DB->Active=false;  // The Table component must not be active
    DB->DatabaseName = "DATA\\MSG\\";
    DB->TableName =account_name+"_messages";
    DB->Active=true;
    TLocateOptions Opts;  // options de recherche
    Opts.Clear();
    Opts << loPartialKey;   // ?!
    Variant locvalues[2];
    locvalues[0] = Variant(date.Trim());//    //date de réception
    locvalues[1] = Variant(source.Trim()); // source de message
     
     
    if(DB->Locate("Date de réception;Source",
                    VarArrayOf(locvalues, 1),Opts))
            {
              message=DB->FieldByName("Message")->AsString;
              DB->~TTable();
              return(true);
            }
          DB->~TTable();
       return(false);
     
    }

  10. #10
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Ok, alors il faut faire deux chose, tout d'abords dans unit2 (j'ai mis en rouge les modifications, j'ai supposé que ta classe s'appelais TForm2, mais tu doit vérifié dans le fichier Unit2.h (ou met le mettre ici je te dirais si c'est bon)):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    //---------------------------------------------------------------------------
     
     
    #pragma hdrstop
     
    #include "Unit2.h"
    #include "Unit1.h"
     
     
    //---------------------------------------------------------------------------
     
    #pragma package(smart_init)
    ///////////////////////////////////////////////////////////////////////
    //                         rechercher dans un bd
    //
    ///////////////////////////////////////////////////////////////////////
    bool TForm2::recherche(AnsiString nom,AnsiString pass)
    {
    TLocateOptions Option; // Creer un objet option
       Option << loCaseInsensitive; // Rajout de l'option "ne fait pas attention à la casse"
    Variant locvalues[2];
    locvalues[0] = Variant(nom);  //
    locvalues[1] = Variant(pass); // Valeuers
    return Form1->Table1->Locate("Nom;Mot de pass",VarArrayOf(locvalues, 1),Option);
    }
    ///////////////////////////////////////////////////////////////////////
    //
    //
    ///////////////////////////////////////////////////////////////////////
    bool TForm2::recherche_nom(AnsiString nom)
    {
      TLocateOptions Option; // Creer un objet option
       Option << loCaseInsensitive; // Rajout de l'option "ne fait pas attention à la casse"
    Variant l(nom);
    return Form1->
           Table1->
           Locate("Nom;",l,Option);/* Recherche l'enregistrement suivant
       les critères */
     
    }
    //////////////////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////////////////
    void TForm2::inserer(AnsiString nom,AnsiString pass)
    {
    Form1->Table1->Insert();
    Form1->Table1->FieldByName("Nom")->AsString=nom;
    Form1->Table1->FieldByName("Mot_pass")->AsString=pass;
    Form1->Table1->Post();
    /*Creat_Message_DB(nom);
    Save_Message(nom,"System","Félicitations "+nom); */
    }
     
    ///////////////////////////////////////////////////////////////////////
    //                Créer une base de données pour sauvgarder
    //                les messages de client
    //                Exemple : Client1_messages.MB
    //
    ////////////////////////////////////////////////////////////////////////
     
     
    void TForm2::Creat_Message_DB(AnsiString account_name)
    {
    TTable *DB=new TTable(NULL);
    DB->Active=false;  // The Table component must not be active
    DB->DatabaseName = "DATA\\MSG\\";
    DB->TableType = ttParadox;
     
    DB->TableName =account_name+"_messages";
     
    if (!DB->Exists) // Don't overwrite an existing table
    {
     // describe the fields in the table
      DB->FieldDefs->Clear();
      TFieldDef *pNewDef = DB->FieldDefs->AddFieldDef();
      pNewDef->Name = "Source";
      pNewDef->DataType = ftString;
      pNewDef->Size =20;
      pNewDef->Required = true;
      pNewDef =DB->FieldDefs->AddFieldDef();
      pNewDef->Name = "Date de réception";
      pNewDef->DataType = ftString;
      pNewDef =DB->FieldDefs->AddFieldDef();
      pNewDef->Name = "Message";
      pNewDef->DataType = ftMemo;
      pNewDef->Size = 240;
      DB->CreateTable();
    }
    }
    //////////////////////////////////////////////////////////////////////
    //                      Sauvgarder un message dans la bese de
    //                      données des message de client
    //
    ///////////////////////////////////////////////////////////////////////
     
    void TForm2::Save_Message(AnsiString account_name,
                 AnsiString source,
                 AnsiString msg)
       {
    TDateTime dt;
    TTable *DB=new TTable(NULL);
    DB->Active=false;  // The Table component must not be active
    DB->DatabaseName = "DATA\\MSG\\";
    DB->TableName =account_name+"_messages";
    DB->Active=true;  // The Table component  be active
    //              insert a new record for the message
    DB->Insert();
    DB->FieldByName("Source")->AsString=source;
    DB->FieldByName("Date de réception")->AsDateTime=dt.CurrentDateTime();
    DB->FieldByName("Message")->AsString=msg;
    DB->Post();
    DB->~TTable();
    }
    ///////////////////////////////////////////////////////////////////////
    //               Ajoter une enregestrement dans la liste des
    //                            comptes ouverts
    //
    ///////////////////////////////////////////////////////////////////////
      void TForm2::add_client_to_open_list(AnsiString nom)
      {
            Form1->ListBox1->AddItem(nom,NULL);
      }
    ///////////////////////////////////////////////////////////////////////
    //               supp une enregestrement dans la liste des
    //                            comptes ouverts
    //
    ///////////////////////////////////////////////////////////////////////
      void TForm2::delete_client_from_open_list(AnsiString nom)
      {
      int index=0;
      if((index=Form1->ListBox1->Items->IndexOf(nom))>=0)
         Form1->ListBox1->Items->Delete(index);
      }
    //////////////////////////////////////////////////////////////////////
    //                         Former une lise des messages
    //                         d'un client
    //
    ///////////////////////////////////////////////////////////////////////
     
    void TForm2::AnsiString get_msg_list(AnsiString account_name)
    {
    AnsiString msglist;
    TTable *DB=new TTable(NULL);
    DB->Active=false;  // The Table component must not be active
    DB->DatabaseName = "DATA\\MSG\\";
    DB->TableName =account_name+"_messages";
    DB->Active=true;        // The Table component  be active
    DB->First();            // go to first record
    int n=DB->RecordCount;  // get number of records
    msglist=IntToStr(n);
    msglist+="|";
    for(int i=0;i<n;i++)
    {
    msglist+=DB->FieldByName("Source")->AsString;
    msglist+=",";
    msglist+=DB->FieldByName("Date de réception")->AsString;
    msglist+="|";
    DB->Next();
    }
    DB->~TTable();
    return(msglist);
    }
    /////////////////////////////////////////////////////////////
    //             Charger un message d'un client
    //               le message est dans l'arg message
    //////////////////////////////////////////////////////////////
    bool TForm2::charger_un_message(AnsiString account_name,AnsiString date,
                    AnsiString source ,AnsiString &message  )
    {
    TTable *DB=new TTable(NULL);
    DB->Active=false;  // The Table component must not be active
    DB->DatabaseName = "DATA\\MSG\\";
    DB->TableName =account_name+"_messages";
    DB->Active=true;
    TLocateOptions Opts;  // options de recherche
    Opts.Clear();
    Opts << loPartialKey;   // ?!
    Variant locvalues[2];
    locvalues[0] = Variant(date.Trim());//    //date de réception
    locvalues[1] = Variant(source.Trim()); // source de message
     
     
    if(DB->Locate("Date de réception;Source",
                    VarArrayOf(locvalues, 1),Opts))
            {
              message=DB->FieldByName("Message")->AsString;
              DB->~TTable();
              return(true);
            }
          DB->~TTable();
       return(false);
     
    }
    Et dans Unit1.cpp :
    tu dois mettre, devant chaque fonction situé dans Unit2.cpp, Form2-> (la encore si tu me passe le fichier Unit2.h je peut te dire précisément si c'est Form2 ou autre chose.)

  11. #11
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    dans l'unit2 c'est form1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #ifndef Unit2H
    #define Unit2H
    #include<classes.hpp>
    //---------------------------------------------------------------------------
    Creat_Message_DB(AnsiString account_name);
    Save_Message(AnsiString account_name,AnsiString source,AnsiString msg);
     void add_client_to_open_list(AnsiString nom);
     AnsiString get_msg_list(AnsiString account_name);
     bool charger_un_message(AnsiString account_name,AnsiString date,
                    AnsiString source ,AnsiString &message  );
      inserer(AnsiString nom,AnsiString pass);
     bool recherche_nom(AnsiString nom);
     bool recherche(AnsiString nom,AnsiString pass);
     void delete_client_from_open_list(AnsiString nom);
     
    #endif

  12. #12
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Aie, tu n'est pas passé par les classes pour ton unit2,

    alors il faut que tu créé une classe dans ton unit2.h comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #ifndef Unit2H
    #define Unit2H
    #include<classes.hpp>
    //---------------------------------------------------------------------------
    class Le_Nom_De_Ta_Classe {
    public :
      Le_Nom_De_Ta_Classe(void){;}
      ~Le_Nom_De_Ta_Classe(void){;}
      void Creat_Message_DB(AnsiString account_name);
      void Save_Message(AnsiString account_name,AnsiString source,AnsiString msg);
      void add_client_to_open_list(AnsiString nom);
      AnsiString get_msg_list(AnsiString account_name);
      bool charger_un_message(AnsiString account_name,AnsiString date,
                    AnsiString source ,AnsiString &message  );
      void inserer(AnsiString nom,AnsiString pass);
      bool recherche_nom(AnsiString nom);
      bool recherche(AnsiString nom,AnsiString pass);
      void delete_client_from_open_list(AnsiString nom);
    };
     
    #endif
    puis dans le Unit1.h tu ajoute ceci (en rouge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ADODB.hpp>
    #include <DB.hpp>
    #include <DBGrids.hpp>
    #include <DBTables.hpp>
    #include <Grids.hpp>
    #include <ScktComp.hpp>
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// IDE-managed Components
            TTable *Table1;
            TDataSource *DataSource1;
            TServerSocket *ServerSocket1;
            TDBGrid *DBGrid1;
            TButton *Button1;
            TQuery *Query1;
            TButton *Button2;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
            //   void __fastcall ServerSocket1Accept(TObject *Sender,
            //  TCustomWinSocket *Socket);
           // void __fastcall ServerSocket1ClientDisconnect(TObject *Sender,
            //  TCustomWinSocket *Socket);
            void __fastcall ServerSocket1ClientRead(TObject *Sender,
              TCustomWinSocket *Socket);
           
    private:	// User declarations
    public:		// User declarations
            __fastcall TForm1(TComponent* Owner);
            Le_Nom_De_Ta_Classe objet_de_ta_Classe;
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    Dans Unit2.cpp tu remplace tous les Form2 par Le_Nom_De_Ta_Classe

    et dans Unit1.cpp tu remplace tous les Form2-> par objet_de_ta_Classe->

  13. #13
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    je suis désolé je vais posé une question bête comment puis-je créer une classe(c-a-d quelles sont les étapes à suivra pour créer une classe)

  14. #14
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Tu n'as pas à être désolé, c'est normal comme question lorsque l'on débute, par contre ce serai trop long à tout expliqué sur le forum, je t'invite donc à consulté se tutoriel (http://cpp.developpez.com/cours/polyCpp/) pour apprendre et approfondir tes connaissance en C++ et réessayé ensuite, sinon tu aura beaucoup de mal a faire ce que tu veut

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Il faudrait savoir ici dans quel sens on modélise : méthodes ou fonctions ?

    S'il s'agit de méthodes, dans ce cas il faut les déclarer dans leur classe, soit private pour limiter l'appel à la classe elle-même soit public !
    Il semblerait que la classe ici, soit TForm1... ???
    A ce stade, peu importe si elles sont développées ailleurs, du moment que le header déclarant cette classe est inclus dans l'unité où l'on développe ces méthodes.
    On aurait quand même tendance à ramener tout ce qui concerne une classe dans l'unité qui lui est dédiée (en pensant à celui qui passera, l'année d'après pour apporter des modifications...).

    S'il s'agit de fonctions, dans ce cas il faut :
    - soit les déclarer comme extern avant leur usage, ces fonctions n'étant que développées dans une autre unité (quelle qu'elle soit)
    - soit inclure le header de l'unité dans laquelle elles ont été développées, sans oublier bien sur de les y avoir déclarées !
    - soit les développer en amont de leur utilisation (donc dans l'unité qui va s'en servir), au quel cas celà équivaut pour le compilateur à une déclaration. On a la même situation si on développe ces fonctions dans un fichier TXT que l'on peut inclure juste avant leur utilisation (en sachant qu'il ne faut les inclure qu'une fois dans tout le projet) et vis à vis d'un usage dans d'autres unités, il faudrait les y déclarer en tant qu'extern.

    A plus !

  16. #16
    Membre éclairé
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Par défaut
    bonjour,
    merci 'henderson' pour les information
    j'ai une question j'ai trouvé un projet se projet il marche bien pas d'erreur
    j'ai copier tous les unité dans un autre répertoire pour modifier les fonction quand j'exécute il m'affiche la liste d'erreur pourquoi?

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2010, 14h06
  2. Réponses: 16
    Dernier message: 30/04/2009, 15h51
  3. Probleme :"[Linker Error] Unresolved external"
    Par Dusty_Luke dans le forum C++Builder
    Réponses: 6
    Dernier message: 22/03/2007, 22h27
  4. error LNK2019: unresolved external symbol
    Par soniona dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 06/04/2006, 14h03
  5. Réponses: 4
    Dernier message: 23/04/2004, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo