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 :

Utilisation d'un TImageList


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut Utilisation d'un TImageList
    Salut

    Mon problème est le suivant:

    J'ai crée un type d'objet qui s'affiche à l'écran en utilisant des Bitmaps en fonction de l'état de l'objet. Mon programme comporte plusieurs objets de ce type qui utilisent les mêmes Bitmaps d'ou l'idée de créer une TImageList avec mes Bitmaps. Par contre j'ai un soucis par rapport à l'attribution des bitmaps à chaque objet:

    J'ai écrit le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    V1:=t_vaisseau.Create; //création de l'objet
     
     for i:=0 to 5 do
      begin
       Bmp:=TBitmap.Create;
       ImageList1.GetBitmap(i,Bmp);
       V1.SetBitmap(0,i,0,Bmp); //attribution du bitmap
      end;
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure T_vaisseau.SetBitmap(Z,D,ar:integer; Bmp:TBitmap);
    begin
     FigBmp[Z,D,ar]:=Bmp;
    end;
    Dans ce code je me demande si je ne vais pas avoir une consomation excecive de mémoire du fait qu'à chaque objet t_vaisseau que je créer j'attribue des Bitmaps qui sont copiées à partir de la TImageList.

    J'avais une solution similaire en CBuilder mais j'attribuais un pointeur sur les Bitmaps. Solution que je n'arrive pas bien à reconduire ici.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    Pourquoi ne pas stocker l'index de l'image dans la liste ?
    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 émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    Effectivement c'est une idée mais je prefererais avoir un accès direct à la bitmap pour des questions de rapidité d'affichage

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    Citation Envoyé par Gouyon
    Effectivement c'est une idée mais je prefererais avoir un accès direct à la bitmap pour des questions de rapidité d'affichage
    sinon, il suffit d'étudier le code de la TImageList, et l'on constate que c'est une copie ... ensuite, en fait ton Image List ne te sert donc à rien ... autant mettre les Images dans des Fichiers, qui seront chargés au démarrage du jeu, et avec une TObjectList tu manipule directement les TBitMap, ensuite stocker l'index ou une référence sur l'objet cela ne changera pas grand chose ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function TCustomImageList.GetBitmap(Index: Integer; Image: TBitmap): Boolean;
    begin
      Result := (Image <> nil) and HandleAllocated and (Index > -1) and (Index < Count);
      if Result then
        with Image do
        begin
          Height := FHeight;
          Width := FWidth;
          Draw(Canvas, 0, 0, Index);
        end;
    end;
    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 émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par ShaiLeTroll
    sinon, il suffit d'étudier le code de la TImageList, et l'on constate que c'est une copie ... ensuite, en fait ton Image List ne te sert donc à rien ... autant mettre les Images dans des Fichiers, qui seront chargés au démarrage du jeu, et avec une TObjectList tu manipule directement les TBitMap, ensuite stocker l'index ou une référence sur l'objet cela ne changera pas grand chose ...
    Effectivement j'étais arrivé à une conclusion identique mais je voulais en être bien sur. Je pense que je vais suivre ta suggestion et utiliser un TObjectList.

  6. #6
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Avec une TImageList, il faut que toutes les images aient les mêmes dimensions. Il vaut mieux utiliser un tableau dynamique :
    http://pascal.developpez.com/cours/artdynarr/

    [EDIT] Ce sujet pourrait peut-être te servir ...
    http://www.developpez.net/forums/showthread.php?t=52438
    Pour les jeux, je conseille DelphiX car bien plus rapide.

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par Gouyon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure T_vaisseau.SetBitmap(Z,D,ar:integer; Bmp:TBitmap);
    begin
     FigBmp[Z,D,ar]:=Bmp;
    end;
    les Bitmaps de FigBmp sont-ils créés? Si non laisse tel quel si oui, utilise Assign:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FigBmp{Z, D, ar].Assign(Bmp);
    Sinon as-tu essayé de faire directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ImageList1.GetBitmap(i, FigBmp{Z, D, ar]);
    Ca donne quoi?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  8. #8
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Pedro
    les Bitmaps de FigBmp sont-ils créés? Si non laisse tel quel si oui, utilise Assign:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FigBmp[Z, D, ar].Assign(Bmp);
    Non les FigBmp ne sont pas crées donc je laisse tel quel.
    Est ce que ça veut dire que mes variables FigBmp vont pointer sur le TBitmap Bmp ou bien que Bmp est copié dans FigBmp ?

    Citation Envoyé par Pedro
    Sinon as-tu essayé de faire directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ImageList1.GetBitmap(i, FigBmp[Z, D, ar]);
    C'est ca que j'avais fait dans un premeir temps mais ça m'obliger à créer un FigBmp pour chaque objet ce que je veux éviter.

  9. #9
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 137
    Billets dans le blog
    5
    Par défaut
    J'ai adopté la solution suivante:

    Dans la méthode Create de ma Form

    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
     
     
        ListeFigurines := TList.Create;
        BmpProv := TBitmap.Create;
        BmpProv.LoadFromFile(NomFichier);
        Ro.Left := 0;
        Ro.Top := 0;
        Ro.Right := HexW[z];
        Ro.Bottom := HexH[z];
        for dir := 0 to 5 do
          begin
            Bmp := TBitmap.Create;
            Bmp.Transparent := true;
            Bmp.TransparentColor := RGB(255, 0, 255);
            Bmp.TransparentMode := tmFixed;
            Bmp.Width := HexW[z];
            Bmp.Height := HexH[z];
            Bmp.Canvas.CopyRect(Bmp.Canvas.ClipRect, BmpProv.Canvas, Ro);
            Ro.Left := Ro.Left + HexW[z];
            Ro.Right := Ro.Right + HexW[z];
            ListeFigurines.Add(Bmp);
          end;
        BmpProv.Free;
    Dans mon objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //dans la déclaration de l'objet 
    FigBmp: array[ 0..5] of TBitmap;
     
    //attributions des bitmaps
    procedure T_vaisseau.SetBitmap( Liste: TList);
    var
      i: integer;
    begin
        for i := 0 to 5 do
        begin
          FigBmp[ i] := Liste.Items[i];    
        end;
    end;
    Ca marche bien.

    A propos je pense que ça serait bien que ce genre de solution figure dans la FAQ

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

Discussions similaires

  1. Utilisation de TImageList
    Par Pierre GIRARD dans le forum Débuter
    Réponses: 18
    Dernier message: 21/06/2014, 21h05
  2. [Lazarus] Utilisation du composant TImageList
    Par ChPr dans le forum Lazarus
    Réponses: 3
    Dernier message: 27/11/2009, 12h33
  3. [TImageList] Comment utiliser le format GIF ?
    Par Pedro dans le forum Composants VCL
    Réponses: 17
    Dernier message: 23/10/2005, 23h08
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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