wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 2

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» [wxWidget]Plantage à la fermeture de l'application
Conversation : [wxWidget]Plantage à la fermeture de l'application
28-11-2007 20:07:21  [wxWidget]Plantage à la fermeture de l'application #1
Atikae (Nouveau membre)
Inscrit le : 28-11-2007
Messages: 5
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour tout le monde.
Il y a quelque temps, j'ai fait un programme en C++ utilisant wxWidget sous linux. Je suis ensuite repassé sous windows.
Après une lutte acharné pour que VSExpress prenne en compte les librairies, je me suis rendu compte que j'avais un problème lorsque je fermer le programme soit avec la méthode traditionel (la croix) soit en utilisant la méthode Close();

Je me doute bien que cela vient d'une mauvaise utilisation ou déclaration, mais après 2 jours de recherches, je m'en remet à vous :P


Voici le code :
Mon mainframe.h :

Code Cpp:

 
#ifndef MAINFRAME_H_INCLUDED
#define MAINFRAME_H_INCLUDED
 
#include "wx/wx.h"
 
enum {
        ID_BTN_PARCOURIR,
        ID_BTN_CHARGER,
        ID_BTN_CHANGER,
        ID_MENU_QUIT,
        ID_MENU_PARCOURIR,
        ID_MENU_ABOUT
};
 
class MainFrame : public wxFrame {
    public:
        MainFrame();
        ~MainFrame();
    private:
        wxButton *btnParcourir, *btnCharger, *btnChanger;
        wxTextCtrl *cheminParcourir, *NomActuelTexte, *NouveauNomReponse;
 
        wxMenu *menuFichier, *menuAide;
        wxMenuBar *menuBarre;
        wxStaticText *NomActuelReponse;
 
        void OnParcourir(wxCommandEvent &event);
        void OnButtonStartClicked(wxCommandEvent &event);
        void OnQuit(wxCommandEvent &event);
        void OnCharge(wxCommandEvent &event);
        void OnChanger(wxCommandEvent &event);
        void OnAbout(wxCommandEvent &event);
 
        DECLARE_EVENT_TABLE();
};
 
#endif // MAINFRAME_H_INCLUDED
 



Mon mainframe.cpp:

Code Cpp:

 
#include "mainframe.h"
#include "difftoolkit.h"
 
DiffToolKit DiffToolKit;
 
BEGIN_EVENT_TABLE(MainFrame,wxFrame)
    EVT_BUTTON(ID_BTN_PARCOURIR, MainFrame::OnParcourir)
    EVT_BUTTON(ID_BTN_CHARGER, MainFrame::OnCharge)
    EVT_BUTTON(ID_BTN_CHANGER, MainFrame::OnChanger)
    EVT_MENU(ID_MENU_PARCOURIR, MainFrame::OnParcourir)
    EVT_MENU(ID_MENU_QUIT, MainFrame::OnQuit)
    EVT_MENU(ID_MENU_ABOUT, MainFrame::OnAbout)
END_EVENT_TABLE()
 
MainFrame::MainFrame() : wxFrame(NULL,wxID_ANY,_T("DiffToolKit")) {
 
        SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
 
    /* Déclaration des trois cadres : le principal et le Cardre Haut et Bas */
    wxFlexGridSizer *Principal = new wxFlexGridSizer(0, 1, 0, 0);
    wxStaticBoxSizer *CadreHaut = new wxStaticBoxSizer(wxVERTICAL, this, _T("Sakexe :"));
    wxStaticBoxSizer *CadreBas = new wxStaticBoxSizer(wxVERTICAL, this, _T("Modifier le titre du sakexe :"));
 
    /* La partie pour le menu */
    menuFichier = new wxMenu;
    menuBarre = new wxMenuBar();
 
    menuFichier->Append(ID_MENU_PARCOURIR, _T("Ouvrir          "));
    menuFichier->AppendSeparator();
    menuFichier->Append(ID_MENU_QUIT, _T("Quitter         "));
    menuBarre->Append(menuFichier, _T("&Fichier"));
 
    menuFichier = new wxMenu;
    menuFichier->Append(ID_MENU_ABOUT, _T("A propos     "));
    menuBarre->Append(menuFichier, _T("&Aide"));
 
    SetMenuBar(menuBarre);
 
    /* Le cadre du haut */
    wxBoxSizer *CadreParcourir = new wxBoxSizer(wxHORIZONTAL);
    wxStaticText *TexteParcourir = new wxStaticText(this, wxID_ANY, _T("Chemin vers le Sakexe :"));
    cheminParcourir = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxSize(300, -1));
    btnParcourir = new wxButton(this, ID_BTN_PARCOURIR, _T("Parcourir"), wxDefaultPosition, wxSize(100,-1));
    btnCharger = new wxButton(this, ID_BTN_CHARGER, _T("Charger"), wxDefaultPosition, wxSize(100, -1));
 
 
    cheminParcourir->SetLabel(_T("Gloubi"));
 
    CadreParcourir->Add(TexteParcourir, 0, wxEXPAND|wxTOP|wxRIGHT, 11);
    CadreParcourir->Add(cheminParcourir, 1, wxTOP, 8);
    CadreParcourir->Add(btnParcourir, 0, wxLEFT|wxTOP, 5);
 
    CadreHaut->Add(CadreParcourir, 0, wxEXPAND|wxLEFT, 5);
    CadreHaut->Add(btnCharger, 0, wxCENTRE, 0);
 
    Principal->Add(CadreHaut, 1, wxEXPAND|wxALL, 5);
 
    /* Le cadre du bas */
    wxTextValidator validator(wxFILTER_INCLUDE_CHAR_LIST);
    wxArrayString allowed_chars;
    for (int i = 32; i < 126; i++) allowed_chars.Add(wxString::Format(_T("%c"), i));
    validator.SetIncludes(allowed_chars);
 
    wxBoxSizer *NomActuel = new wxBoxSizer(wxHORIZONTAL);
    wxStaticText *NomActuelTexte = new wxStaticText(this, wxID_ANY, _T("L'ancien nom du sakexe :"));
    NomActuelReponse = new wxStaticText(this, wxID_ANY, _T("Veuillez sélectionner un sakexe à charger."));
 
    wxBoxSizer *NouveauNom = new wxBoxSizer(wxHORIZONTAL);
    wxStaticText *NouveauNomTexte = new wxStaticText(this, wxID_ANY, _T("Le nouveau nom du sakexe :"));
    NouveauNomReponse = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxSize(300, -1), 0, validator);
    btnChanger = new wxButton(this, ID_BTN_CHANGER, _T("Changer"), wxDefaultPosition, wxSize(100, -1));
 
    NomActuel->Add(NomActuelTexte, 0, wxALL, 5);
    NomActuel->Add(NomActuelReponse, 0, wxALL, 5);
 
    NouveauNomReponse->SetMaxLength(SAKEXE_LENGHT);
 
    CadreBas->Add(NomActuel, 1, wxEXPAND);
    NouveauNom->Add(NouveauNomTexte, 0, wxTOP, 8);
    NouveauNom->Add(NouveauNomReponse, 0, wxLEFT|wxRIGHT|wxTOP, 5);
 
    CadreBas->Add(NouveauNom, 0, wxLEFT|wxBOTTOM, 5);
    btnChanger->Enable(FALSE);
    CadreBas->Add(btnChanger, 0, wxCENTRE|wxTOP, 2);
 
    Principal->Add(CadreBas, 1, wxALL|wxEXPAND, 5);
 
    SetSizer(Principal);
    Principal->SetSizeHints(this);
}
 
 
MainFrame::~MainFrame() { }
 
 
 
void MainFrame::OnParcourir(wxCommandEvent &event) {
 
    wxString nomfichier = wxFileSelector(_T("Ouvrir") , _T(""), _T(""), _T(""), _T("Sakexe (*.exe)|*.exe|All Files|*.*"), wxOPEN);
    cheminParcourir->SetValue(nomfichier);
}
 
void MainFrame::OnQuit(wxCommandEvent &event) {
 
    Close();
}
 
void MainFrame::OnCharge(wxCommandEvent &event) {
    std::string fileName;
    fileName = cheminParcourir->GetValue().mb_str();
 
    if (!DiffToolKit.setFileName(fileName)) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    if (!DiffToolKit.readPos()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    if (!DiffToolKit.readOldName()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    btnChanger->Enable(TRUE);
 
    std::string OName = DiffToolKit.getSakexeOldName();
    wxString OldName = wxString(OName.c_str(), wxConvUTF8);
    NomActuelReponse->SetLabel(OldName);
}
 
void MainFrame::OnChanger(wxCommandEvent &event) {
 
    if (NouveauNomReponse->GetValue().size() == 0) {
        wxMessageBox(_T("Veuillez rentrer un nouveau nom pour le sakexe." + NouveauNomReponse->GetValue()));
        return;
    }
 
    std::string newName;
    newName.erase();
    newName = NouveauNomReponse->GetValue().mb_str();
    DiffToolKit.setNewName(newName);
 
 
    if (!DiffToolKit.writeNewName()) {
        wxMessageBox(_T("Problème lors de l'écriture dans le sakexe."));
        return;
    }
 
    if (!DiffToolKit.readOldName()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
 
    std::string OName = DiffToolKit.getSakexeOldName();
    wxString OldName = wxString(OName.c_str(), wxConvUTF8);
    NomActuelReponse->SetLabel(OldName);
 
}
 
void MainFrame::OnAbout(wxCommandEvent &event) {
 
    wxMessageBox(_T("DiffToolKit.\nCopie interdite.\n\nAuteur : Atikae\nVersion: 0.1Beta\n\nPour me contacter : atikae@gmail.com"));
}
 


Mon difftoolkit.h:

Code Cpp:

 
#ifndef DIFFTOOLKIT_H_INCLUDED
#define DIFFTOOLKIT_H_INCLUDED
 
 
#include <wx/wx.h>
#include <string>
 
#define SAKEXE_LENGHT 22
 
 
struct sakexe {
    unsigned int pos;
    unsigned int lenght;
    std::string oldname;
    std::string newname;
    std::string fileName;
};
 
class DiffToolKit : public wxApp {
    public:
        bool OnInit();
        DiffToolKit();
        ~DiffToolKit();
        bool setFileName(std::string fileName);
        bool checkNewName(std::string name);
        bool setNewName(std::string newName);
        bool readPos();
        bool readOldName();
        bool writeNewName();
        int getSakexeLenght() const;
        int getSakexePos() const;
        std::string getSakexeOldName() const;
 
    private:
        struct sakexe sakexe;
};
 
DECLARE_APP(DiffToolKit);
 
#endif // DIFFTOOLKIT_H_INCLUDED
 


Mon difftoolkit.cpp (je vous enlèves les méthodes qui n'ont rien à voir avec wxWidget) :

Code Cpp:

 
#include "difftoolkit.h"
#include "mainframe.h"
 
#include <iostream>
#include <fstream>
#include <string>
 
 
IMPLEMENT_APP(DiffToolKit);
 
bool DiffToolKit::OnInit() {
 
    MainFrame *frame = new MainFrame();
    frame->Center();
    frame->Show();
    SetTopWindow(frame);
    return TRUE;
}
 


Voici ce que m'indique le debogueur de VS (la toute première erreur) :
http://img441.imageshack.us/img441/7424/vsrl5.jpg

Merci d'avance.
Amicalement,
Atikae.
28-11-2007 20:25:47  Re: [wxWidget]Plantage à la fermeture de l'application #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut, et bienvenue sur wxDev.fr

Le seul problème que je voie dans ton code, après une première et brève lecture, c'est la façon dont tu accèdes à ta classe d'application depuis ta frame.

D'abord, tu définis un objet nommé "DiffToolKit" de type "DiffToolKit" (même nom pour l'objet etla classe).
Ensuite, saches qu'il ne faut pas créer d'objet comme ça poru la classe d'application : la macro "IMPLEMENT_APP(.......)" s'encharge.

Comme tu as mis la macro "DECLARE_APP(DiffToolKit)" dans le header de ta classe d'application, tu peux accéder directement à celle-ci avec wxTheApp.

Donc, je résume :

1) Supprimer la déclaration de l'objet DiffToolKit, au début du fichier mainframe.cpp
2) Remplacer tous les "DiffToolKit.trucmuche(gnagnagna)" par des "wxTheApp.trucmuche(gnagnagna)".

Normalement, ça devrait déjà mieux se passer.

Tiens nous au courant.
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
28-11-2007 21:58:13  Re: [wxWidget]Plantage à la fermeture de l'application #3
Atikae (Nouveau membre)
Inscrit le : 28-11-2007
Messages: 5
Snippets: 0
Tutoriels: 0
Hors ligne
Le problème c'est que j'ai des méthodes qui sont externe à wxWdiget que j'ai mis dans mon difftoolkit.cpp
Y'a pas moyen qu'elle les prennent en compte ?
28-11-2007 22:16:56  Re: [wxWidget]Plantage à la fermeture de l'application #4
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Tel que je vois ton code, ces méthodes ne sont pas "externes à wxWidgets" :
Elles font tout simplement partie de la classe "DiffToolKit", qui est dérivée de wxApp.
Une classe wxWidgets n'est pas différente d'une classe "classique".
Comme tu utilises ta classe DiffToolKit comme classe d'application principale, tu as en plus la chance de pouvoir récupérer une référence vers l'objet utilisé par ton application

Fais l'essai, tu verras :

Code wxWidgets:

void MainFrame::OnCharge(wxCommandEvent &event) {
    std::string fileName;
    fileName = cheminParcourir->GetValue().mb_str();
 
    if (!wxTheApp.setFileName(fileName)) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    if (!wxTheApp.readPos()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    if (!wxTheApp.readOldName()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
    btnChanger->Enable(TRUE);
 
    std::string OName = wxTheApp.getSakexeOldName();
    wxString OldName = wxString(OName.c_str(), wxConvUTF8);
    NomActuelReponse->SetLabel(OldName);
}
 
void MainFrame::OnChanger(wxCommandEvent &event) {
 
    if (NouveauNomReponse->GetValue().size() == 0) {
        wxMessageBox(_T("Veuillez rentrer un nouveau nom pour le sakexe." + NouveauNomReponse->GetValue()));
        return;
    }
 
    std::string newName;
    newName.erase();
    newName = NouveauNomReponse->GetValue().mb_str();
    wxTheApp.setNewName(newName);
 
 
    if (!wxTheApp.writeNewName()) {
        wxMessageBox(_T("Problème lors de l'écriture dans le sakexe."));
        return;
    }
 
    if (!wxTheApp.readOldName()) {
        wxMessageBox(_T("Problème lors du chargement du fichier."));
        return;
    }
 
 
    std::string OName = wxTheApp.getSakexeOldName();
    wxString OldName = wxString(OName.c_str(), wxConvUTF8);
    NomActuelReponse->SetLabel(OldName);
 
}


@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» [wxWidget]Plantage à la fermeture de l'application