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

C++Builder Discussion :

J'ai tjrs le problème de Out of Memory


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut J'ai tjrs le problème de Out of Memory
    Salut,

    Dans un DBGrid, à la saisie d'un bon de livraison, lorsque le nombre de ligne est assez grand (plus de 20), le programme est interrompu et affiche le message : Out Of Memory
    La pièce est perdu

    Pourtant j'utiliser la commande delete pour libérer la mémoire.

    Je sait pas comment faire

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonsoir,

    Hé bé, sans vouloir jouer le relou avec une vieille rengaine, je dirais qu'il serait peut être intéressant pour tout le monde d'en savoir un peu plus sur le code utilisé autour de ce DBGrid, les obejcts pour la connection a la BDD, le type de tables, etc ...

    @ +

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Pour être plus claire :
    J'utilise Firebird 2.0. (le même problème se pose avec Interbase).

    A l'appelation de saisie par menu, le prgme affiche une fenêtre ListePiecesFrm qui contient la liste des pièces déjà saisies. Je clique le Boutton Nouveou pour ajouter une pièce, la fenêtre de saisie des pièces PieceFrm s'affiche, puis aprés la saisie du numéro de pièce, la date, je fais appel pour chaque ligne à une autre fenêtre ArticlesFrm qui affiche les articles, après que je choisi l'article par recherche avec des requette SQL, je ferme la fenêtre ArticlesFrm et je place mon article dans la DBGrid de la fenêtre PieceFrm.

    NB. Ou moment de la saisie : j'ai les fenêtre suivant :
    - La fenetre principale
    - la fenêtre ListePiecesFrm
    - la fenêtre PieceFrm de saisie
    - la fenêtre ArticlesFrm pour le choix de l'article


    Si j'ai moins de 20 articles il n'a pas de problème. Mais dès que je dépasse 24 ou 28 çà dépend des cas, j'obtient le message Out Of Memory qui me dérange bcp et surtout mes clients.

    J'espère que j'ai bien posé le problème.

  4. #4
    Membre émérite
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Par défaut
    Salut !

    C'est bien de donner le diagramme d'apparition des fenêtres, mais je crois qu'il est...plus précis de donner des parties de ton code sources qui sont susceptibles de provoquer l'erreur.

    En voulant t'aider !

    A+

  5. #5
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Salut,

    Voici un extrait de mon 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
    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    //---------------------------------------------------------------------------
    void __fastcall TGestionFrm::BonsLivraisonParClientClick(TObject *Sender)
    {
            Piece("WHERE CODE=:CODE AND TYPEP=3","Bons de livraison clients", "Client",3, 1, 1,5,150,544,456,80);
    }
    //---------------------------------------------------------------------------
    void __fastcall TGestionFrm::Piece(String xWhere,AnsiString FenCaption, AnsiString FenLBCpte, ushort p,
            ushort Sec, ushort xTypeCpte, ushort NbreCol, ushort LeftTotMnt1,ushort FenWidth, ushort GRListeWidth, ushort LeftTotaux)
    {
    // try
    // {
     
        DModule->Divers->Open();
        TPieceFrm *Fen=NULL;
        Fen = new TPieceFrm(this);
        xCode=DModule->CompteCODE->Value;
        Fen->GRListePieces->Width=GRListeWidth;
        DModule->Compte->Close();
        DModule->Compte->SelectSQL->Strings[2]="where typecpte=:pTypeCpte and afflst=1"; //code<>'C0000' and
        DModule->Compte->SelectSQL->Strings[3]="order by nom";
        DModule->Compte->ParamByName("pTypeCpte")->AsInteger=xTypeCpte;
     
        DModule->Piece->Close();
        DModule->Piece->SelectSQL->Strings[2]="join v_0021 b on a.code=b.code1";
        DModule->Piece->SelectSQL->Strings[3]=xWhere;
    		.
    		.
    		.
     
        if (Sec==4)
            DModule->Piece->DataSource=NULL;
        else
            DModule->Piece->DataSource=DModule->DSCompte;
        DModule->Compte->Open();
     
        DModule->CalculTotaux(xCode);
        DModule->Piece->Open();
     
        Fen->Caption=FenCaption;
        DModule->Compte->Close();
        DModule->Compte->Open();
        Fen->ShowModal();
        Fen->DestroyComponents();
        Fen=NULL; delete Fen;
     /*}
     catch(...)
     {
         return;
     }*/ 
     
     
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TPieceFrm::NouvellePieceClick(TObject *Sender)
    {
       	String xCode=DModule->CompteCODE->Value;
    	SaisiePiece(1, xCode, "");
     
    }
    //-----------------------------------------------------------------------------
    void __fastcall TPieceFrm::SaisiePiece(ushort u, String xCode, String xCdmvt)
    {
            DModule->Facture->Close();
            DModule->Lignes->Close();
            DModule->Livraison->Close();
     
            TAffPieceFrm *Fen1=NULL;
    	Fen1 = new TAffPieceFrm(this);
     
    	Fen1->ShowModal();
            Fen1->Release();
            TLocateOptions Opts; Opts.Clear(); Opts << loPartialKey << loCaseInsensitive;
            DModule->Piece->Locate("CDMVT",xCdmvt,Opts);
    }
    //---------------------------------------------------------------------------
    void __fastcall TAffPieceFrm::DBGridLignesKeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
       try
       {   
     
            if (Key==VK_F5) //Liste des articles
            {
                    TRechercheFrm *FenRech=NULL;
                    FenRech = new TRechercheFrm(this);
                    FenRech->Caption = "Choix d'article";
                    DModule->Articles->Open();
                    FenRech->DataSource->DataSet=DModule->Articles;
                    DModule->CountArt->SQL->Strings[1]="";
                    DModule->CountArt->Open();
                    FenRech->EditRecherche1->Text="";
                    FenRech->ShowModal();
                    FenRech->DestroyComponents();
                    FenRech=NULL; delete FenRech;
                    //ShowMessage("eeeeee");
                    //FenRech=NULL; delete FenRech;
                    DBGridLignes->SelectedIndex=4;
                    //SendMessage(DBGridLignes->Handle,WM_KEYDOWN, VK_RIGHT,1);
            }
     
       }
       catch(...)
       {
       } 
    }
    //---------------------------------------------------------------------------
    void __fastcall TRechercheFrm::OKBtnClick(TObject *Sender)
    {
            DModule->MouvTemp->Edit();
            DModule->MouvTempCDART->Value = DModule->ArticlesCDART->Value;
            DModule->MouvTempDESIGN1->Value = DModule->ArticlesDESIGN1->Value;
           // DestroyComponents(); //Cette commande retourn un message d'erreur et bloque le prg
            Close();
    }
    //---------------------------------------------------------------------------
    void __fastcall TRechercheFrm::NouveauClick(TObject *Sender)
    {
    	===> Création de nouvelle article
            TMajArtFrm *FenArt=NULL;
            FenArt = new TMajArtFrm(this);
            FenArt->Top=100;
            FenArt->Caption="Fiche article";
            DModule->Article->Close();
            DModule->Article->SelectSQL->Strings[2]="WHERE CDART LIKE :xParam or DESIGN1 LIKE :xParam"; // AND TYPEART=1
            DModule->Article->SelectSQL->Strings[3]="ORDER BY cdart";
            DModule->Article->ParamByName("xParam")->AsString="%%";
            DModule->Article->Open();
            DModule->Article->Last();
            DModule->Article->Insert();
     
            FenArt->ShowModal();
            FenArt->DestroyComponents();
            FenArt=NULL; delete FenArt;
            Close();
    }
    //---------------------------------------------------------------------------

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Fen1 = new TAffPieceFrm(this);
    Vérifier si (à défaut de delete) on a Fen1->Close() (en réponse à new) avec Action = caFree dans sa OnClose

    // DestroyComponents(); //Cette commande retourn un message d'erreur et bloque le prg
    Close();
    << normalement détruit ses composants si Action = caFree dans sa OnClose

    FenArt = new TMajArtFrm(this);
    puis :
    FenArt->ShowModal();
    FenArt->DestroyComponents(); <<< Comme mentionné avant == inutile
    FenArt=NULL;
    delete FenArt;
    <<< Impossible puisque FenArt est NULL, donc FenArt n'est jamais détruit
    Close();

    En fait, il faut vérifier toutes ces instanciations d'objets et leur destruction.
    Tout objet dérivé de TComponent détruit les objets dérivés de TComponent dont il est propriétaire.

    A plus !

  7. #7
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Bonjour,

    Tout d'abord je met pour toutes le fenêtres Action=caFree (OnClose).

    henderson a écrit :

    delete FenArt; <<< Impossible puisque FenArt est NULL, donc FenArt n'est jamais détruit
    Vous avez raison qu'il y a un problème d'instanciation.
    Pour chaque ligne de la pièce il existe une instance de la fenêtre à chaque appelation de RechercheFrm (Choix de l'article).
    Pour n lignes de la pièce il y a n instances de RechercheFrm!!!!

    Comment faire pour libérer la mémoire ocuppée par ces instances.
    Merci.

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Tester quand même la destruction de la fenêtre avant de fixer le pointeur sur NULL. L'avantage est que ca va aller dans le sens où chaque objet créé sera effectivement détruit. C'est le cumul d'objets non détruits qui fini par saturer la mémoire disponible.

    Voir également si on peut développer pour n'avoir qu'une seule fenêtre à qui l'on donne de quoi se rafraîchir.
    Bien sur, ça dépend de ce qu'il y a à faire, en terme de présentation.
    Je ne suis pas certain qu'une abondance de fenêtres aille dans le sens d'un meilleur confort visuel.

    A plus !

  9. #9
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Salut,

    Henderson a écrit :
    Tester quand même la destruction de la fenêtre avant de fixer le pointeur sur NULL.
    Comment on peut faire ça ?

    Voir également si on peut développer pour n'avoir qu'une seule fenêtre à qui l'on donne de quoi se rafraîchir.
    Bien sur, ça dépend de ce qu'il y a à faire, en terme de présentation.
    Je ne suis pas certain qu'une abondance de fenêtres aille dans le sens d'un meilleur confort visuel.
    Oui je suis d'accord avec toi Hennderson, mais je peux pas travailler avec une seul fenêtre, je peux pas me débarasser de la fenêtre RechercheFrm qui permet à l'utilisateur de choisir l'article à inserer dans la pièce.

    Pour ceux qui ont réaliser une application de gestion commerciale, comment vous proceder dans ce cas : choix d'un article.

    Merci.

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    En travaillant avec Show et Hide et non pas avec new et delete ou Close.

    Il faut vérifier aussi si des objets volumineux ne sont pas créés sans jamais être détruits. Tout ce qui ne dérive pas de TComponent doit être détruit manuellement, comme par exemple les bitmaps (c'est l'exemple type) sauf bien sûr s'ils sont détruits par un objet (TImage::TPicture détruit son propre bitmap s'il en existe un pour l'objet en question).

    A plus !

  11. #11
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    bonjour
    il me semble que dans la citation suivante
    Fen1 = new TAffPieceFrm(this);
    en affectant <this> à la création de ta fiche, tu déclare que <this> est le propriétaire de ta fenêtre donc en charge de la détruire lors de sa propre destruction

    si tu déclare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fen1 = new TAffPieceFrm(NULL)
    ta fiche n'a pas de proprétaire c'est donc a toi dès fin d'utilisation de cette fiche de la détruire
    dans ce cas de <cafree> dans le code de fermeture de ta fiche n'a plus d'importance
    ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Fen1->ShowModal();
    delete Fen1;
    Fen1=NULL;
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  12. #12
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Merci,
    Je vais essayer cette solution.

  13. #13
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Salut,

    J'ai remplacé les this par NULL comme vous me dites et ça n'a donné pas de solution. J'ai tjrs la mémoire qui se bloque par les message de Out Of Memory.

    Je sais pas est-ce que ça peut vous aider :

    L'application est de type SDI.
    Les fenêtres sont toutes de type fsNormal.

  14. #14
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut Comment raffraichir ou libérer la mémoire ?
    Salut,

    J'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Fen1->ShowModal();
    Fen1->Delete();
    Fen1->Free();
    Fen1->Release();
    Fen1=NULL;
    - J'ai passé de MDI au SDI.
    - Je travail avec Firebird 2.0 (même problème avec Interbase)
    - Je n'utilise pas d'objets volumineux (Image, ...)
    - Je n'utilise pas d'autres composants que ceux venus avec C++builder.
    - Je fais mes déclarations comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fen1 = new TAffPieceFrm(NULL)
    - J'ai essayé Show() et Hide(), mais ils ne libèrent pas de mémoire.
    - J'utilise un DataModule où j'ai mis toutes mes tables et mes sources de données
    - Pour les DBGrid, y'a pas qu'une seule méthode d'utilisation :
    La datasource, les champs visibles, mise en forme
    Je suis sûr que la fenêtre, n'est pas liérée de la mémoire,à chaque appel il y a des instance de fenêtres qui s'accumulent ce qui entraine le bloquage de la mémoire par le terrible message : Out Of Memory

    SVP aidez moi.

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    - J'ai essayé Show() et Hide(), mais ils ne libèrent pas de mémoire.
    En fait, cela suppose que ces fenêtres ne soient crées qu'une fois et qu'elles ne soient donc jamais détruites sauf lorsque l'on quitte le programme !
    On se contente donc de jouer sur leur visibilité en modifiant si necessaire leur contenu pour afficher ce qui a lieu d'être !

    Par exemple, on suppose une fenêtre pour informer des spécifications d'un élément parmi 1000. Il ne sert à rien de créer et de détruire cette fenêtre à chaque consultation de ces spécifications. Il suffit de rafraîchir les objets sur cette fenêtre en fonction de l'élément dont on chercher à représenter les spécifications.

    Dans ce cas, la fuite de mémoire ne pourra pas venir de ces fenêtres mais peut-être de la manière dont on récupère les informations qui y sont affichées (un bloc de données important qui n'est jamais libéré... par exemple) !

    Par ailleurs, il serait bon d'avoir ici un écho quant à la ressource mémoire disponible avant l'exécution du programme pour se rendre compte de ce qui se passe !

    A plus !

  16. #16
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    As tu essayer de tester ton application avec l'option CodeGuard enclenchée
    cela te permettrait de déterminer ou dasn ton code la mémoire ne se libère pas
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  17. #17
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    dans ton code original
    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
     
    void __fastcall TAffPieceFrm::DBGridLignesKeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
       try
       {   
     
            if (Key==VK_F5) //Liste des articles
            {
                    TRechercheFrm *FenRech=NULL;
                    FenRech = new TRechercheFrm(this);
                    FenRech->Caption = "Choix d'article";
                    DModule->Articles->Open();
                    FenRech->DataSource->DataSet=DModule->Articles;
                    DModule->CountArt->SQL->Strings[1]="";
                    DModule->CountArt->Open();
                    FenRech->EditRecherche1->Text="";
                    FenRech->ShowModal();
                    FenRech->DestroyComponents();
                    FenRech=NULL; delete FenRech;
                    //ShowMessage("eeeeee");
                    //FenRech=NULL; delete FenRech;
                    DBGridLignes->SelectedIndex=4;
                    //SendMessage(DBGridLignes->Handle,WM_KEYDOWN, VK_RIGHT,1);
            }
     
       }
       catch(...)
       {
       } 
    }
    ta fenêtre de recherche n'est jamais détruite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     FenRech=NULL;
     delete FenRech;
    en lieu et place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete FenRech;
    FenRech=NULL;
    cette remarque est également valable pour la destruction de tes autres fenêtres

    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  18. #18
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Merci à vous tous,
    Je vais essayez ces solutions.
    Je m'excuse pour le retard.

  19. #19
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 144
    Par défaut
    Bonjour tout le monde,

    D'après les tets que j'ai fait, ça me parait que le problème ne vient pas de la fenêtre,il faut juste metre l'évennement OnClose à Action=caFree;

    Le prb vient de ma requette que je vais vous montrer ici (voir OKBtnClick) :
    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
    //---------------------------------------------------------------------------
    // AffPieceFrm : Fenêtre de saisie de la pièce, elle contient le DBGrid des lignes
    // de la pièces : Code designation qtté prix unitaire montant...
    // RechercheFrm : Fenêtre de choix des articles
    // automatique sur la source est supprimée. 
    // Toutes ces fenêtres sont de type Normal, visible=false et la ligne créer 
    // EditRecherche1 : zone de saisie pour la recherche de l'article, dès que j'appuis 
    // sur F5, la requette de recherche est exécutée et affiche le résultat dans le DBGrid 
    // et après clique sur Ok cette fenêtre (RechercheFrm) sera fermée et l'article choisi 
    // est inséré dans la DBGrid de AffPieceFrm (et ainsi de suite...). 
    //---------------------------------------------------------------------------
     
    void __fastcall TAffPieceFrm::DBGridLignesKeyUp(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
     
            if (Key==VK_F10)
                    Valider->Click();
            if (Key==VK_F5)
            {
                    TRechercheFrm *FenRech=NULL;
                    FenRech = new TRechercheFrm(NULL);
                    FenRech->Caption = "Choix d'article";
     
                    DModule->Articles->Open();
                    FenRech->DataSource->DataSet=DModule->Articles;
                    DModule->CountArt->SQL->Strings[1]="";
                    DModule->CountArt->Open();
                    FenRech->EditRecherche1->Text="";
                    FenRech->ShowModal();
     
                    delete FenRech;
    		FenRech=NULL;                
                    DBGridLignes->SelectedIndex=4;
            }
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TRechercheFrm::EditRecherche1KeyUp(TObject *Sender,WORD &Key, TShiftState Shift)
    {
            if (Key==VK_F5) //116
                    BTRechercher->Click();
            if (Key==VK_F2)
                    Nouveau->Click();
            if (Key==VK_DOWN)
                    GRRecherche->SetFocus();
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TRechercheFrm::BTRechercherClick(TObject *Sender)
    {
         DModule->Articles->Close();
         DModule->Articles->SQL->Strings[1]="from F0011";
         String xWhere,xWhere1,xWhere2;
         xWhere1="(CDART LIKE :xParam1 or DESIGN1 LIKE :xParam1 or REF LIKE :xParam1)";
         xWhere2="(CDART LIKE :xParam2 or DESIGN1 LIKE :xParam2 or REF LIKE :xParam2)";
         xWhere=xWhere1+AnsiString(" and (")+xWhere2+AnsiString(")");
         DModule->Articles->SQL->Strings[2]="WHERE ("+xWhere+")";// and invent<>1";
         DModule->Articles->SQL->Strings[3]="ORDER BY DESIGN1";
         DModule->Articles->ParamByName("xParam1")->AsString=AnsiString('%')+UpperCase(EditRecherche1->Text.TrimRight().TrimLeft())+AnsiString('%');
         DModule->Articles->ParamByName("xParam2")->AsString=AnsiString('%')+UpperCase(EditRecherche2->Text.TrimRight().TrimLeft())+AnsiString('%');
         DModule->CountArt->SQL->Strings[1]="where "+xWhere;
         DModule->CountArt->ParamByName("xParam1")->AsString=AnsiString('%')+UpperCase(EditRecherche1->Text.TrimRight().TrimLeft())+AnsiString('%');
         DModule->CountArt->ParamByName("xParam2")->AsString=AnsiString('%')+UpperCase(EditRecherche2->Text.TrimRight().TrimLeft())+AnsiString('%');
         DModule->Articles->Open();
         DModule->CountArt->Open();
    }
    //---------------------------------------------------------------------------
    void __fastcall TRechercheFrm::OKBtnClick(TObject *Sender)
    {
            Currency xpht=0, xpttc=0,xQtmvt=0;
            String xCode=DModule->CompteCODE->Value;
            String xCdart=DModule->ArticlesCDART->Value;
            DModule->VerifPrix->Close();
            DModule->VerifPrix->SQL->Strings[2]="where code=:x and cdart=:y";
            DModule->VerifPrix->SQL->Strings[3]="order by dtmvt desc";
            DModule->VerifPrix->ParamByName("x")->AsString=xCode;
            DModule->VerifPrix->ParamByName("y")->AsString=xCdart;
            DModule->VerifPrix->Open();
            DModule->VerifPrix->First();
            xpht=DModule->VerifPrixPXMVTHT->Value;
            xpttc=DModule->VerifPrixPXMVTTTC->Value;
            DModule->MouvTemp->Edit();//MouvTemp et la table dans la DBGrid de pieceFrm
            DModule->MouvTempCDART->Value = DModule->ArticlesCDART->Value;
            DModule->MouvTempDESIGN1->Value = DModule->ArticlesDESIGN1->Value;
            DModule->MouvTempREF->Value = DModule->ArticlesREF->Value;
            DModule->MouvTempUNIT->Value = DModule->ArticlesUNIT->Value;
            DModule->MouvTempDPAHT->Value = DModule->ArticlesDPAHT->Value;
            DModule->MouvTempDPATTC->Value = DModule->ArticlesDPATTC->Value;
            DModule->MouvTempPV1HT->Value = DModule->ArticlesPV1HT->Value;
            DModule->MouvTempPV1TTC->Value = DModule->ArticlesPV1TTC->Value;
            DModule->MouvTempQTTE1->Value = DModule->ArticlesQTTE1->Value;
            DModule->MouvTempTXTVA->Value = DModule->ArticlesTXTVA->Value;
            DModule->MouvTempDETAIL->Value = DModule->ArticlesDETAIL->Value;
            DModule->MouvTempPXMVTHT->Value=xpht;
            DModule->MouvTempPXMVTTTC->Value=xpttc;
            xQtmvt=DModule->MouvTempQTSORT->Value;
            Close();
    }
    //---------------------------------------------------------------------------

  20. #20
    Membre confirmé Avatar de saidus
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations forums :
    Inscription : Octobre 2004
    Messages : 166
    Par défaut
    Bonjour les PRoG
    je pense plutot que les composant que vous utiliser pour l'acces aux donnees ont des problemes (IBExpress et BDE) (defaillance de la gestion de la memoire ....)
    utiliser plutot FibPlus ou IBObject
    vous verrez c'est beaucoup moin de Probleme
    "c'est mon avis"

Discussions similaires

  1. [Liferay] Profiler pour problème de Out Of Memory
    Par Samaël63 dans le forum Portails
    Réponses: 0
    Dernier message: 22/06/2009, 12h06
  2. Problème de out of memory
    Par dodobn dans le forum Environnement de Développement Intégré (EDI)
    Réponses: 2
    Dernier message: 08/06/2009, 01h13
  3. problème c:out dans un display:column
    Par fakhita dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 20/07/2007, 08h37
  4. [Out of Memory] Problème
    Par matt67 dans le forum MATLAB
    Réponses: 19
    Dernier message: 19/06/2007, 13h35
  5. [Linux]Problème System.out.println + compiler
    Par Dnx dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 21/09/2004, 22h05

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