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:
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