Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Débutant
Débutant Pour bien débuter avec Delphi
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/12/2012, 12h27   #1
Archimède
Membre émérite
 
Avatar de Archimède
 
Homme anthony
Enseignant
Inscription : avril 2005
Messages : 1 028
Détails du profil
Informations personnelles :
Nom : Homme anthony
Localisation : France, Charente Maritime (Poitou Charente)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 1 028
Points : 979
Points : 979
Par défaut delphi et fichier flash swf

Bonjour, j'ai tenté d'intégrer une application flash dans delphi à partir de :
ShockwaveFlashObjects_TLB.

ma question n'est qu'une simple histoire de chemin :
Code :
1
2
3
4
5
6
7
8
9
10
 
 procedure TForm1.FormCreate(Sender: TObject);
begin
 Position:=poscreencenter;
 formstyle:=fsstayontop;
 width:=screen.Width;
 height:=screen.Height;
 ShockwaveFlash1.align:=alclient;
 ShockwaveFlash1.Movie:='../flash/delphi/horloge.swf';
end;
Si je donne le chemin complet, pas de soucis, ça marche... En revanche, si mon fichier flash se trouve dans le sous répertoire delphi et que je définisse le chemin en relatif comme montré dans le code, ça ne fonctionne pas...
Comment déclarer le chemin d'un fichier se trouvant dans le même répertoire que l'exe delphi qui le gère.

Le but étant de rendre portable le répertoire qui contient l'exe et le fichier flash...

Merci (question toute bête mais qui m'empoisonne la vie.)
__________________
Citation:
tout développeur plongé dans son code subit une poussée d'urticaire de bas en haut égale au poids du volume d'unités qu'il ajoute.
Archimède est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 12h55   #2
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 423
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

Informations professionnelles :
Activité : Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2002
Messages : 4 423
Points : 10 815
Points : 10 815
le plus mieux c'est de ne pas passer par un fichier non ?

l'activeX supporte la lecture depuis un flux, je n'ai plus le détail en mémoire mais ça tourne autour de IStream si mon souvenir est bon.

Google: Delphi SWF IStream
http://www.delphiflash.com/how-to-open-swf-from-memory
__________________
Developpez.com: Mes articles, forum FlashPascal
Entreprise: Execute SARL
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 12h57   #3
tenpigs
Membre habitué
 
Inscription : juillet 2007
Messages : 93
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : juillet 2007
Messages : 93
Points : 122
Points : 122
Je te propose de passer par ExtractFilePath(Application.ExeName) pour récupérer le dossier d'installation de ton exe.
Il me semble que les chemins relatif sont impactés lorsque tu utilises des OpenDialog/SaveDialog par exemple...
tenpigs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 14h40   #4
Archimède
Membre émérite
 
Avatar de Archimède
 
Homme anthony
Enseignant
Inscription : avril 2005
Messages : 1 028
Détails du profil
Informations personnelles :
Nom : Homme anthony
Localisation : France, Charente Maritime (Poitou Charente)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 1 028
Points : 979
Points : 979
Merci Paul, si l'activeX permet le passage par un flux... que demande le peuple
Je vais évidemment ne pas passer par le fichier...

merci pour ta réflexion toujours très pertinente.
Je regarde ça.
__________________
Citation:
tout développeur plongé dans son code subit une poussée d'urticaire de bas en haut égale au poids du volume d'unités qu'il ajoute.
Archimède est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 14h45   #5
Archimède
Membre émérite
 
Avatar de Archimède
 
Homme anthony
Enseignant
Inscription : avril 2005
Messages : 1 028
Détails du profil
Informations personnelles :
Nom : Homme anthony
Localisation : France, Charente Maritime (Poitou Charente)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 1 028
Points : 979
Points : 979
Merci tempiqs pour ta réponse mais je n'avais pas vu toutes les possibilités que pouvait m'offrir l'activeX...cf post réponse à Paul Toth.
__________________
Citation:
tout développeur plongé dans son code subit une poussée d'urticaire de bas en haut égale au poids du volume d'unités qu'il ajoute.
Archimède est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 18h15   #6
cincap
Membre émérite
 
Inscription : janvier 2006
Messages : 1 396
Détails du profil
Informations personnelles :
Âge : 60

Informations forums :
Inscription : janvier 2006
Messages : 1 396
Points : 891
Points : 891
Bonsoir à toutes et à tous,

@ Archimède, voici le code que j'utilise à l'occasion :

Depuis le dossier de l'application :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
var Chemin:string;
  begin
   Chemin := ExtraCtFilePatH(Application.ExeName);
   Chemin[2] := '|';
   Chemin := 'file:///'+ Chemin;
   if op1.Execute then begin
 
   Player.Movie :=  op1.filename;
   Player.Play;
  end;
Depuis une ressource :
Fichier RC = ANIM2 FLASH "ANIM2.swf"

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
var 
 
    Chemin:string;
    temp :array[0..255]of char;
    res :TresourceStream;
  begin
   gettemppath(255, temp);
   Chemin := temp;
 
 
   res := TresourceStream.Create(hinstance, 'ANIM2', 'FLASH');
    res.SaveToFile(Chemin + 'ANIM2.swf');
   res.Free;
 
   Chemin[2] := '|';
   Chemin := 'file:///'+ Chemin;
 
    Player.Movie := Chemin + 'ANIM2.swf';
    Player.Play;
  end;
Car, avec le "LoadMovieFromStream();" j'avais une erreur sous D6 et "ShockwaveFlashObjects_TLB".

@+,

Cincap
cincap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 18h42   #7
Archimède
Membre émérite
 
Avatar de Archimède
 
Homme anthony
Enseignant
Inscription : avril 2005
Messages : 1 028
Détails du profil
Informations personnelles :
Nom : Homme anthony
Localisation : France, Charente Maritime (Poitou Charente)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 1 028
Points : 979
Points : 979
Merci Cincap, je teste tout ça...

@+
__________________
Citation:
tout développeur plongé dans son code subit une poussée d'urticaire de bas en haut égale au poids du volume d'unités qu'il ajoute.
Archimède est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 12h46   #8
cincap
Membre émérite
 
Inscription : janvier 2006
Messages : 1 396
Détails du profil
Informations personnelles :
Âge : 60

Informations forums :
Inscription : janvier 2006
Messages : 1 396
Points : 891
Points : 891
Bonjour à toutes et à tous,

@ Paul TOTH, cela m'intéresserait de savoir pourquoi ce code ne fonctionne pas avec D6 et "ShockwaveFlashObjects_TLB":

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  mem: TMemoryStream;
begin
 with TOpenDialog.Create(self) do
  begin
    Filter := 'SWF|*.swf';
    if Execute then
    begin
      mem := TMemoryStream.Create;
      mem.LoadFromFile(FileName);
      mem.Position := 0;
      Player.LoadMovieFromStream(mem); //Erreur ici "Identificateur non déclaré"
      //Player.PutMovieFromStream(mem);

    end;
    Free;
  end;
@+,

Cincap
cincap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 18h33   #9
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 423
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

Informations professionnelles :
Activité : Freelance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2002
Messages : 4 423
Points : 10 815
Points : 10 815
Probablement car cette méthode n'existe pas et que l'ActiveX Adobe ne connait rien au Stream Delphi

Voici un code qui fonctionne
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
unit Main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
    procedure LoadSWF(const AFileName: string);
  public
    { Déclarations publiques }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  ShockwaveFlashObjects_TLB, ActiveX;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  if OpenDialog1.Execute then
    LoadSWF(OpenDialog1.FileName);
end;
 
procedure TForm1.LoadSWF(const AFileName: string);
var
  SWF       : TShockWaveFlash;
  FileStream: TFileStream;
  MemStream : TMemoryStream;
  Len       : Integer;
  Ptr       : ^Integer;
  PStream   : IPersistStreamInit;
  AStream   : IStream;
begin
// Creation de l'ActiveX
  SWF := TShockWaveFlash.Create(Self);
  SWF.Parent := Self;
  SWF.SetBounds(0, 0, ClientWidth, ClientHeight);
 
// Ouverture du fichier, mais ça pourrait être une ressource
  FileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
  try
  // on va le copier en mémoire
    MemStream := TMemoryStream.Create;
    try
      Len := FileStream.Size;
    // il nous faut 8 octets de plus...
      MemStream.SetSize(Len + 8);
      Ptr := MemStream.Memory;
   // 4 pour stocker la valeur "magique"
      Ptr^ := $55665566; // Magic tag !
      Inc(Ptr);
   // 4 pour stocker la taille du fichier
      Ptr^ := Len;
      Inc(Ptr);
   // et on place le fichier à la suite
      FileStream.ReadBuffer(Ptr^, Len);
 
    // maintenant on demande un PersistStream à l'ActiveX
      IUnknown(SWF.OleObject).QueryInterface(IPersistStreamInit, PStream);
    // on créer un wrapper pour notre stream (pas la peine de le libérer c'est un TInterfacedObject)
      AStream := TStreamAdapter.Create(MemStream);
    // et on le charge, c'est tout !
      PStream.Load(AStream);
 
    finally
      MemStream.Free;
    end;
  finally
    FileStream.Free;
  end;
end;
 
end.
__________________
Developpez.com: Mes articles, forum FlashPascal
Entreprise: Execute SARL
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 23h35   #10
cincap
Membre émérite
 
Inscription : janvier 2006
Messages : 1 396
Détails du profil
Informations personnelles :
Âge : 60

Informations forums :
Inscription : janvier 2006
Messages : 1 396
Points : 891
Points : 891
@ Paul TOTH, merci pour l'info et encore merci pour le code qui fonctionne sous D6 et Seven 64 bits.

Cela complétera la façon de lire un fichier Flash avec Delphi.

@+,

Cincap
cincap est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h57.


 
 
 
 
Partenaires

Hébergement Web