[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