[C con Clase] [Bulk] Re: [Bulk] problema con puntero utilizando wxwidgets!

ZeLion Zelion_cracking en yahoo.es
Mie Ene 2 14:22:37 CET 2008


Hola Pedro.

El tema de eventos hay veces que da quebraderos de cabeza, jejeje.

 

Bien la historia esta en que en el codigo donde obtienesel evento:


void form::keypress(wxKeyEvent& x)

{
        if(x.GetKeyCode()==13)

      {
            buscar->SetFocus();  // EXACTAMENTE AQUI
            return;
        }
        x.Skip();
    }

 

Realmente si tu pones:

wxString aa = this->GetName();

Veras que el objeto dueño del evento es el datagrid y no el form, con lo que
aunque el compilador no te da un error por que es una funcion callback y no
se entera, realmente no se puede hacer;

 

This->buscar->SetFocus(); 

 

Ya que ‘buscar’ no forma parte del datagrid.

Cuando trabajes con eventos intenta buscar los controles por sus nombres en
la ventana padre, ya que son funciones CallBack y puede que el puntero
‘this’ no apunte al objeto que creas, para evitar estos errores puedes
realizar lo siguiente:

 

 

void form::keypress(wxKeyEvent& x)

{

        if(x.GetKeyCode()==13)

  {

                  wxString aa = this->GetName();     // Obtener el nombre
del objeto dueño del evento "GRID" para comprobar quien es ‘this’

                  wxWindow *bb = this->GetParent()->FindWindow(_T("text"));
// Buscar el control que quieres dar el foco

                  bb->SetFocus();
// Poner el foco en el control

                  return;

        }

        x.Skip();

    }

}

 

De todas formas, en el codigo existen varios errores, como pasar de
std::string a wxString sin hacer conversión, y yo tambien me acostumbraria a
usar la macro “_T()” para poner cadenas en unicode, ya que te evitaras
problemas en el futuro, para ello en la version 2.8 debes compilar en debug
Unicode.

Bueno todo esto ultimo es opcional, dependiendo de la version de WxWidgets
que uses.

 

Espero haberte servido de ayuda, de todas formas indagare mas en el codigo
cuando tenga un poco de tiempo, ya que solo pasa eso con el control
wxTextCtrl, y eso me mosquea.

 

Un saludo.

 

.: ZeLion :.

  _____  

De: cconclase-bounces en listas.conclase.net
[mailto:cconclase-bounces en listas.conclase.net] En nombre de Pedro Mateo
Enviado el: lunes, 31 de diciembre de 2007 16:04
Para: Lista de correo sobre C y C++
Asunto: [Bulk] Re: [C con Clase] [Bulk] problema con puntero utilizando
wxwidgets!

 

gracias zelion!!!
prepare un codigo ejemplo donde me dal el problema
si cambias el puntero "buscar" poniendolo en un ambito publico( antecediendo
a la definicion de la clase) no te dara el error
es realmenter raro 

//=================================================================
#include <wx/wx.h>
#include <wx/grid.h>
using namespace std;
class frame:public wxFrame{
    public:
    frame(wxWindow* p,const string& t):wxFrame(p,-1,t){Centre();} 
};
frame* mainframe;            

class form:public wxDialog{
    

    protected:                                                        //
PROPIEDADES
    friend class textbox;                                        //
acceso a la clase textbox 
    friend class button;                                            //
acceso a la clase button
    wxBoxSizer* layout;                                            //
sizer principal
    wxBoxSizer* page;                                                //
sizer de contenido 
    wxBoxSizer* header;                                            //
sizer cabecera
    wxBoxSizer* body;                                                //
sizer del cuerpo del formulario
    wxBoxSizer* footer;                                            //
sizer de pie de pagina 
    wxGrid* grid;                                                    //
contiene el grid de la ventana
    wxButton* acept;                                                //
boton de aceptar
    wxButton* cancel;                                                //
cancelar 
    wxButton* find;                                                // buscar

    wxTextCtrl* buscar;                                            // el
puntero fantasma

                                                                    //
EVENTOS 
    void acept_procs(wxMouseEvent&);                        //    ocurre
cuando se preciona el boton de aceptar
    void cancel_procs(wxMouseEvent&);                    //    ocurre cuando
se preciona el boton de cancelar 
    void find_procs(wxMouseEvent&);                        //    ocurre
cuando se preciona el boton de buscar
    void keypress(wxKeyEvent&);                            //    ocurre
cuando se preciona el boton de buscar 
    
    public:                                                            //
CONSTRUCTORES
    form(const string&);                                            //
constructor sobrecargado
    void resize();                                                    //
recalcula el tamano de la ventana 
    void refresh();                                                //
actualiza los objetos con la data
};

//    constructor sobrecargado            
    form::form(const string& caption):wxDialog(mainframe,-1,caption){ 
        //    objetos principales
        new wxPanel(this);        
        layout    =    new wxBoxSizer(wxHORIZONTAL);
        SetSizer(layout);

        //    enmarcando la pagina
        layout->Add(15,0,0,wxEXPAND); 
        layout->Add(page    = new wxBoxSizer(wxVERTICAL),0,wxEXPAND);
        layout->Add(15,0,0,wxEXPAND);
        
        page->Add(header    = new wxBoxSizer(wxHORIZONTAL),0,wxEXPAND);
        page->Add(body        = new wxBoxSizer(wxVERTICAL),0,wxEXPAND); 
        page->Add(footer    = new wxBoxSizer(wxHORIZONTAL),0,wxEXPAND);
        
        //    configurando marge
        header->Add(0,15);
        footer->Add(0,15);

        
        //    carga los parametros 
        header->Add(5,35);
        wxBoxSizer* parameters_panel;
        header->Add(parameters_panel=new wxBoxSizer(4),wxEXPAND);
        buscar=new wxTextCtrl(this,-1);
        parameters_panel->Add(buscar,wxEXPAND); 
        buscar->SetFocus();
        buscar->SetValue("esta es la cajita fantasma....presiona enter por
favor!");
        header->Add(find=new wxButton(this,wxID_FIND));
        find->SetDefault(); 
            
        //    cargando el grid
        body->Add(grid=new
wxGrid(this,-1,wxDefaultPosition,wxSize(700,600)));
        grid->Connect(wxEVT_KEY_DOWN,wxKeyEventHandler(form::keypress));
        grid->CreateGrid(5,6); 

        //    cargando botones
        footer->Add(1,1,1,wxEXPAND);
        footer->Add(acept=new wxButton(this,wxID_OK));
        footer->Add(cancel=new wxButton(this,wxID_CANCEL));
        Connect(wxID_OK
,wxEVT_COMMAND_BUTTON_CLICKED,wxMouseEventHandler(form::acept_procs)); 
        Connect(wxID_CANCEL
,wxEVT_COMMAND_BUTTON_CLICKED,wxMouseEventHandler(form::cancel_procs));
        Connect(wxID_FIND
,wxEVT_COMMAND_BUTTON_CLICKED,wxMouseEventHandler(form::find_procs));


        resize(); 
        Centre();
        


    }

//    recalcula el tamano de la ventana    
    void form::resize(){
        layout->SetSizeHints(this);
    }



//    ATENCION ATENCION     ATENCION ATENCION     ATENCION ATENCION 
//    AQUI ES DONDE DA EL ERROR
    void form::keypress(wxKeyEvent& x){
        if(x.GetKeyCode()==27){
            buscar->SetFocus();  // EXACTAMENTE AQUI
            return;
        }
        x.Skip();
    }


//    ocurre cuando se preciona el boton de aceptar    
    void form::acept_procs(wxMouseEvent& x){
        EndModal(123);
    }
//    ocurre cuando se preciona el boton de cancelar

    void form::cancel_procs(wxMouseEvent&){
        EndModal(-1);
    }                    
//    ocurre cuando se preciona el boton de cancelar

    void form::find_procs(wxMouseEvent&){ 
        wxMessageBox("voy primero a poner un texto en la cajita de busqueda
asi te das cuenta de que el puntero buscar funciona");
        buscar->SetValue("confirmado!!..el puntero funciona"); 
        wxMessageBox("ejecuto un programa que busca la informacion y le doy
el enfoque al grid para seleccionar el registro que desee");
        grid->SetCellValue(0, 0, "ahora es el momento de la
verdad!!...presiona escape para que de el error"); 
        grid->AutoSizeColumns();
        grid->SetFocus();        
    }


class app:public wxApp{
    bool OnInit(){
        mainframe=new frame(NULL,"fradfasd");
        mainframe->Show(); 
        form* test=new form("prueba del problema");
        test->ShowModal();        
    }
};
IMPLEMENT_APP(app)
//=================================================================
//=================================================================
//  fin del programa

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080102/48bb4fd6/attachment.html>


Más información sobre la lista de distribución Cconclase