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