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 :

Créer un fichier Res et utilisation pour une liste de photos D6 et Win11 64bits


Sujet :

Delphi

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 657
    Par défaut Créer un fichier Res et utilisation pour une liste de photos D6 et Win11 64bits
    Bonjour à toutes et à tous,

    Dans une ancienne application, je charge des photos dans un Timage depuis le même dossier de l'application.

    Ma question si on crée un fichier ressource, il faudra faire l'extraction 7 fois si il y a 7 photos ?

    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
     
    //Chargement :
     
    ImageFiles := TStringList.Create;
    ImageFiles.Add('Chat.jpg');
    ImageFiles.Add('Chat_1.jpg');
    ImageFiles.Add('Chat_2.jpg');
    ImageFiles.Add('Chat_3.jpg');
    ImageFiles.Add('Chat_4.jpg');
    ImageFiles.Add('Chat_5.jpg');
    ImageFiles.Add('Chat_6.jpg');
     
      ImageIndex := 0;
     
      image1.Picture.LoadFromfile(ImageFiles[ImageIndex]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Mon RC :
     
    Photo RCDATA "Chat.jpg"
    Photo1 RCDATA "Chat_1.jpg"
    Photo2 RCDATA "Chat_2.jpg"
    Photo3 RCDATA "Chat_3.jpg"
    Photo4 RCDATA "Chat_4.jpg"
    Photo5 RCDATA "Chat_5.jpg"
    Photo6 RCDATA "Chat_6.jpg"
    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
     
    //Lecture
     
    procedure TU_Form.BLectureClick(Sender: TObject);
    var
      RS: TResourceStream;
      JPGImage: TJPEGImage;
    begin
      JPGImage := TJPEGImage.Create;
      try
        RS := TResourceStream.Create(hInstance, 'Photo', RT_RCDATA);
        try
          JPGImage.LoadFromStream(RS);
          Image1.Picture.Graphic := JPGImage;
        finally
          RS.Free;
        end;
      finally
        JPGImage.Free;
      end;
    end;
    J'avais pensé a un fichier Zip en ressource puis l'extraire mais avec D6 je ne penses pas que c'est faisable.

    Si quelqu'un a une idée merci d'avance.

    @+,

    cincap

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 129
    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 129
    Par défaut
    Au final, il te faudra un stream séparé par Audio, extraire 7 ressources, c'est pas grand chose, les DFM sont des ressources, est-ce que tu te poses la question de combien de fenêtre tu stockes et extraits ?

    Pour le zip voir Abrevia mais faut trouver une version de l'époque

    Si tu utilises souvent les audio, tu peux les conserver en mémoire ou dans un dossier temporaire.
    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

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 657
    Par défaut
    @ ShaiLeTroll, merci pour ton message, avant tout, j'ai du modifier mon fichier RC :

    PHOTO JPG "Chat.jpg"
    PHOTO1 JPG "Chat_1.jpg"
    PHOTO2 JPG "Chat_2.jpg"
    PHOTO3 JPG "Chat_3.jpg"
    PHOTO4 JPG "Chat_4.jpg"
    PHOTO5 JPG "Chat_5.jpg"
    PHOTO6 JPG "Chat_6.jpg"
    et ensuite je sauve les photos dans le dossier de l'application afin de les utiliser avec mon TStringList et puis à la fermeture de l'application je les deletes.:

    OnCreate :

    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
     
     ResPhotos := TResourceStream.Create(Hinstance, 'PHOTO', 'JPG');
     try
     ResPhotos.SavetoFile(dirdir + 'Chat.jpg');
     finally
     ResPhotos.Free;
     
     end;
     
     ResPhotos1 := TResourceStream.Create(Hinstance, 'PHOTO1', 'JPG');
     try
     ResPhotos1.SavetoFile(dirdir + 'Chat_1.jpg');
     finally
     ResPhotos1.Free;
     
     end;
     
     ResPhotos2 := TResourceStream.Create(Hinstance, 'PHOTO2', 'JPG');
     try
     ResPhotos.SavetoFile(dirdir + 'Chat_2.jpg');
     finally
     ResPhotos2.Free;
     
     end;
    .....
    ......
     
     ResPhotos6 := TResourceStream.Create(Hinstance, 'PHOTO6', 'JPG');
     try
     ResPhotos.SavetoFile(dirdir + 'Chat_6.jpg');
     finally
     ResPhotos6.Free;
     
     end;
    Je pense qu'il y a moyen de le simplifier ?

    Je teste encore,

    @+,

    cincap

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 129
    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 129
    Par défaut
    un tableau et un for pour réduire le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array[0..6] of string = ('Chat.jpg', 'Chat_1.jpg', 'Chat_2.jpg', 'Chat_3.jpg', 'Chat_4.jpg', 'Chat_5.jpg', 'Chat_6.jpg');
    Et selon la fréquence d'utilisation, si c'est affiché souvent, autant mettre en cache, avoir un array[0..6] of TPicture / TObjectList (ce dernier plus facile à libérer)
    A voir le plus performant entre TJPEGImage, TPicture ou TBitmap


    Sinon pourquoi ne pas plutôt utilisé une TImageList ?
    Si toutes les images ont la même taille, tu peux mettre toutes les images d'un coup dans un TImageList, lui même sera une ressource au sein du DFM
    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 expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 604
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    IMG1 RCDATA "image1.jpg"
    IMG2 RCDATA "image2.jpg"
    IMG3 RCDATA "image3.jpg"
    IMG4 RCDATA "image4.jpg"
    IMG5 RCDATA "image5.jpg"
    IMG6 RCDATA "image6.jpg"
    IMG7 RCDATA "image7.jpg"
    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
    function LoadResourceToBitmap(const ResName: string; Bitmap: TBitmap): Boolean;
    var
      rs: TResourceStream;
      pic: TPicture;
    begin
      Result := False;
      if not Assigned(Bitmap) then Exit;
      if FindResource(HInstance, PChar(ResName), RT_RCDATA) = 0 then Exit;
     
      rs := nil;
      pic := TPicture.Create;
      try
        rs := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
        try
          rs.Position := 0;
          pic.LoadFromStream(rs); // JPEG : Vcl.Imaging.jpeg
          Bitmap.PixelFormat := pf24bit;
          Bitmap.SetSize(pic.Width, pic.Height);
          Bitmap.Canvas.Brush.Color := clWhite;
          Bitmap.Canvas.FillRect(Rect(0, 0, Bitmap.Width, Bitmap.Height));
          if Assigned(pic.Graphic) then
            Bitmap.Canvas.Draw(0, 0, pic.Graphic);
          Result := True;
        except
          Result := False;
        end;
      finally
        rs.Free;
        pic.Free;
      end;
    end;
    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
    procedure FillImageListFromResources(ImageList: TImageList; const BaseName: string; Count: Integer);
    var
      i: Integer;
      bmp, tmp: TBitmap;
      resName: string;
    begin
      if not Assigned(ImageList) then Exit;
      ImageList.Clear;
     
      for i := 1 to Count do
      begin
        resName := Format('%s%d', [BaseName, i]); // IMG1..IMG7
        bmp := TBitmap.Create;
        try
          if LoadResourceToBitmap(resName, bmp) then
          begin
            if (ImageList.Width = 0) or (ImageList.Height = 0) then
            begin
              ImageList.Width := bmp.Width;
              ImageList.Height := bmp.Height;
            end;
     
            if (bmp.Width <> ImageList.Width) or (bmp.Height <> ImageList.Height) then
            begin
              tmp := TBitmap.Create;
              try
                tmp.PixelFormat := pf24bit;
                tmp.SetSize(ImageList.Width, ImageList.Height);
                tmp.Canvas.Brush.Color := clWhite;
                tmp.Canvas.FillRect(Rect(0, 0, tmp.Width, tmp.Height));
                tmp.Canvas.StretchDraw(Rect(0, 0, tmp.Width, tmp.Height), bmp);
                ImageList.Add(tmp, nil);
              finally
                tmp.Free;
              end;
            end
            else
              ImageList.Add(bmp, nil);
          end
          else
          begin
            // ressource manquante : ignorer ou ajouter placeholder
          end;
        finally
          bmp.Free;
        end;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TFormMain.FormCreate(Sender: TObject);
    begin
      // Remplir l'ImageList avec IMG1..IMG7
      FillImageListFromResources(ImageList1, 'IMG', 7);
    end;
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 614
    Par défaut
    Hello,

    J'avais pensé a un fichier Zip en ressource puis l'extraire mais avec D6 je ne penses pas que c'est faisable.
    Pour quelle raison ? Ça serait triste que cela n'existe pas... Connaissez vous le projet Abbrevia ?
    Vous pourriez lire les images depuis cette archive entièrement en mémoire.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 657
    Par défaut
    Bonjour à toutes et à tous,

    Merci à tous,

    J'ai testé avec un TImageList mais je n'ai jamais réussi à afficher les photos correctement à leurs dimensions réelles donc j'avais abandonné.

    Pour le zip je testerai.

    J'ai modifié mon jeu en ajoutant 7 Timage et je me demandais quelle serait la différence en poids par rapport à un TListImage ?

    Merci aussi à XeGregory pour sa solution bien détaillée.

    En ce qui me concerne, je vais fermer ce topic comme le TImage est aussi un conteneur.

    @+,

    cincap

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

Discussions similaires

  1. Quels API's utiliser pour une application en rapport avec Autocad?
    Par Angelsoul dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 31/07/2008, 16h21
  2. [TSQL] variable à utiliser pour une liste de paramètre
    Par pemathez dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/03/2008, 10h34
  3. Réponses: 4
    Dernier message: 02/05/2006, 13h08
  4. Composants à utiliser pour une interface graphique Java
    Par nicolas.pied dans le forum Composants
    Réponses: 4
    Dernier message: 28/11/2005, 21h27
  5. Précicer un adaptateur reseau à utiliser pour une socket.
    Par farok dans le forum Développement
    Réponses: 1
    Dernier message: 03/11/2005, 12h04

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