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

Composants VCL Delphi Discussion :

Communication Flash(Flex) et Delphi


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 200
    Points : 165
    Points
    165
    Par défaut Communication Flash(Flex) et Delphi
    Bonjour à tous,

    Dans mon projet Delphi j'utilise un fichier flash (TShockwaveFlash) pour afficher mes résultats de deux manières différentes. Pour précision il s'agit des composants AreaChart en Flex.
    Dans le premier cas mon composant est posé sur un TPanel et visible pour l'utilisateur. Aucun problème.
    Dans le deuxième cas je ne dois pas afficher le composant. J'ai juste besoin de son screenshot, en bitmap, pour le dessiner sur un Tcanvas.
    J'utilise le méthode suivante :
    Création d'une TForm invisible dans laquelle je créé un TPanel dans lequel je met le Flash.
    Quand le Flash est initialisé il envoie un Fscommand qui m'indique que je peux faire le screenShot.
    Dans un projet Flash sans Flex aucun problème.
    Mais avec Flex le flash met au moins 5 secondes pour se mettre à jour et m'envoyer le FSCommand. Ce qui est inacceptable dans mon cas.
    Si je rends la TForm visible ça prend moins d'une seconde! Mais cette solution est n'est pas possible car ce code doit aussi fonctionner dans une DLL sur un serveur.

    Voici le code
    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
     
    Procedure TForm2.FlashDansBitmap(w, h: Integer);
    var
     formFlash: TForm; // Fenêtre temporaire dans laquelle on va afficher le flash
     Swf: TShockwaveFlash;
     panelSwf: TPanel;
     finAttente: Cardinal; // Pour ne pas attendre indéfiniment
    begin
     
     // Création d'une fenêtre temporaire pour afficher le Flash
     formFlash := TForm.create(nil);
     formFlash.visible := cbVisible.checked; //Pour les test de rapidité
     try
        panelSwf := TPanel.Create(formFlash);
        panelSwf.Parent := formFlash;
        panelSwf.Height := h;
        panelSwf.Width := w;
     
        formFlash.clientHeight := h;
        formFlash.clientWidth := w;
     
        Swf := TShockwaveFlash.Create(panelSwf);
        Swf.Parent := panelSwf;
        Swf.Align := alClient;
     
        SendMessage(Swf.Handle, WM_LBUTTONDOWN, -10, -10); // Il faut lui envoyer un message pour qu'il prenne la bonne taille
     
        Swf.OnFSCommand := SwfFSCommandVueFlash; // Sera appelé quand le flash aura été maj
        //SwfFSCommandVueFlash met pretPourScreenShot à true
     
        pretPourScreenShot := false;
        movieTime := GetTickCount ;
        Swf.Movie := monFlash;
        //La chaine de paramètres est complète. On peut la passer au flash
        flashVars := lesParametresDuFlash;
        Swf.flashVars := flashVars;
     
        // On attend de recevoir du Flash le message que l'affichage est maj
        finAttente := GetTickCount + (5 * 1000); // x secondes au max
        while (not pretPourScreenShot) and (GetTickCount < finAttente) do
          begin
           Application.ProcessMessages;
          end;
        if pretPourScreenShot then
          begin
           // Le flash est pret pour une capture d'écran
           bmpVue.Width := Swf.Width;
           bmpVue.Height := Swf.Height;
           Swf.PaintTo(bmpVue.Canvas, 0, 0);
           mlog.lines.Add('pretPourScreenShot recu');
          end
        else
          begin
           // Problème : le Flash ne s'est pas maj
           mlog.lines.Add('Pb pretPourScreenShot pas recu');
          end;
       finally
        formFlash.release;
       end;
    end;
    Si quelqu'un a le moindre idée...

    Merci d'avance
    Si vous avez votre réponse n'oubliez pas !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Il est possible de créer une DLL contenant une fenêtre !
    Tu pourrais l'afficher en position -1000, -1000, en dehors de l'écran !
    Les Contrôles Visuels ActiveX comme le TWebBrowser ont des comportements étranges tant qu'il n'ont pas été affiché une première fois !
    Je pense que TShockwaveFlash a le même défaut !
    Dans un projet que je maintiens, un ActiveX d'une Caméra IP a le même défaut !
    Surement lié à l'Handle Parent !

    Idem dans une DLL, mon prédécesseur a triché, il a affecté le Parent de la TForm contenant l'ActiveX, ce parent est un Panel de l'application appelante visible mais dont les dimensions sont 1x1, il passe inaperçu !

    As-tu essayé de créer le TShockwaveFlash avec un Parent non VCL, mais un control Windows créer par CreateWindow ?

    Tu pousses assez loin l'utilisation de Flash, tu t'en sers pour un générateur d'image sur un serveur, euh...
    Est-ce légal dans la clause d'utilisation de Flash ???
    Tu ne serais pas en train de faire ton propre Flash Media Server ?
    Adobe fournis des solutions, il serait interessant de voir si il existe des éléments servers étant capable de générer du Flash sous forme de Video (ou simple Image)

    Le Flash est-il obligatoire ? un TeeChart ne pourrait-il pas le remplacer ?
    Delphi est-il obligatoire ? une solution Web en PHP ou JS qui ont justement plein de librairie pour générer des images comme JpGraph ou EJSChart
    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 habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 200
    Points : 165
    Points
    165
    Par défaut
    Salut ShaiLeTroll et merci d'avoir répondu si vite.

    Pour répondre à tes questions pertinentes je vais expliquer un peu plus précisement mes projets :

    1 ) Via un logiciel en Delphi ( plusieurs centaines de milliers de lignes, donc on ne change pas ) l'utilisateur créé des pages de rapport sur lesquelles il place des textes et des graphiques. Un peu comme un document word.
    L'utilisateur peut imprimer ou exporter en PDF le rapport.

    2) L'utilisateur peut exporter ses rapports sur le web. Quand il le consulte, il peut sélectionner différents paramètres ( mois concerné, client concerné...). Le serveur génère des pages web pour afficher le rapport en prenant en compte ses paramètres.

    3 ) Il peut aussi demander au site WEB de générer un PDF de son rapport.

    La nouveauté est maintenant de permettre l'utilisation de graphiques fait en Flash/Flex: c'est joli, animé, personnalisable par les dévelloppeurs et interactif pour l'utilisateur.
    Cas 1 : l'ActiveX TShockwaveFlash est intégré sans problème à l'application. Pour l'impression pas de problème car rien n'empêche d'afficher le Flash.
    Cas 2: On a une page HTML avec un Flash. Classique et pas de problème
    Cas 3: L'image du Flash doit être générée sur le serveur pour être ensuite intégré dans le PDF. Et il faut bien sûr avoir le même rendu. Donc on ne peut utiliser un TeeChart ou tout autre composant.

    Il ne s'agit donc pas de faire un Flash Media Serveur ou autre mais juste d'obtenir une image du graphique Flash une fois qu'il est chargé.
    A ma connaissance rien n'empêche de créer une TForm dans une DLL. Mais on ne peut l'afficher car il on n'a pas de handle de fenêtre.
    Et comme je l'indique dans mon mail précédent : si on n'affiche pas la fenêtre on attend longtemps le message du Flash qui indique qu'il est terminé. Pour rappel ce délai n'existe que pour les applications Flex.

    Voila j'espère que j'ai mieux expliquer mon problème.

    Cordialement.
    Si vous avez votre réponse n'oubliez pas !

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Citation Envoyé par ViveLesQuads Voir le message
    A ma connaissance rien n'empêche de créer une TForm dans une DLL..
    Oui, c'est ce que je disais !

    Citation Envoyé par ViveLesQuads Voir le message
    Mais on ne peut l'afficher car il on n'a pas de handle de fenêtre.
    Ah bon ? Je le fais !

    Pour une fenêtre SDI, comme je n'avais jamais été confronté à ce besoin, par pure curiosité, je l'avais tenté et j'avais ouvert un sujet sur le partage mémoire EXE\DLL étant surpris que mes TForm de DLL fonctionnait sans ShareMem !

    Récemment, j'ai enfin eu le besoin d'avoir des Form dans des DLL, du coup mes expériences théoriques sont enfin de la pratique !
    Dans mon utilisation, je fais un conteneur dans l'EXE (un Panel ou ScrollBox) qui sera le Parent de la fenêtre créer par la DLL, la fenêtre sans bordure est ancrée comme si elle était partie intégrante de la fenêtre !
    J'ai même poussé le vice à avoir un conteneur qui ancre une fenêtre d'une 1ère DLL, cette dernière contenant elle-même un conteneur pour une autre fenêtre d'une 2nde DLL !

    Par contre, la Fenêtre de DLL doit être créer dans le thread principal de l'exe !
    Une fenêtre TForm créée dans un autre thread aura des soucis de Handle et de Canvas !
    Dans un thread secondaire, Il est possible de créer des fenêtres non VCL via les API, par exemple remplacer Dialogs.MessageDlg de la VCL par un Windows.MessageBox, pratique à réserver pour le débogage tout de même !
    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

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 200
    Points : 165
    Points
    165
    Par défaut
    Merci pour toutes informations. Il ne me reste plus qu'à les tester et les mettre en pratique.
    Si vous avez votre réponse n'oubliez pas !

Discussions similaires

  1. Communication entre Projet Flex et Delphi
    Par vedder dans le forum Flex
    Réponses: 0
    Dernier message: 30/01/2012, 18h26
  2. Réponses: 0
    Dernier message: 23/05/2008, 18h59
  3. Communication "Flash et Langage C"
    Par cgcgcgcgcg dans le forum Flash
    Réponses: 1
    Dernier message: 15/05/2006, 22h57
  4. [AS2] Tutoriel communication Flash / PHP ?
    Par zooffy dans le forum ActionScript 1 & ActionScript 2
    Réponses: 9
    Dernier message: 29/03/2006, 21h22
  5. communication flash javascript
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/12/2005, 18h01

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