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 :

delete row ds Stringgrid : fuite memoire !


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut delete row ds Stringgrid : fuite memoire !
    Bonjour

    Jusqu'à ce que je ne teste pas mes fuites memoires, je me contentais de cette procedure pour effacer une ligne dans une grille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm2.ReduitGRille(Idx: Integer);
    var
      I: Integer;
    begin
      for I := Idx to Grid1.rowcount - 2 do
        Grid1.Rows[I].Assign(Grid1.Rows[I + 1]);
      Grid1.rowcount := Grid1.rowcount - 1;
    end;
    mais cela provoque une fuite memoire!
    j'ai le message ..byte UnicodeString x110 & ...bytes TCellProperties x110)

    j'apelle ma procedure ainsi
    while I < Grid1.rowcount - 1 do
    begin
    inc(I);
    if cbx_sens_filtre.itemindex = 0 then
    if (strtofloat(Grid1.cells[cbx_filtre_1.itemindex + 1, I]) <
    strtofloat(ed_filtre_1.Text)) then
    begin
    ReduitGRille(I);
    I := 0;
    end;
    if cbx_sens_filtre.itemindex = 1 then
    if (strtofloat(Grid1.cells[cbx_filtre_1.itemindex + 1, I]) >
    strtofloat(ed_filtre_1.Text)) then
    begin
    ReduitGRille(I);
    I := 0;
    end;
    end;
    Donc ma question est toute bête, comment supprimer une ligne dans un TstringGrid sans fuite mémoire ?

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    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 124
    Par défaut
    J'ai aussi utilisé Assign dans un code de test

    je pense qu'il faudrait le refaire via un BeginUpdate for row for col ... Cells[] ... EndUpdate

    le Assign ne gère peut-être pas l'écrasement et ne libère pas les TCellProperties du receveur

    le EnsureColRows de la TStringGrid est assez tordu !
    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 éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut
    Je pense que tu veux dire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      J, I: Integer;
    begin
      for I := 0 to Grid1.rowcount - 1 do
        for J := 0 to Grid1.ColCount - 1 do
          Grid1.cells[J, I] := Grid1.cells[J, I + 1];
      Grid1.rowcount := Grid1.rowcount - 1;
    end;
    J ai la même fuite mémoire

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    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 124
    Par défaut
    A quel moment tu fais ce code ?
    Est-ce dans un evenement de la grille elle-même ?

    Avec les UnicodeString ou des Variants membre d'une Interface, si l'on les inspecte, le débogueur peut créer aussi des fuites mémoires

    Sur ton 2eme code, I + 1 dépasse RowCount !
    Veille au RowCount - 2 aussi dans cette variante !
    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 éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut
    Pour mon deuxieme code c est vrai, j ai fais ça à la va vite pour savoir si c etait ce dont tu parlais mais codé proprement il produit la même fuite mémoire.

    la procedure reduitgrille est appellé depuis un onclick sur un bouton non pas sur un evenement de la grille.

    Edit : Je precise que je n ai aucune fuite quand je ne declenche pas cette procedure.

Discussions similaires

  1. [2.0] Comment tracer les fuites mémoire ?
    Par StormimOn dans le forum C++/CLI
    Réponses: 9
    Dernier message: 02/11/2007, 08h22
  2. delete row de ma base
    Par anisj1m dans le forum JDBC
    Réponses: 7
    Dernier message: 20/03/2007, 16h00
  3. [java] fuite memoire quand 2 process!
    Par vince3320 dans le forum Langage
    Réponses: 6
    Dernier message: 01/03/2007, 17h50
  4. [C# 2.0] DataGridView add/delete row ?
    Par fix105 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 30/11/2006, 17h52
  5. [VC++6] probleme fuite memoire CLIST ?
    Par athilla dans le forum MFC
    Réponses: 16
    Dernier message: 22/11/2005, 17h01

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