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 :

violation d'accès dans le FormCreate


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut violation d'accès dans le FormCreate
    Bonjour,
    j'ai une violation d'acces assez bizarre.

    En fait, je déclare un TList(lstList) au tout début de mon code, ainsi qu'une TStringList (myList)
    Sur le formcreate, j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lstList.Add(myList);
    quand j'exécute le code, il me sort une violation d'accès sur cette ligne, puis il continue quand même l'exécution..

    des idées??

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Donne-nous le code complet de ton OnCreate.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    procedure TForm1.FormCreate(Sender: TObject);
    begin

    lstList.Add(myList);

    end;


  4. #4
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Bonjour,

    Il manquerais pas un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LstList:= TList.Create;
    Par hazard? (et le Destroy qui va avec)

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    j'ai essayé d'ajouter un TList.create
    mais ça ne marche toujours pas pour autant..

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut
    Je n'ai pas tout le contexte ... mais cela ne m'étonnerai pas que, au FormCreate, ton objet lstList n'ait pas encore été créé. Donc quand tu fais

    lstList.Add(myList);

    lstList n'est pas encore crée et donc PAF.

    J'ai pas de Delphi sous la main ici .. mais regarde juste, avant cette ligne, si lstList = nil. si c'est le cas ben c'est bien ce que je dis

    Edit : ou alors c'est myList qui est nil... je sais pas d'ou il vient lui

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    effectivement, il s'agit d'écrire lstList := TList.create;
    là, ça ne plante plus, par contre j'ai encore beaucoup de bizarreries..

    Je vous explique ce que je fais..

    en fait, j'écris une procédure "finaliser" qui, à la fermeture de mon form va se charger de fermer tous les objets query, connection ou stringlist non détruits...
    voila le code:
    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
     
    procedure finaliser;
    var i: integer;
        query: TADOQuery;
        cox : TADOConnection;
        lst : TStringList;
    begin
      //parcourrir la liste des query du dernier au premier item
      if queryList <> nil then
      for i := pred(queryList.Count) downTo 0 do
      begin
        query := queryList.Items[i];
        //destruction de l'item courant s'il est est différent de nil
        if assigned(query)
          then query.Free;
        queryList.Free;
      end;
     
      //parcourrir la liste des connections du dernier au premier item
      if coxList <> nil then
      for i := pred(coxList.Count) downTo 0 do
      begin
        cox := coxList.Items[i];
        //destruction de l'item courant s'il est est différent de nil
        if assigned(cox)
          then cox.Free;
        coxList.Free;
      end else exit;
     
      //parcourrir la liste des stringList du dernier au premier item
      if lstList <> nil then
      for i := 0 to lstList.Count -1 do
      begin
        lst := lstList.Items[i];
        //destruction de l'item courant s'il est est différent de nil
        if assigned(lst)
          then lst.Free;
        lstList.Free;
      end else exit;
     
    end;
    vous remarquerez que j'ai essayé : de 0 à count-1, ainsi que le contraire (avec Pred), mais ça plante dans les deux cas!

    Mon problème est que j'ai toujours un "indice de liste hors limites"..
    Pourtant, sur mon FormCreate j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      lst1 := TStringList.Create;
      lst2 := TStringList.Create;
      queryList := TList.Create:  
      coxList := TList.Create;
      lstList := TList.Create;
      lstList.Add(lst1);
      lstList.Add(lst2);
    puis lors du traitement, à chaque fois que j'ouvre une ADOConnection, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coxlist.Add(myAdoConnection);
    à chaque fois que je crée une ADOQuery, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coxlist.Add(myAdoQuery);
    j'ouvre mon form.
    Je fais quelques traitements histoire de bien alimenter mes listes, puis, quand je ferme mon form, j'ai toujours un "indice de liste hors limites"

    voila...
    Dans le souci d'etre propre, mon code plante

  8. #8
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      for i := pred(queryList.Count) downTo 0 do  //Ici tu boucles dans queryList...
      begin
        {[...]}
        queryList.Free;  //...et à l'intérieur de ta boucle tu supprimes ton objet
      end;

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut
    Ouch difficile de voir comme ca Moi pour les soucis d'array index out of bounds j'execute en pas-à pas pour voir exactement ou ca plante et l'etat de mes variables. Mais y a quand même 1 ou 2 trucs qui me paraissent bizzare :

    Au FormCreate tu fais : un queryList := TList.Create:
    Et Dans finaliser tu fais : if queryList <> nil then

    Dans ton cas ce test doit toujours être true donc inutile. A moins que tu voulais tester si ta liste est vide mais dans ce cas c'est : if queryList.Count = 0 then

    Même remarque pour coxList et lstList

    Ceci dit, je crois pas que je les detruirait comme ca. C'est pas des objets ayant des connexions d'ouverte qu'il faut absolument fermer... En gros si tu quitte l'application il doit te les libérer tout seul QU'on me corrige si je dis des betises

    Edit : Hihi exact slimjoe .. j'avais pas relevé cette erreur Mais si il fait un free de l'objet et ensuite il essaye d'y réacceder ca devrait faire une violation d'acces pas une faute d'index

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/05/2007, 17h18
  2. [DLL] Violation d'acces dans msvbvm60.dll
    Par SubZero2 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 10/04/2006, 13h46
  3. [D7] Violation d'accès dans l'IDE
    Par paradise dans le forum Langage
    Réponses: 1
    Dernier message: 08/02/2006, 16h10
  4. Message de violation d'accès dans la dcc50.dll
    Par cchatelain dans le forum EDI
    Réponses: 17
    Dernier message: 29/11/2005, 18h28
  5. Violation d'accès dans l'EDI sur compo1 apres suppr de comp2
    Par RamDevTeam dans le forum Composants VCL
    Réponses: 2
    Dernier message: 31/05/2005, 15h02

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