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

C++Builder Discussion :

TBitmap et problèmes de pointeurs...


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut TBitmap et problèmes de pointeurs...
    Bonjour,

    Je souhaiterais créer une fonction qui modifie un TBitmap...

    Le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Graphics::TBitmap *test  = new Graphics::TBitmap();
    test->Width=10;
    test->Height=10;
    test->Canvas->Brush->Color=clBlack;
    test->Canvas->Rectangle(0,0,10,10);
     
    Form1->Image1->Picture->Bitmap = test;
     
    maFonction(test);
    Form1->Image2->Picture->Bitmap = test;
     
    delete test;

    La fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void maFonction(Graphics::TBitmap *img)
    {
    Graphics::TBitmap *temp  = new Graphics::TBitmap();
    temp->Width=img->Width+10;
    temp->Height=img->Height+10;
    temp->Canvas->Brush->Color=clGreen;
    temp->Canvas->Rectangle(0,0,img->Width+10,img->Height+10);
     
    img=temp;
    delete temp;
    }

    Malheureusement pour moi, Form1->Image1 et Form1->Image2 sont identiques, ma fonction n'a apportée aucune modification !!! (du moins les modifications n'ont pas été conservées)

    J'ai presque tout tenté, des passages par adresse, des void maFonction(Graphics::TBitmap **img) avec des (*img)->Width mais je ne suis pas parvenu à conserver mes modifications !

    Auriez-vous des solutions ? Merci beaucoup !!

  2. #2
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    un peu bizarre tout ca, ca m'étonne que tu n'aies pas eu de memory adress error

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    img = temp;
    delete temp;
    c'est comme si tu faisais "delete img", donc tu essayes de visualiser une image dont l'espace mémoire a été supprimé, puis ensuite tu refais un delete test qui est en fait img, donc tu fait 2 delete de suite sans faire un new...

    mon conseil, fait qqc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Graphics::TBitmap * test = new Graphics::TBitmap;
    maFonction(test, Form1->Image2->Picture->Bitmap);
    Form1->Image2->Picture->Bitmap->Assign(test);
    delete test;
    avec mafonction() ecrite de la facon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void maFonction(Graphics::TBitmap *img1, Graphics::TBitmap *img2)
    {
    img1->Width = img2->Width+10;
    img1->Height = img2->Height+10;
    img1->Canvas->Brush->Color=clGreen;
    img1->Canvas->Rectangle(0,0,img2->Width+10,img2->Height+10);
    }

  3. #3
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Merci, mais il n'y a pas moyen de passer un seul argument TBitmap pour qu'il soit modifié ? Un peu comme :

    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
     
    void main()
    {
    int *var= new int();
    *var=5;
    maFonction(var);
    //Ici var est égal à 50
    delete var;
    }
    // -------------------------------
     
    void essai(int *a)
    {
    *a=*a*10;
    }

  4. #4
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    si certainement, mais il faut faier attention à ne pas perdre la mémoire allouer auparavant, et désallouer le TImage->Picture->Bitmap avant de lui assigner une adresse d'un nouvel emplacement de TBitmap, je crois déja avoir essayer et ca me donnait plein d'erreur, donc j'ai utilisé la méthode Assign()

  5. #5
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Ok ! Merci pour tout, voici la solution finale :

    Le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Graphics::TBitmap *test  = new Graphics::TBitmap(); 
    test->Width=10; 
    test->Height=10; 
    test->Canvas->Brush->Color=clBlack; 
    test->Canvas->Rectangle(0,0,10,10); 
     
    Form1->Image1->Picture->Bitmap = test; 
     
    maFonction(test); 
    Form1->Image2->Picture->Bitmap = test; 
     
    delete test;

    La fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void maFonction(Graphics::TBitmap *img) 
    { 
    Graphics::TBitmap *temp  = new Graphics::TBitmap(); 
    temp->Width=img->Width+10; 
    temp->Height=img->Height+10; 
    temp->Canvas->Brush->Color=clGreen; 
    temp->Canvas->Rectangle(0,0,img->Width+10,img->Height+10); 
     
    img->Assign(temp); // Ne pas utiliser img=temp; !!!
    delete temp; 
    }

    Tout réside donc dans le img->Assign(temp); au lieu de img=temp !

  6. #6
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    Le problème c'est :

    que devient la zone mémoire préalablement allouée par le système pour Form1->Image1->Picture->Bitmap une fois que tu lui a assigné un autre pointeur ?

  7. #7
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Et si... au lieu de mettre :

    Form1->Image2->Picture->Bitmap = test;


    on mettait aussi :

    Form1->Image2->Picture->Bitmap->Assign(test);

  8. #8
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    Ca me parait plus sûr

  9. #9
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    OK ! Merci, je corrige ça...
    Voilà donc la solution finale :

    Le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Graphics::TBitmap *test  = new Graphics::TBitmap(); 
    test->Width=10; 
    test->Height=10; 
    test->Canvas->Brush->Color=clBlack; 
    test->Canvas->Rectangle(0,0,10,10); 
     
    Form1->Image1->Picture->Bitmap->Assign(test);
     
    maFonction(test); 
    Form1->Image2->Picture->Bitmap->Assign(test);
     
    delete test;

    La fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void maFonction(Graphics::TBitmap *img) 
    { 
    Graphics::TBitmap *temp  = new Graphics::TBitmap(); 
    temp->Width=img->Width+10; 
    temp->Height=img->Height+10; 
    temp->Canvas->Brush->Color=clGreen; 
    temp->Canvas->Rectangle(0,0,img->Width+10,img->Height+10); 
     
    img->Assign(temp); // Ne pas utiliser img=temp; !!!
    delete temp; 
    }

    Attention aux Assign !

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

Discussions similaires

  1. Problème de *pointeur sur des char
    Par Spartan03 dans le forum C++
    Réponses: 2
    Dernier message: 18/09/2005, 15h20
  2. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 17h33
  3. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 14h57
  4. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 22h26
  5. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 16h50

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