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

Langage Delphi Discussion :

Opération de pointeur incorrect


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Opération de pointeur incorrect
    Bonjour à toutes et à tous,

    J'ai cette erreur sur ce traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TFPreferences.TreeView1Click(Sender: TObject);
    begin
      With StringGridPreferences do
        for i := ComponentCount-1 downto 0 do
          if (Components[i] is TShape) then
            if Components[i] <> nil then Components[i].Free;
     
    // ...
    Si je ne fas pas ce traiement cela fonctionne...enfin pas de message d'erreur

    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      With StringGridPreferences do
        for i := ComponentCount-1 downto 0 do
          if (Components[i] is TShape) then Components[i].Free;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      With StringGridPreferences do
        for i := ComponentCount-1 downto 0 do
          if (Components[i] is TShape) then Components[i].Destroy;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      With StringGridPreferences do
        for i := ComponentCount-1 downto 0 do
          if (Components[i] is TShape) then
            if Assigned(Components[i]) then Components[i].Free;
    Sans succès.

    Merci pour vos lumières

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Je suppose que tu as créé les TShape toi-même. Est-ce que tu ne fais pas appel à un TShape dans une procedure de dessin?

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Je suppose que tu as créé les TShape toi-même. Est-ce que tu ne fais pas appel à un TShape dans une procedure de dessin?
    Salut,

    Alors enfait, lorsque je clique la première fois les shapes n'existe pas, donc je passe cette procédure mais normalement il ne free rien, pusiqu'il n'y a pas de shape créer ensuite, plus bas je vais cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
          Shape := TShapeRu.Create(StringGridPreferences);
          With Shape do
          begin
            Parent    := StringGridPreferences;
            StartColor:= xStartColor;
            EndColor  := xEndColor;
            Tag       := NumLigne;
            Left      := StringGridPreferences.ColWidths[0];
            Width     := StringGridPreferences.ColWidths[1] - 3;
            OnMouseDown := Self.ShapeMouseDown;
            Visible   := True;
            FlashEnabled:= False;
            CodeSalarie := NumLigne;
          end;
    Donc oui, le shape comporte un dégardé maison

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Essai pour voir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     With StringGridPreferences do
        for i := ComponentCount-1 downto 0 do
          if (Components[i] is TShape) then FreeAndNil(Components[i]);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     With StringGridPreferences do
        for i := ComponentCount-1 downto 0 do
          if (Components[i] is TShape) then Components[i] := nil;

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    Le FreeandNil je l'avais déjà essayé mais le compilateur refuse :
    "un Objet constant ne peut être passé en paramètre Var"

    Pour le := nil le compilateur refuse également :
    "Affectation impossible à une propriété en lecture seule"


  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 755
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 349
    Points
    13 349
    Par défaut
    Le code semble correct.
    Il faudrait voir à quoi tu accèdes depuis le destructor du TShape.

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Le code semble correct.
    Il faudrait voir à quoi tu accèdes depuis le destructor du TShape.
    Voilà mon composant

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    procedure Register;
     
    implementation
     
    constructor TShapeRu.Create(AOwner : TComponent);
    begin
      inherited Create(AOwner);
      FFlashEnabled := False;
      FFlashRate := 800;
      Timer := TTimer.Create(Self);
      Timer.Interval := FFlashRate;
      Timer.OnTimer := OnTimer;
     
      CodeShape := -1;
      Changed := False;
      NbSousTaches := 0;
      ColDeb := 0;
      ColFin := 0;
      NbCol  := 0;
      FlashEnabled := False;
    end;
     
    destructor TShapeRu.Destroy;
    begin
      Timer.Free;
      inherited Destroy;
    end;
     
    procedure TShapeRu.Paint;
      Procedure Degrader;
      var
        TailleDuTexte : Integer;
        Vertex    :array[0..1] of TTriVertex;
        Rectangle :TGradientRect;
        Rect:TRect;
      begin
        Vertex[0].X     := 2;
        Vertex[0].Y     := 2;
        Vertex[0].Red   := GetRValue(StartColor) *$100;
        Vertex[0].Green := GetGValue(StartColor) *$100;
        Vertex[0].Blue  := GetBValue(StartColor) *$100;
     
        Vertex[1].X     := Width-2;
        Vertex[1].Y     := Height-2;
        Vertex[1].Red   := GetRValue(EndColor) *$100;
        Vertex[1].Green := GetGValue(EndColor) *$100;
        Vertex[1].Blue  := GetBValue(EndColor) *$100;
     
        Rect.Top   := Vertex[0].x;
        Rect.Left  := Vertex[0].y;
        Rect.Right := Vertex[1].x;
        Rect.Bottom:= Vertex[1].y;
     
        Rectangle.UpperLeft  := 0;
        Rectangle.LowerRight := 1;
     
        GradientFill(Canvas.Handle, @Vertex, 2, @Rectangle, 1, GRADIENT_FILL_RECT_V);
        With Canvas do
        begin
          Font.Name := Self.Font.Name;
          Brush.Style := bsClear;
          if Self.Caption1 = '' then DrawText(Canvas.Handle, PChar(Self.Caption) , -1, Rect, DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE)
          else
          Begin
            //...
          end;
        End;
      End;
    begin
      inherited Paint;
      Degrader;
    end;
     
    procedure TShapeRu.WMMOUSEWHEEL(var Message: TMessage);
    begin
      inherited;
      TStringGridRu(Parent).CheckInBounds;
    end;
     
    procedure TShapeRu.SetFlashEnabled(AFlashEnabled: Boolean);
    begin
      FFlashEnabled := AFlashEnabled;   // On affiche la nouvelle valeur
      Timer.Enabled := FFlashEnabled;  // On (dés)active le Timer
    end;
     
    procedure TShapeRu.SetFlashRate(AFlashRate: Integer);
    begin
      FFlashRate := AFlashRate;   // On affiche la nouvelle valeur
      Timer.Interval := AFlashRate;   // On assigne au Timer le nouvel interval
    end;
     
    procedure TShapeRu.OnTimer(Sender: TObject);
    begin
      inherited;
      if Pen.Style = PsDashDot
      then Pen.Style := PsDashDotDot
      else Pen.Style := PsDashDot;
    end;
     
     
    procedure Register;
    begin
      RegisterComponents('RuCompos', [TShapeRu]);
    end;

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 755
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 755
    Points : 13 349
    Points
    13 349
    Par défaut
    Bien sûr la déclaration de Destroy est override ?

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Bien sûr la déclaration de Destroy est override ?
    Oui AndNotor je l'ai bien override (sur tes anciens conseill d'ailleur)

    Mais j'ai trouvé, 4 heures de perdu... le délire.

    Au début focalisé sur comment pourquoi ou, que je remrquais pas que cette erreur ce produisait uniquement lorsque je quittais la form !!!!
    Et là, évidement j'ai foncé dans mon destroy de ma form et j'avais cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if Assigned(Shape) then Shape.Free;
    Lorsque je la vire, cela fonctionne :

    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
    procedure TFPreferences.FormDestroy(Sender: TObject);
    var
      i: Integer;
    begin
      if Assigned(Combo) then Combo.Free;
    //  if Assigned(Shape) then Shape.Free;
     
      for i := StringGridPreferences.ComponentCount - 1 downto 0 do
        StringGridPreferences.Components[i].Free;
     
    // Désallocation de mémoire Tableau et Variables globales
      Finalize(sDefautStringGrid);
      Finalize(sDefautStringGrid);
     
    //...
    end;
    Mais pourquoi j'ai cette erreur alors ?
    C'est abérant pourtant je test avant si Assigned ??
    Le pire c'est que cela faisais l'erreur que dans certain cas.

    Illustration de l'erreur :
    Ma procédure qui créée les shapes ne se produit que si je clique dans un certain item de mon listview, dans les autres items evidement il disparaissent (puisque le free a lieu) et si je reclique sur mon item de shapes ils se recéent.
    Donc lorsque je termine par l'item où je le créer et que je ferme la form je n'ai pas l'érreur, mais si je termine par un autre item (donc les frees on eu lieu) là je me prend l'erreur de pointeur !!



    Ya des fois je comprends rien...


    Merci pour vos recherches et proposition qui m'ont permis de trouver la solution.


  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je pense que j'ai compris pourquoi j'avais l'erreur.

    1) je vois pas pourquoi je fais ce free !!! parceque je créer dynamiquement à un endroit et je free l'ensemble des composants de mon stringgrid qui sont des shapes. Donc déjà là c'est nul de ma part.

    2) j'ai déclaré mon shape en public dans ma form, donc je suppose qu'il doit être assigner au moment ou ma form ce CREATE.

    3) le free avait donc lieu et j'essayai de libérer un shape qui n'était pas créé.

    Est-ce cela ?

    J'ai vraiment des doutes en fait lol ...

    Mais bon comme je l'écris plus bas c'est réglé.

  11. #11
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Salut,

    - Assigned ne peut pas détecter un pointeur incorrect. C'est-à-dire différent de nil et pointant sur des données non valides.

    - De toute façon, tu avais créé ton Shape avec StringGridPreferences comme Owner, qui était de ce fait responsable de sa libération.

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

Discussions similaires

  1. Opération de pointeur incorrecte
    Par colorid dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2010, 18h08
  2. "Opération de pointeur incorrect"
    Par Sancha dans le forum Langage
    Réponses: 5
    Dernier message: 18/11/2009, 12h33
  3. Opération de pointeur incorrecte au Raise d'une exception
    Par stanislas dans le forum Débuter
    Réponses: 5
    Dernier message: 24/06/2009, 11h11
  4. Réponses: 21
    Dernier message: 10/07/2008, 12h09
  5. Message d'erreur 'opération de pointeur incorrecte'
    Par Clotilde dans le forum Langage
    Réponses: 3
    Dernier message: 05/06/2008, 09h40

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