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

 Delphi Discussion :

Insérer un fichier .Wav dans un .exe


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Par défaut Insérer un fichier .Wav dans un .exe
    Bonjour,

    excusez-moi de poser encore une question à laquelle la réponse va certainement être : "va voir dans la FAQ".
    J'y suis allé. J'ai vu pas mal de choses. J'ai aussi vu l'article d'Olivier Lance : comment insérer un fichier dans un executable. Ainsi que §.8 de DelphiCool.
    Cela me semble bien compliqué pour traiter si petit problème. N'y a-t-il pas plus simple dans ce cas :
    Le programme existant emmet un son bref à une certaine circonstance (mais pas le beep classique. C'est un son bien particulier). Pour cela il fait appel à un fichier .Wav.
    Lorsqu'on porte l'exécutable sur un autre PC dans lequel le fichier .Wav n'existe pas, il est bien évident que ca ne marche pas. Il faudrait donc que le contenu du .Wav (tout petit petit) soit inclus dans le programme .exe d'une façon ou d'une autre et puisse y être utilisé, sans que le .exe soit obligé de créer un fichier temporaire .Wav
    N'y a-t-il pas une solution qui ne soit pas le marteau pilon pour écraser une mouche ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Quelque chose comme ça:

    Un fichier de resource:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TonSon WAVE "tonson.wav"
    et 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
    uses mmsystem;
     
    procedure PlaySound(aSoundName :string);
    var
      hResInfo, hRes: THandle;
      Sound: PChar;
    begin
      hResInfo := FindResource(HInstance, PChar(aSoundName), 'WAVE');
     
      if hResInfo <> 0 then
      begin
        hRes := LoadResource(HInstance, hResInfo);
     
        if hRes <> 0 then
        begin
          Sound := LockResource(hRes);
     
          if Assigned(Sound) then
            SndPlaySound(Sound, snd_ASync or snd_Memory);
     
          UnlockResource(hRes);
        end;
     
        FreeResource(hResInfo);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      PlaySound('TonSon');
    end;

  3. #3
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 668
    Par défaut
    salut,
    Le problème n'est pas si difficile. Vous devriez inclure votre fichier ressources après "implementation" ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    {$R le NomDeFichierRessource.RES}
    dans la partie "uses" ajoute:"mmsystem".

    Et pour la lecture sonore, vous devez utiliser la procédure PlaySound:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     PlaySound('SOUND', 0, SND_RESOURCE);
    end;
    et c'est tout.
    A+

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    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 094
    Par défaut
    Vous oubliez de dire que le fichier RC doit être compilé pour former un fichier RES ... cela doit être dans le tuto "Comment insérer une ressource dans un exécutable ?"

    Et ce n'est pas "compliqué", c'est juste la seule méthode propre
    c'est vrai archaïque avec un fichier texte et de la ligne de commande, mais ça fait du bien, ...
    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 très actif
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Par défaut
    Merci pour votre patience et compréhension, mais avec moi, il en faudrait beaucoup plus...
    Et ce n'est pas "compliqué", c'est juste la seule méthode propre
    Très bien. mais j'ai posé ma question dans le forum "Débutant" parce que je n'ai pas trouvé le forum "Sous-débutant".
    Plaisanterie mise à part, ca ne marche toujours pas. Avec le code çi-dessous, la compilation passe bien, mais il ne se passe rien en cliquant sur le bouton, pas le moindre son.
    Pour le code, j'ai suivi ce qu'a écrit NABIL74 :

    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      MPlayer, StdCtrls,mmsystem;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
    {$R SOUND.RES}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         PlaySound('SOUND', 0, SND_RESOURCE);
    end;
     
    end.
    Pour créer la ressource, j'ai utilisé ResHack qui est très pratique. Voilà comment apparaît le contenu du fichier SOUND.RES, visualisé par ResHack :
    Un dossier WAV, contenant un dossier SOUND, dont le contenu est nommé "0". Lorsqu'on clique sur "0", ResHack fait apparaître un bouton nommé "Play MIDI". Lorsqu'on clique sur ce bouton, le son est bien produit.
    Par contre, lorsqu'on clique sur le bouton de l'exécutable, le son n'est pas produit.
    A part ce léger détail, tout va bien ! Pas de message d'erreur. C'est au moins une consolation pour un programme inutilisable.

  6. #6
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 668
    Par défaut
    salut JJJJJ,
    voilà,je te propose une autre solution:
    1-ajoute dans la partie "uses" :"mmsystem".
    2-dans la partie "implementation":ajoute le nom de ton fichier ressources et déclare le pointeur de ton son.ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      Form1: TForm1;
      SON1: pointer; //pointeur de chaque son.
     
    implementation
     
    {$R *.DFM}
    {$R NABIL.res}  // fichier contenant le fichier STAN.wav
    on va déclarer le nom de ton fichier
    dans l'évenement "On activate" de la form,ajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.FormActivate(Sender: TObject);
    begin
    SON1:=lockresource(loadresource(hinstance,findresource(hinstance,'STAN','SON')));
     //STAN:le nom du fichier wav.
     // SON:nom du répertoire(dans le fichier res)dans lequel se trouve le fichier STAN.wav
    end;
    et puis dans l'évenement de ton boutton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     PlaySound('SON', 0, SND_RESOURCE);
    ce code est testé
    @+
    NABIL

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Salut 5 J,

    Juste pour rire
    il y à 6 jours avant la création de ton topic regarde celui-ci

    http://www.developpez.net/forums/d71...e-patch-place/

    et lie le 5ème topic du 26/03/2009 à 10h43

    Bye...

  8. #8
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 668
    Par défaut Salut
    bonjour à tous,

    heureux que ton problème sur les *.res soit résolu!

    comme a dit Andnotor,tu avais vraiment 3 solutions à ton problème.

    je serai toujours ravi et avec joie de t'aider à nouveau(si je peux).

    bonne programmation.

  9. #9
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Par défaut
    Bonjour,

    Bon, juste pour rire et n'ayant pas peur du ridicule je vais poser encore une question.
    Cette fois-ci, par simple curiosité, puisque mon problème de wav est résolu.
    Et si on veut faire la même chose avec un .mid au lieu du .wav de départ ?
    Supposons que j'aie : SOUND.mid qui marche en l'appelant avec (entre autres) : mciSendString('play SOUND.mid', nil, 0, 0);
    Maintenant, je sais mettre SOUND en ressource (même sans utiliser ResHack !!! ). Mais comment faire pour que ce soit la ressource qui soit utilisée dans l'application et non pas un appel direct à SOUND.mid ?

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 614
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 614
    Par défaut Même chôse !
    @JJJJJ, voici un bout de code pour un fichier Mp3, comme pour un fichier Midi, il faut l'extraire de la ressource, le sauver dans le répertoire de l'application et puis le détruire en quittant l'application :

    Mp1 = TmediaPlayer
    Cb1 = TChekBox pour lire en boucle le fichier

    Ton fichier ressource (*.rc):

    Sons1 WAV "Data.wav"
    Sons2 RCDATA "bronze.mp3"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      Form1: TForm1;
      dirdir : string;
      marche : boolean; //ligne à ajouter
     implementation
    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
    61
    62
     
    procedure TForm1.bmp3Click(Sender: TObject);
    begin
    if marche then
                          begin
                          bmp3.Caption := 'Mp3';
                          mp1.Stop;
                          mp1.Rewind;
     
                          marche:=false end
                  else
                          begin
                           mp1.Open;
                          mp1.play ;
                          bmp3.Caption := 'Stop';
     
                          marche:=true ;
     
    end;
     
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Res: TResourceStream;
    begin
    try
        Res := TResourceStream.Create(Hinstance, 'Sons2', RT_RCDATA);
    ///enregistre la ressource dans un fichier
    Res.SavetoFile(dirdir + 'bronze.mp3');
      finally
        Res.Free;
      end;
     
      if fileexists('bronze.mp3') then
      begin
        mp1.filename := dirdir+ 'bronze.mp3';
      end;
     end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     //efface le fichier MP3
      if not deletefile(dirdir + 'bronze.mp3') then
        showmessage('Une erreur est survenue lors de la fermeture');
    end;
     
    procedure TForm1.mp1Notify(Sender: TObject);
    begin
     
    with MP1 do
       if NotifyValue = nvSuccessful then
       begin
     
       if cb1.Checked then begin
       Notify := True;
     
       mp1.play ;
     
       end;
     end;
    end;
    @+,

    Cincap

  11. #11
    Membre très actif
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Par défaut
    merci cincap,

    avec quelques remplacements aisés de .mp3 par .mid, ça marche très bien.
    Ensuite, pour voir, j'ai ajouté un rewind et play pour que la séquence de musique trourne en boucle ininterrompue. Ca marche aussi, mais avec ce fonctionnement permanent du mediaplayer, si on quitte l'application le fichier temporaire qui a été crée n'est pas détruit. Il y aurait certainement une petite mise au point qui éliminerais ce défaut.
    Mais peu importe, pour moi cette question concernant les .mid n'était qu'une curiosité en passant. Je m'arrète donc de regarder cette question.
    Merci encore pour les enseignements que j'ai receuillis à cette occasion.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 614
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 614
    Par défaut ?
    @ JJJJJ,

    Ensuite, pour voir, j'ai ajouté un rewind et play pour que la séquence de musique trourne en boucle ininterrompue. Ca marche aussi, mais avec ce fonctionnement permanent du mediaplayer, si on quitte l'application le fichier temporaire qui a été crée n'est pas détruit.
    Je ne voyais pas la raison d'ajouter un rewind et un play pour que cela tourne en boucle.

    Le code proposé permettait de le faire à condition de l'avoir recopié telquel avec la mise en place du TchekBox.

    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
     
    procedure TForm1.mp1Notify(Sender: TObject);
    begin
     
    with MP1 do
       if NotifyValue = nvSuccessful then
       begin
     
       if cb1.Checked then begin
       Notify := True;
     
       mp1.play ;
     
       end;
     end;
    end;
    Je l'ai testé et à chaque fois, le fichier temporaire est détruit.

    @+,

    Cincap

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

Discussions similaires

  1. insérer un fichier texte dans une bdd
    Par capucine1983 dans le forum JDBC
    Réponses: 14
    Dernier message: 22/07/2007, 02h31
  2. plusieurs fichiers CPP dans un exe ?
    Par papi2 dans le forum Dev-C++
    Réponses: 3
    Dernier message: 26/01/2007, 16h09
  3. Insérer un fichier C dans un projet Kdevelop C++ ?
    Par Novice10 dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 04/09/2006, 09h58
  4. Aide pour insérer un fichier flash dans un site web
    Par constitain dans le forum Flash
    Réponses: 2
    Dernier message: 26/07/2006, 22h59
  5. Copier un fichier inclut dans le ".exe"
    Par xavmax dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/08/2005, 15h12

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