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 :

StringGrid et image


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut StringGrid et image
    Bonjour,

    J'ai un problème avec une TStringGrid. Je construit dynamiquement une image dans celle-ci. J'ai besoin de gérer le clic sur cette image pour la faire disparaitre.
    Plus concretement :
    Je crée mon image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TImage* CleBox=new TImage(StringGrid1);
    CleBox->Parent=StringGrid1;
    CleBox->Picture->LoadFromFile("images\\ok.bmp");
    StringGrid1->Objects[ACol][ARow]=CleBox;
    StringGrid1DrawCell(Sender, ACol,ARow, StringGrid1->CellRect(ACol,ARow),TGridDrawState());
          CleBox->OnClick = ImageOnClick;
    J'ai ma fonction du traitement du click
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TForm2::ImageOnClick(TObject *Sender)
    {
      int Col, Row;
      StringGrid1->MouseToCell(((TImage*)Sender)->Left, ((TImage*)Sender)->Top, Col, Row);
      StringGrid1SelectCell(Sender, Col, Row, true);
    }
    Puis dans StringGrid1SelectCell (donc je simule une selection de la case avec un click sur l'image)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     delete StringGrid1->Objects[ACol][ARow];
    StringGrid1->Objects[ACol][ARow]=NULL;
    Puis la je me retrouve avec une violation de mémoire ...

    Quelqu'un sait d'ou cela peut venir ?

    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    Bon ben tan pis ....

    le probleme vient de la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CleBox->OnClick = ImageOnClick;
    Le fait que j'associe cette image à une fonction puis que je détruise l'image provoque une erreur ...
    Je n'ai pas trouvé comment résoudre le problème, si quelqu'un a une idée ... je suis preneur !

    Merci d'avance !

  3. #3
    JEG
    JEG est déconnecté
    Membre chevronné
    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
    Par défaut
    je ne pense pas que ca soit ca.... mais du fait que tu détruit l'image.

    en effet à la création de ton TImage, tu spécifie que StringGrid1 est responsable de sa libération, (en le passant dasn le constructeur), donc quand tu fais un "delete CleBox", tu supprimes une première fois l'image ok, mais ensuite StringGrid supprimera lui aussi cleBox, et ca ca fait planter l'application

  4. #4
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    Oui, mais lorsque je vide entierement le StringGrid (bouton effacer de mon appli), je détruit toutes les images grace à un delete ... et la pas d'erreur ...
    Ou j'ai peu etre mal compris ce que tu voulais dire :

  5. #5
    JEG
    JEG est déconnecté
    Membre chevronné
    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
    Par défaut
    disons que ca peut tres bien marcher aujourd'hui et sur ta machine...
    les erreurs mémoires donnent souvent l'impression d'etre aléatoires, de marcher certaines fois et pas d'autres, et il y a tres souvent derrière un problèmes de double delete, de pointeur qui est passé à NULL, etc...

    dans ton cas, ton appli plantera à un moment ou à un autre à cause de cette erreur de double désallocation, et il t'indiquera l'erreur à un autre endroit

  6. #6
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    beh je croise les doigts alors ....
    je vais quand meme tester de faire un delete de la case de ma StringGrid aprés avoir fait un delete de mon objet image ....
    Je vous tiens au courant ...

  7. #7
    JEG
    JEG est déconnecté
    Membre chevronné
    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
    Par défaut
    Je vais t'écrire ce que je pense mieux marcher, (mais bon faudra tester)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TImage* CleBox=new TImage(NULL); 
    CleBox->Parent=StringGrid1; 
    CleBox->Picture->LoadFromFile("images\\ok.bmp"); 
    StringGrid1->Objects[ACol][ARow]=CleBox; 
    StringGrid1DrawCell(Sender, ACol,ARow, StringGrid1->CellRect(ACol,ARow),TGridDrawState()); 
    ((TImage *)(StringGrid1->Objects[ACol][ARow]))->OnClick = ImageOnClick;
    le reste ne change pas

  8. #8
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    YAHOOO .... merci beaucoup

    Ca marche nikel .... encore merci

  9. #9
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    J'ai parlé un peu vite .... lors du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete StringGrid1->Objects[ACol][ARow]; 
    StringGrid1->Objects[ACol][ARow]=NULL;
    Une "erreur abstraite est levée ....

    Une idée ?

  10. #10
    JEG
    JEG est déconnecté
    Membre chevronné
    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
    Par défaut
    erreur abstraite ???
    heu là je ne vois pas

    mais attention quand tu fais le delete, il faut etre sur que le stringrid n'est pas en train d'etre redessiné.

  11. #11
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    J'en sait rien pour tout dire .... je pense que non, il n'est pas en train d'etre redessiner ... mais je ne pourrais pas l'affirmer !
    L'erreur levée est aléatoire : "erreur abstraite" ou "violation accés" ...

    .... jvai devoir rester sur mon ancienne methode je croi ... clicker à coté de l'image .... tan pis !

    Merci beaucoup a toi JEG en tout cas !

  12. #12
    JEG
    JEG est déconnecté
    Membre chevronné
    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
    Par défaut
    essaye avec ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (StringGrid1->Objects[ACol][ARow])    delete StringGrid1->Objects[ACol][ARow];
    StringGrid1->Objects[ACol][ARow]=NULL;
    ca permet de ne pas supprimer l'image deux fois de suite

  13. #13
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    Beh la il ne fait meme plus le delete ..... la condition n'est pas verifiée :
    j'avais ca avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (StringGrid1->Objects[ACol][ARow] != NULL) {
    delete StringGrid1->Objects[ACol][ARow]; 
    StringGrid1->Objects[ACol][ARow]=NULL;
    }
    ... si j'utilise le debugger ... le delete est bien fait .... puis a un moment ... "erreur abstraite" .... je pige plus la ... enfin ... tan pis
    pourtant dans ma StringGrid(derniere case de la ligne) j'ai une image qui sert a effacer toutes les autres .... j'utilise le code que tu ma donné ... ca marche nikel ....

    Merci

  14. #14
    JEG
    JEG est déconnecté
    Membre chevronné
    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
    Par défaut
    Bon ben je n'ai plus d'idées, si ca marche et que ca te convient c'es tl princpal :)
    Bon courage pour la suite

  15. #15
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    En tout cas merci beaucoup pour ton aide !

    Si quelqu'un à une idée, je suis toujours preneur ...

    Merci JEG, bonne continuation

  16. #16
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    Je continu a chercher mais rien a faire .... une suggestion ?

    Merci

  17. #17
    Nouveau candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 2
    Par défaut
    Excuse moi d'avance, mais je ne suis pas en mesure de t'aider... comme le sujet m'intéresse, je me permets quand même de poser une question. J'ai utilisé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TImage* Image1=new TImage(StringGrid1); 
    Image1->Parent=StringGrid1; 
    Image1->Picture->LoadFromFile("images/rond.bmp");
    Image1->Transparent = true;
    StringGrid1->Objects[1][3]=Image1; 
    StringGrid1DrawCell(Sender, 1,3, StringGrid1->CellRect(1,3),TGridDrawState());
    Le but était d'afficher une image dans une cellule de ma grille, mais le résultat ne correspond pas vraiment... l'image est bien créée, mais elle est affichée en haut à gauche de la StringGrid.
    Est-ce qu'il est possible d'afficher une image dans une cellule de StringGrid?

    Merci d'avance

    Audrey

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 169
    Par défaut
    Bonjour,

    tu as mis koi dans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringGrid1DrawCell(Sender, 1,3, StringGrid1->CellRect(1,3),TGridDrawState());
    ????

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 169
    Par défaut
    Moi j'ai mis ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if(ARow>=1 && ACol==3)//Colonne Null
           {
               TImage *NullBox;
               NullBox=(TImage * ) strgCol->Objects[ACol][ARow];
               NullBox->Left=Rect.Left+20;
               NullBox->Top=Rect.Top+2;
               NullBox->Width=Rect.Width();
               NullBox->Height=Rect.Height();
               NullBox->Show();
           }

  20. #20
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 45
    Par défaut
    Et en essayant ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TImage* Image1=new TImage(NULL); 
    Image1->Parent=StringGrid1; 
    Image1->Picture->LoadFromFile("images/rond.bmp");
    Image1->Transparent = true;
    StringGrid1->Objects[1][3]=Image1; 
    StringGrid1DrawCell(Sender, 1,3, StringGrid1->CellRect(1,3),TGridDrawState());
    ??

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. insérer image dans une ou plusieurs cellules d'une stringgrid
    Par casse-tête dans le forum Composants VCL
    Réponses: 2
    Dernier message: 05/05/2014, 18h45
  2. Réponses: 8
    Dernier message: 14/04/2013, 10h43
  3. Réponses: 2
    Dernier message: 10/05/2012, 11h14
  4. Image de fond StringGrid
    Par Albat_r dans le forum C++Builder
    Réponses: 7
    Dernier message: 25/04/2006, 17h28
  5. Differentes images dans cellules d'une StringGrid
    Par gazier20 dans le forum Composants VCL
    Réponses: 8
    Dernier message: 23/01/2006, 23h10

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