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

Langage Delphi Discussion :

Comment concaténer plusieurs fichiers en un ?


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut Comment concaténer plusieurs fichiers en un ?
    Salut, je cherche à concaténer plusieurs image et des strings dans un fichiers, afin de l'utiliser dans un projet delphi.

    Mon but : pouvoir appeler, dans delphi une ressource contenant 1 image et 1 texte (pour chaque entrée).
    Et que ce ne soit pas inclu dans l'exe, afin de pouvoir faire des updates simplement en remplacant 1 fichier.

    Une Dll peut être ?
    D7/2007 - Asphyre 4.1

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    ET tu tu regardais du cote des Fichiers de ressources "RC" et "RES" (pour les images surtout)

    LA directive {$R} t'aidera a les inclure dans une Dll.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    Ok, je vais chercher par la ... par contre il est possible d'ajouter un String dans un fichier de ressources ?

    Merci !
    D7/2007 - Asphyre 4.1

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    En faisant une ressource non typée qui stocke les chaînes comme dans un flux.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    Ok ok ...

    alors, jai presque réussi, mais l'appli plante sans que je n'ai pour le moment trouvé pourquoi...

    voici mon code coté projet :

    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
     
      function GetNbRes:Integer; external 'TipsRes.dll';
      function GetImg(Num:Integer):TBitmap; external 'TipsRes.dll';
      function GetTxt(Num:Integer):PChar; external 'TipsRes.dll';
     
    implementation
     
    {$R *.dfm}
     
    procedure TTips.suiButton2Click(Sender: TObject);
    var i:integer;
    begin
      for i:=1 to GetNbRes do begin
        Tips.IMG1.Picture.Bitmap:=GetImg(i);
        Tips.Label1.Caption:=GetTxt(i);
      end;
    End;
    et ma Dll ... (simplifié pour les tests)

    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
     
    library TipsRes;
     
    uses
      ShareMem,SysUtils,
      Classes,Jpeg,Graphics;
     
    {$R *.res}
     
    function GetNbRes:Integer;
    begin
      Result:=1;
    End;
     
    function GetImg(Num:Integer):TJPEGImage;
    var Bmp: TBitmap; Jpg: TJPEGImage; ResStream:TResourceStream;
    Begin
      Jpg:=TJPEGImage.Create;
      Bmp:=TBitmap.Create;
      try
        ResStream:=TResourceStream.Create(hinstance, 'Image1', 'RT_RCDATA');
        Jpg.LoadFromStream(resstream);
        Bmp.Assign(Jpg);
        Result:=Jpg;
      finally
        Jpg.Free;
        Bmp.Free;
      end;
    End;
     
    function GetTxt(Num:Integer):PChar;
    begin
      Result:='Test 12345678910 !';
    End;
     
    begin
    end.
    le plantage (l'application n'a pas réussi a s'initialiser correctement...) survient lors de la création de ma form.

    Une idée sur l'erreur que j'ai fait ?

    Merci
    D7/2007 - Asphyre 4.1

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par souch
    Une idée sur l'erreur que j'ai fait ?
    T'aurais pas oublier d'exporter les fonctions de ta DLL ? C'est une question très bête, mais une erreur juste à l'initialisation de l'appli, sans que tu n'ai (apparament) d'évènement OnCreate... Si l'erreur ressemble a un truc comme "Cannot find DLL entry point xxx", c'est ca...

  7. #7
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    heu ... peut être, vu que c'est ma 1er DLL ...
    comment je fais pour exporter les fonctions ?

    ce n'est pas ca ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      function GetNbRes:Integer; external 'TipsRes.dll'; 
      function GetImg(Num:Integer):TBitmap; external 'TipsRes.dll'; 
      function GetTxt(Num:Integer):PChar; external 'TipsRes.dll';
    ?
    D7/2007 - Asphyre 4.1

  8. #8
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    ha, en effet, jai ajouté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exports GetImg,GetNbRes,GetTxt;
    a la fin de ma dll, et ca ne plante plus a la création
    (Bon, ca plante a l'utilisation des fonction, mais je nai pas encore cherché pkoi)

    Merci pour cette bonne piste
    D7/2007 - Asphyre 4.1

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par souch
    ce n'est pas ca
    Non, ca je dirai plutot que c'est l'import...

    L'export de fonction permet de déclarer quelles sont les fonctions accessibles depuis l'extérieur de la DLL. Toutes fonctions que tu déclare comme 'external' dans ton programme principal doivent avoir été exportés dans la DLL.

    Dans ton cas, cela donnerai ca :


    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
    library TipsRes;
     
    uses
      ShareMem,SysUtils,
      Classes,Jpeg,Graphics;
     
    {$R *.res}
     
    function GetNbRes:Integer;
    begin
      [...]
    End;
     
    function GetImg(Num:Integer):TJPEGImage;
      [...]
    End;
     
    function GetTxt(Num:Integer):PChar;
    begin
      [...]
    End;
     
    exports
      GetNbRes,
      GetImg,
      GetTxt;
     
    begin
    end.
    Pour plus d'info, regard l'aide avec sur "exports (reserved word)"

    Bonne chance pour la suite de ton projet...

  10. #10
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    + rapide
    D7/2007 - Asphyre 4.1

  11. #11
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    Heu.. jai un doute sur mon code ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResStream:=TResourceStream.Create(hinstance, 'Image1', 'RT_RCDATA');
    d'apres ce que je voi dans l'aide ou sur le net, RT_RCDATA n'est pas encadré de guillement simple, mais si je ne le fait pas, le deboggeur m'annonce que c'est un identificateur non déclaré ...
    je ne vois pas quel librairie serait nécéssaire dans les USES ...

    ?
    D7/2007 - Asphyre 4.1

  12. #12
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par souch
    + rapide
    Yes, bravo à toi

    Sinon, pour ton problème d'execution, j'ai pas regardé en détail, mais dans ta fonction GetImg, déjà tu utilise un TBitmap, je vois pas trop pourquoi, mais de plus tu utilise un TJPEGImage pour charge ton jpeg de ta ressource, mais tu le détruuit à la fin (Jpg.Free). Ne pas oublier que les objets sont des pointeurs. Autrement dit dans ton programme quand tu appelle cette fonction, tu recoit un pointeur sur un objet qui a été détruit.

    En gros, tu as deux solutions :
    - soit tu ne détruit pas ton TJPEGImage à la fin de ta fonction (mais c'est pas très propre)
    - soit tu modifie ta fontion pour qu'elle prenne un paramètre supplémentaire (un TJPEGImage). De cette façon, tu créé le TJpegImage dans ton prog principal, tu le donne à ta fonction pour qu'elle le "remplisse", et tu peut l'utiliser après.

  13. #13
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par souch
    je ne vois pas quel librairie serait nécéssaire dans les USES ...
    Essaye Windows (pas essayé )

    Sinon dans mon message précédent, je répondais à ton message précédent, d'ou la réponse à côté de la plaque.. Enfin bon...

  14. #14
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    Merci,

    mon but est de charger une image (jpeg) contenu dans ma dll (via un .rc converti .res) dans mon appli, + présisémentd dans un timage (voila pkoi je la passe en Bitmap.

    voici le dernier code, je pense que mon erreur vien de mon ResourceStream.Create ....

    DLL ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function GetImg(Num:Integer):TJPEGImage;
    var
    Jpg: TJPEGImage; ResStream:TResourceStream;
    Begin
      Jpg:=TJPEGImage.Create;
      ResStream:=TResourceStream.Create(hinstance, 'Image1', 'RT_RCDATA');
      Jpg.LoadFromStream(resstream);
      Result:=Jpg;
    End;
    APPLI->
    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
     
    procedure TTips.suiButton2Click(Sender: TObject);
    var i:integer;
      Bmp: TBitmap;
      Jpg: TJPEGImage;
    begin
      for i:=1 to GetNbRes do begin
        try
          Jpg := TJPEGImage.Create;
          Jpg:=GetImg(i);
          Bmp := TBitmap.Create;
          Bmp.Assign(Jpg);
          Tips.IMG1.Picture.Bitmap:=Bmp;
        finally
          Jpg.Free;
          Bmp.Free;
        end;
      end;
    End;
    ne pas faire attention aux integers, c pour + tard...

    plantage : Ressource non trouvée...
    D7/2007 - Asphyre 4.1

  15. #15
    Membre régulier Avatar de souch
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2003
    Messages : 145
    Points : 124
    Points
    124
    Par défaut
    Haaaaaaa
    Merci a toi !!! c'etait bien Windows qui me manquait ....
    et voila ,ca marche (jvais pouvoir dormir lol)

    Merci bcp pour toute cette aide et bonne soirée !
    D7/2007 - Asphyre 4.1

  16. #16
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Déjà à mon avis il faut enlever les ' autour de RT_RCDATA, comme tu l'avais vu ( et ajouter Windows dans les uses). Sinon j'ai du mal m'exprimer précédemment... Voici ce que je ferai :

    DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure GetImg(Num:Integer;var Jpg : TJPEGImage);
    var
    ResStream:TResourceStream;
    Begin
      ResStream:=TResourceStream.Create(hinstance, 'Image1', RT_RCDATA);
      Jpg.LoadFromStream(resstream);
    End;
    Appli :
    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
    procedure TTips.suiButton2Click(Sender: TObject);
    var i:integer;
      Bmp: TBitmap;
      Jpg: TJPEGImage;
    begin
      for i:=1 to GetNbRes do begin
        try
          Jpg := TJPEGImage.Create;
          GetImg(i, Jpg);
          Bmp := TBitmap.Create;
          Bmp.Assign(Jpg);
          Tips.IMG1.Picture.Bitmap:=Bmp;
        finally
          Jpg.Free;
          //Bmp.Free; il ne faut pas détruire Bmp puisque IMG1.Picture.Bitmap pointe dessus.
        end;
      end;
    End;
    Cependant, si tu as l'erreur ressource non trouvé, c'est peut être que ton fichier ressource n'est pas correct, ou qu'il n'est pas correctement inclus dans la DLL. Tu peut le vérifier avec un utilitaire comme ResHacker.

    A+ (demain )

  17. #17
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par souch
    Haaaaaaa
    Merci a toi !!! c'etait bien Windows qui me manquait ....
    et voila ,ca marche (jvais pouvoir dormir lol)

    Merci bcp pour toute cette aide et bonne soirée !
    Pfff, encore trop tard... Suis vraiment trop lent moi...

    Cool pour toi , A+

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/05/2006, 09h29
  2. Réponses: 13
    Dernier message: 21/12/2005, 12h04
  3. Réponses: 1
    Dernier message: 29/11/2005, 10h15

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