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

Composants VCL Delphi Discussion :

[VCL] TImage.Create(AOwner) renvoie une Violation d'accès


Sujet :

Composants VCL Delphi

  1. #1
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut [VCL] TImage.Create(AOwner) renvoie une Violation d'accès
    Bonjour,
    Je suis en train de développer un éditeur qui nécessite la création dynamique de TImage. Mais ma ligne créant ces TImages provoque une erreur 9 fois sur 10 (Violation d'acces aux adresse assez spécifiques comme 000000, FFFFDC, 000008EA). Voici la ligne en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    arr_img_Items[i] := TImage.Create(MainForm.GroupBox1);
    {
    i est un integer tel que i < Length(arr_img_Items)
    arr_img_Items est comme son nom l'indique un array of TImage
    MainForm est de type TMainForm, classe dérivée de TForm
    GroupBox1 est un TGroupBox de MainForm
    }
    Pouvez vous m'aider à identifier la cause de ce problème ? Merci de votre aide.

    Titre modifié.
    Merci de lire les règles du forum.

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Pourquoi utilise-tu un TGroupBox comme owner du TImage ?
    Est-tu sur de la taille de ton tableau et de ses indices ?

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Si j'utilise un TGroupBox comme Owner, c'est pour des questions de pratique (le TImag est apparait dans un TGroupBox et cela simplifie la lecture des coordonnées de la sourie que j'utilise).

    Oui, je suis sûr de mon tableau. Avant d'ajouter un élément, je fais un SetLength. J'ai suivi ma procedure pas à pas et ce n'était apparemment pas le problème.

    Voulez-vous plus de code ?

  4. #4
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Je ne vois pas ce qui peut clocher. Il te faudrait déterminer ce qui plante exactement : la création du TImage ou l'affectation. Pour cela, je ne vois qu'une solution : séparer les deux opérations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      tmp: TImage;
    begin
    ...
      tmp:= TImage.Create(MainForm.GroupBox1);
      arr_img_Items[i]:= tmp;
    ...
    end;
    Et si ton programme plante de manière aléatoire, ajoute des traces autour de chaque opération pour déterminer celle qui pose problème.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 42
    Points
    42
    Par défaut
    Si la solution de Pierre Castelain ne t'aide pas, essaye aussi de changer le AOwner de tes Timage (en mettant, par exemple, MainForm). Y pourrais y avoir un problème d'incompatibilité (même si je ne vois pas pourquoi)...

  6. #6
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 594
    Points
    594
    Par défaut
    Quelle est la porté de ton tableau?
    Je suis avec l'idée de mettre comme propriétaire la Forme et pour parent le GroupBox.
    Un autre bout de code va permettre une aide remarcable.

  7. #7
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Le problème n'est pas l'affectation, mais bien la création ; et cela quel que soit le propriétaire. Mon tableau est bien une variable globale.

    Voici l'ensemble de ma procédure bien documentée :
    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
    procedure AfficherLesItems;
    var
      i: Integer;
      dbl_rapport: Double;
      Bitmap: TBitmap;
     
    begin
      // On efface tous les items pour les recoustruire :
      For i:=0 to Length(arr_img_Items)-1 do
        arr_img_Items[i].Destroy;
      SetLength(arr_img_Items, 0);
      For i:=0 to Length(Map.MapElements)-1 do // Map.MapElements : array of PTMapElement ;
                                                  PTMapElement = ^TMapElement ;
                                                  TMapElement = record
                                                        Top: Integer;
                                                        Left: Integer;
                                                        Item: Integer;
                                                   end;
      begin
        if not ( Map.MapElements[i] = nil ) then
        begin
          // On charge le bitmap de l'item sélectionné :
          Bitmap := TBitmap.Create;
          Bitmap.LoadFromFile(Items[Map.MapElements[i]^.Item].Icon);
          dbl_rapport := Min( Items[Map.MapElements[i]^.Item].Properties[1]/Bitmap.Width, Items[Map.MapElements[i]^.Item].Properties[0]/Bitmap.Height );
          // On crée le TImage qui l'affichera :
          SetLength(arr_img_Items, Length(arr_img_Items)+2);
          arr_img_Items[i] := TImage.Create(MainForm);
          with arr_img_Items[i] do
          begin
            Parent := MainForm.GroupBox1;
            Top := Map.MapElements[i]^.Top;
            Left := Map.MapElements[i]^.Left;
            Height := Items[Map.MapElements[i]^.Item].Properties[0];
            Width := Items[Map.MapElements[i]^.Item].Properties[1];
            OnMouseMove := MainForm.img_support.OnMouseMove;
            OnClick := MainForm.img_support.OnClick;
          end;
          // On redimensionne le bitmap et on l'addecte au TImage créé :
          BITMAP_REDIMENSIONAR(Bitmap, arr_img_Items[i].Picture.Bitmap, dbl_rapport*RapportDAgrandissementDeLaMap, True);
        end;
      end;
    end;
    Je ne comprends pas d'ou peut venir le probleme ...

  8. #8
    Expert confirmé
    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 : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    2 choses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetLength(arr_img_Items, 0);
    Il faut toujours ajouter 1 au nombre donné à SetLength:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetLength(arr_img_Items, number + 1); // number >= 0
    Il faut définir la propriété Name de chaque image.

    à+

  9. #9
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Tu es sur de ne pas avoir de valeur à nil dans Map.MapElements ? Cela pourrait expliquer ton problème : tu accède à arr_img_Items en utilisant i qui est basé sur le nombre d'éléments de Map.MapElements. Si les premiers éléménts sont à nil, tu vas accéder au tableau avec un indice plus grand que le dernier élément.

  10. #10
    Expert confirmé
    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 : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Pierre a raison!
    Lorsque je dois accèder à tous les éléments d'un tableau dynamique, j'utilise Low et High :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i := Low(mytab) To High(mytab) Do...
    Ainsi, je suis sûr de ne jamais dépasser les limites du tableau.

    De plus, il faut contrôler que l'élément a bien été créé avant d'agir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i := Low(mytab) To High(mytab) Do
      If (mytab[i] <> Nil) Then...
    Mais ça je pense que tu l'avais déjà compris!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if not ( Map.MapElements[i] = nil ) then

  11. #11
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    J'ai modifier les lignes for i:=0 to Length(array)-1 en for i:=low(array) to high(array) et ca m'a l'air de fonctionner. Je vous remerci de votre aide.

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

Discussions similaires

  1. Origine d'une violation d'accès
    Par ParkerL31884 dans le forum Fortran
    Réponses: 6
    Dernier message: 07/11/2013, 17h28
  2. Renvoi à une procédure
    Par Bernjean dans le forum Access
    Réponses: 2
    Dernier message: 16/11/2005, 20h52
  3. [Timage] 2 images en une
    Par badrou dans le forum Composants VCL
    Réponses: 22
    Dernier message: 08/07/2005, 21h08
  4. renvoie une valeur erronée
    Par m@thieu dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/12/2004, 17h09

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