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 :

une manipulation de Form que je ne sais pas faire


Sujet :

C++Builder

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut une manipulation de Form que je ne sais pas faire
    Bonjour,
    Je suis amené à migrer l'ihm d'une application dans une DLL
    J'ai une form qui est crée dans l'application principale et utilisée dans la dll
    J'ai donc codé un setter pour passer cette valeur
    Malheureusement le compilateur refuse mon type;
    le vous donne le code appelant, et la procédure appellée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          // Create the application main window
          Application->CreateForm(__classid(TFormMemoriaAligner), &FormMemoriaAligner);
          objMenuToolbarmanager.SetFormAligner( FormMemoriaAligner);
          if (objMenuToolbarManager.ActivateItemsAndButtons(&sVectorMenuItems) != INIT_NO_ERROR)
    la déclaration de la procédure appelée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    erc SetFormAligner( TFormMemoriaAligner Form );
    et l'implémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    __declspec (dllexport) erc CMenuToolbarManager::SetFormAligner(TFormMemoriaAligner Form)
    {
       pFormMemoriaAligner = Form;
    }
    le compilateur me dit ) attendue !!!
    une alternative pour moi serait de récupérer la valeur de Application qui est connu dans le main
    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
     
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
      CSoftwareManager *  pObjSoftwareManager;
      try
      {
        pObjSoftwareManager = new CSoftwareManager;
        bool bMMImode = true ;
        Application->Initialize();
        if (INIT_NO_ERROR != pObjSoftwareManager->Initialization(bMMImode))
        {
          delete pObjSoftwareManager;
          return 1;
        }
        delete pObjSoftwareManager;
        objParserManager.InitParserManager( 2);
        Application->Title = "ALIGNER";
        Application->CreateForm(__classid(TFormMemoriaAligner), &FormMemoriaAligner);
                     Application->Run();
      }
      catch (Exception &exception)
      {
        delete pObjSoftwareManager;
        Application->ShowException(&exception);
      }
      catch (...)
      {
        delete pObjSoftwareManager;
        try
        {
         throw Exception("");
        }
        catch (Exception &exception)
        {
          Application->ShowException(&exception);
        }
      }
      return 0;
    }
    et dans ce cas je transformerai le setter comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    __declspec (dllexport) erc CMenuToolbarManager::SetApplication( Application )
    {
       Application->CreateForm(__classid(TFormMemoriaAligner), &FormMemoriaAligner);
    }
    comment s'en sortir, l'une ou l'autre des solutions permettrai d'arriver au résultat
    j'ai essayé plusieurs approches sans succès

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 649
    Points : 25 397
    Points
    25 397
    Par défaut
    L'objet VCL dont les TForm doivent être passé par Pointer *
    Déjà si tu ne maîtrise pas cela, tu es mal barré !

    si erc est un type, je suppose ?!
    tu as mis l'include ?

    l'espace entre "__declspec" et "(dllexport)" me gène, j'aurais tout attaché "__declspec(dllexport)"

    perso, je préfère l'écire dans l'autre sens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erc __declspec(dllexport) CMenuToolbarManager::SetFormAligner(TFormMemoriaAligner *Form)

    Passer une Classe entre une DLL et une Application nécessite RTL Dynamique, ShareMem et Construction avec Paquet pour que les TypeInfo soient concordants !

    Quel est le véritable besoin ?
    Je ne vois pas pourquoi tu externalises partiellement la fenêtre (en plus la principale ouch !)

  3. #3
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut erc est un type
    Bonjour
    erc = unsigned long long;
    J'a essayé avec des pointeurs mais je n'ai pas eu de différences notables

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 649
    Points : 25 397
    Points
    25 397
    Par défaut
    Remarque con, je ne suis pas un expert C++, je suis développeur Delphi fraichement converti !

    tu peux exporter des méthodes classe en C++ ?

    En Delphi, tu ne peux exporter que des procédures\fonctions simples pas des méthodes puisque cela rajoute en paramètre invisible le pointeur sur Self (Instance ou Référence de Classe, selon méthode statique ou non)

    En C++, je pense qu'il y a aussi l'ajout du pointeur sur this pour les méthodes d'instance.

    Il existe en Delphi une méthode pour contourner ce problème
    Construire une procédure pointant sur une méthode, voir si ce code peut-être adapté au C++ avec des Objets hérités de TObject ?!

  5. #5
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut Mon besoin
    Bonjour et merci des contribution
    Je n'ai pas vu dans la FAQ de réponse à mon problème.
    J'ai besoin de passer l'adresse soit de Application pour ouvrir la form dans la dll soit de passer l'adresse de la form ouverte dans l'application pour utiliser la form
    Actuellement j'ai codé la première voie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    __declspec(dllexport) erc SetApplication( (TApplication*)Application )
    {
       Application->CreateForm(__classid(TFormMemoriaAligner), &FormMemoriaAligner);
       return( INIT_NO_ERROR);
    }
    et le compilateur me répond impossible de convertir TApplication* en int64, malgré le cast dans l'appel de fonction Le type est bien TApplication*

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Points : 578
    Points
    578
    Par défaut
    Hello,

    Pour que ça compile, tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    __declspec(dllexport) erc SetApplication(TApplication* Application )
    {
       Application->CreateForm(__classid(TFormMemoriaAligner), &FormMemoriaAligner);
       return( INIT_NO_ERROR);
    }
    Dans ce que tu avais écrit, la 1ère ligne correspondait à une affectation, pas à une déclaration de fonction. C'était équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erc SetApplication = (TApplication*)Application;
    D'où la 1ère erreur retournée par le compilateur....

    Tu devais avoir une 2ème erreur sur la ligne suivante, non ? genre "Erreur de syntaxe de déclaration", histoire de dire que ce bloc de code n'avait rien à faire là....

  7. #7
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut Ca compile
    Je n'ai pas vérifié l'existence d'une autre erreur mis je constate que ta solution compile. j'aurais du la trouver tout seul d'ailleurs
    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Erreur dans une ligne de code que je ne sais pas corriger
    Par phlg77 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 14/01/2015, 14h21
  2. Amélioré une dll, je sais pas faire.
    Par Veler dans le forum C#
    Réponses: 3
    Dernier message: 05/10/2007, 17h47
  3. Je ne sais pas faire une addition ?
    Par sam80 dans le forum Delphi
    Réponses: 8
    Dernier message: 18/04/2007, 15h13
  4. Réponses: 2
    Dernier message: 31/05/2006, 15h13
  5. Une requête que je n'arrive pas à faire
    Par Denti-fritz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/12/2005, 13h53

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