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 [OnDestroy][D6Perso][MyLittleBase]


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 120
    Par défaut Violation d'accés [OnDestroy][D6Perso][MyLittleBase]
    SAlut
    Alors voila je me fait un petit prog sans pretention de gestion de trousse a pharmatie (pour mon travail) .... et oui je bosse a la maison , breff

    Je 'travail' sur Delphi6 Perso et j'utilise MyLittleBase pour les base de données.

    A la creation de ma Form principale je met ca:
    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
     
    procedure TFPrincip.FormCreate(Sender: TObject);
    begin
         strpath:=extractfilepath(application.ExeName);
         if rightstr(strpath,1) <> '\' then strpath:=strpath+'\';
         StrPath:=Strpath + 'Bases\';
         if not DirectoryExists(StrPath) then
           if not CreateDir(StrPath) then
           raise Exception.Create('Impossible de créer le répartoire "Bases"');
     
     
     
         BaseProd:=TMLB2.Create;
         if not fileexists(strpath + 'Produit.qwzt') then
         begin
              BaseProd.AddField('IDProd');
              BaseProd.AddField('Nom');
              BaseProd.AddField('PerimON');
              BaseProd.SaveToMLBFile(strpath + 'Produit.qwzt');
         end;
         BaseProd.LoadFromMLBFile(strpath + 'Produit.qwzt');
     
    .... Etc pour les autres Bases
    Par contre mes Bases sont declarer sur une autre Form (Modul), j'ai commencé la prog sur Visual Basic et je trouvais bien pratique le principe des Moduls, il exist certainement quelquechose sous Delphi mais a defaut de savoir quoi je fait comme ca. Cette FormModul je la declare ensuite dans les Uses des Forms ayant à utiliser mes Bases.

    Voila pour le context

    Ensuite quand l'utilisateur ferme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TFPrincip.FormDestroy(Sender: TObject);
    begin
    //
    BaseProd.Free;
    BaseType.Free;
    BaseBoite.Free;
    BaseContenu.Free;
    End;
    Jusque la tout aller bien ... mais dernierement g fait des modifications, me demandez pas lesquelles je relance pas à chaque modification pour voir si ca tourne toujours. Et donc maintenant g une violation d'accés à la fermeture.

    J'ai effectué un pas à pas et je me suis rendu compte qu'une fois le OnDestroy de ma form principale appelé et mes Bases liberées, il execute du code contenu dans des ListViewSelectItem .... qui font elles meme reference a mes Bases ... que j'ai deja liberé ... si vous me suivez toujours

    J'ai essayé de mettre des ListView.free dans le OnDestroy de ma Form Principale mais ca ne marche pas.

    En ecrivant cette demande je me suis egalement demandé si en supprimant ma FromModule ca n'irai pas mieux ... malheureusement je ne peut pas, ou du moins je ne sais pas comment faire, car j'ai supprimé le typage de cette form pour ne pas avoir l'aspect graphique, un petit schema vaut mieux que de grandes paroles surtout que ca n'est pas trop mon fort donc 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    unit Module;
     
    interface
     
    Uses Mlb2,Menus,StrUtils, SysUtils;
     
     
        { Déclarations publiques }
        Const Base_Produit=1;
              Base_Type=2;
              Base_Boite=3;
              Base_Contenu=4;
     
        Var StrPath: string;
            BaseProd : TMlb2;
            BaseType : TMlb2;
            BaseBoite: TMlb2;
            BaseContenu: TMlb2;
        Type TDateList = Array Of TDateTime;
        Type TIntList = Array Of Integer;
        Procedure InMenu(Choix: String); // Choix = Boite, Type, All
     
        Function SaveBase(BaseName : Integer):Boolean;
        Function CumulQeff(StrQList: String):String;
        Function ListDate(StrDateList: String):TDateList;
        Function ListQeff(StrListQeff: String):TIntList;
     
    implementation
    Uses Principale;
     
    Procedure InMenu(Choix: String);
    Var NewMnuItem:TMenuItem;
    Begin
    // Charger les boite et les types dans les menu correspondant
         if (Choix = 'Boite') Or (Choix = 'All') then
         Begin
              FPrincip.MnuMBoite.Clear;
              BaseBoite.SortByData('Nom',True);
              BaseBoite.GoFirst;
              While not BaseBoite.EndOfFile do
              Begin
                   NewMnuItem:=TMenuItem.Create(FPrincip);
                   NewMnuItem.OnClick:=FPrincip.MnuModifClick;
                   NewMnuItem.Caption:=BaseBoite.GetData('Nom');
                   FPrincip.MnuMBoite.Add(NewMnuItem);
                   BaseBoite.GoNext;
              End;
              BaseBoite.EndSeek;
         End;
     
    .... etc...
    Bon voila je pense avoir fait la demande la plus complete possible, si vous avez des propositions voir meme des solutions je l'espere je reste dispo pour plus de renseignements.
    A++ Merci d'avance

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut
    Ahhhh les joies des violations d'accès

    Tu as quoi exactement comme composant sur ta fiche ? une ListView ? ou un dérivé de ListView qui affiche le contenu de ta/tes tables. Si c'est le cas, il faut voir pour supprimer le lien entre les bases et ce composant avant de "Free" tes bases... (Si c'est un objet comme un DBStringGrid y a surement une methode pour se deconnecter de la base).

    Sinon tu as peut-être un timer qui ré-actualise ton affichage tout les x temps. Fais attention à arreter le timer AVANT de libérer tes tables. Sinon après le Free tu pourrait avoir un OnTimer qui veut y accéder Et PAF.

    Finalement je mettrai un point d'arret dans chaqun des événements que tu as dans ta form. Il y a des chances que après le destroy de la base, un des événements soit généré (un Redraw, un LostFocus, un SelectionChange ...) et qu'il essaye d'accéder à une de tes base... BOUM.

    voilà de tête quelques petites piste a explorer... y'a surement d'autres raison possibles, mais celles-ci sont des que j'ai déjà eues

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 120
    Par défaut
    RE
    J'utilise des ListView mais en faite mon probleme n'avait absolument rien a voir avec mes Bases, mon erreur etait la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TFPrincip.LVBoiteSelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    begin
         MInfo.Clear;
     
         With BaseBoite Do
         Begin
              GoFirst;
              BeginSeek(Mlb_Forward);
              While SeekData('Nom','=',LVBoite.Selected.Caption) Do
              Begin
                   MInfo.Lines.Add('Nom  : ' + GetData('Nom'));
    Je n'avais pas mis la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not Selected then Exit;
    et donc lors de l'appelle a LVBoite.Selected.Caption Bamm

    Apperement le faite que les Bases soit libérées ne gene en rien ...

    Merci quand meme pour la reponse

    ++Je le met en delestage je pense pas qu'il apporte grand chose au autre

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 81
    Par défaut
    Ah ben vi rien à voir avec les bases Tant que le problème est résolu .. c'est l'essentiel.

    Bonne suite

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

Discussions similaires

  1. ReportPrinterDialog (QR2) : violation d'accès..
    Par Harry dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 14h04
  2. [XMLDocument] Violation d'accès
    Par xant dans le forum Composants VCL
    Réponses: 8
    Dernier message: 29/09/2004, 15h39
  3. requete / violation d'accès
    Par marie253 dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/08/2004, 13h29
  4. Violation d'acces apres Execute
    Par SegmentationFault dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 10/08/2004, 16h23
  5. Violation d'accès apres Close
    Par SegmentationFault dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/07/2004, 16h46

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