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 :

Problème de transportabilité de composant (Builder à Delphi)


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut Problème de transportabilité de composant (Builder à Delphi)
    Comme j'ai beaucoup de temps à perdre ces temps-ci (mes étudiants sont en grève), je m'amuse à transposer des composant de Builder à Delphi. Quand on y pense, si on veut devenir riche et/ou célèbre , aussi bien développer ses composant en Delphi, qui vont ensuite fonctionner sous les deux plate-formes, l'inverse n'étant pas vrai.

    Le plus simple de mes composants est sans aucun doute MMTimer, qui n'est rien d'autre que de l'encapsulation de deux fonctions de l'API multi-média windows (timerSetEvent, timerKillEvent).

    Je réécris donc mon module MMTimer en Delphi que j'intègre dans mon package de composants.

    Je teste donc mon MMTimer dans une application Builder C++, mon petit programme test fonctionne toujours, même si le test est brutal avec un intervalle d'appel de 1 milliseconde:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void __fastcall TForm1::MMTimer1Timer(TObject *Sender)
    {
       static int cnt ;
     
       cnt++ ;
       Edit1->Text = cnt ;
    }
    Je dis brutal, parce que le TEdit est accéder au milliseconde et je me doute que ça pourrait prendre à Windows plus de 1 ms pour rafraichir TEdit. Donc, des problèmes de réentrance à l'horizon. Mais non, ça fonctionne très bien.

    Je teste ensuite le tout en Delphi et là, ça plante sérieusement au bout de quelques secondes. Le message d'erreur n'est pas explicite ("PROJET1.EXE a cessé de fonctionner). Surement un problème de débordement de pile dû à la réentrance, que je me dis.

    En résumé, un comportement distinct avec un composant (écrit en delphi) dépendant s'il est utilisé en Delphi ou Builder C++.

    Si des développeurs mixtes (C++/Delphi) pouvaient me donner du feedback, ça serait apprécié...

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Quel est le code Delphi ?
    Ca c'est le Gestionnaire d'Evènemement pas le code du composant

    un composant en Delphi utilisé en C++ c'est un classique

    Il me semble qu'il est possible d'écrire des classes en C++ et de les utiliser en Delphi, je n'ai pas encore expérimenté cela, je crois que c'est une nouveauté XE de pouvoir inclure du C++ dans un projet Delphi !

    Sinon, l'affectation de la propriété Text ne fait que mettre à jour le Edit par un Message WM_SETTEXT, le controle est alors invalidé mais il n'y a pas de rafraichissement immédiat mais une série de Message qui sera émis par Windows intercepté par la boucle Application.Run() qui là provoquera le dessin, il est possible que tu modifie plusieurs fois le Texte avant même que l'Edit se soit rafraichi (bon, un délai d'un 1 ms, c'est peu probable mais théoriquement possible sur un système qui est bcp sollicité)

    Comme timeSetEvent est obsolète profites-en pour utiliser à la place CreateTimerQueueTimer
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Merci pour ta répons, ShaiLeTroll

    Citation Envoyé par ShaiLeTroll Voir le message
    Il me semble qu'il est possible d'écrire des classes en C++ et de les utiliser en Delphi, je n'ai pas encore expérimenté cela, je crois que c'est une nouveauté XE de pouvoir inclure du C++ dans un projet Delphi !
    Je vais essayé ça, je t'en donne des nouvelles.

    Citation Envoyé par ShaiLeTroll Voir le message
    Comme timeSetEvent est obsolète profites-en pour utiliser à la place CreateTimerQueueTimer
    J'ai effectivement vu ça sur la doc de MSDN:

    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Mais lit le deuxième commentaire, y a des septiques. je vais regarder ça de plus près.

    Pour mon bug, c'est effectivement un problème de réentrance que j'ai réglé facilement avec le code suivant:

    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
     
    procedure TForm2.MMTimer1Timer(Sender: TObject);
     
    var stg : AnsiString ;
     
    begin
     Inc(cnt) ;
     if CheckBox1.Checked then
       begin
         CheckBox1.Checked := false ;
         Edit1.Text := IntToStr(cnt) ;
       end;
    end;
     
    procedure TForm2.Edit1Change(Sender: TObject);
    begin
      CheckBox1.Checked := true ;
    end;
    A+

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

Discussions similaires

  1. [Delphi][zeos] Problème d'installation du composant
    Par colfire_dev dans le forum Composants VCL
    Réponses: 4
    Dernier message: 13/01/2008, 12h50
  2. Problème Avec le composant IDFTP delphi 7
    Par QAYS dans le forum Composants VCL
    Réponses: 1
    Dernier message: 12/09/2007, 17h35
  3. Composant Industriel delphi/C++ Builder
    Par cocou dans le forum Delphi
    Réponses: 3
    Dernier message: 03/04/2007, 14h11
  4. Réponses: 1
    Dernier message: 06/07/2006, 19h20
  5. Réponses: 1
    Dernier message: 09/12/2005, 09h16

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