Grid OnGridCellChange Topic is solved
Grid OnGridCellChange
Хочу сделать событие при перемещении курсора по ячейкам, но это событие не обрабатывается.
Другое событие (изменение размера ширины поля) обрабатывается хорошо, а это нет.
В чем моя ошибка?
Другое событие (изменение размера ширины поля) обрабатывается хорошо, а это нет.
В чем моя ошибка?
Простите я не понял ваш вопрос. Я хочу считывать содержимое ячеек при перемещении курсора по ячейкам.T-Rex wrote:оно?EVT_GRID_SELECT_CELL(func) The user moved to, and selected a cell. Processes a wxEVT_GRID_SELECT_CELL.
В wxFormBuilder указал событие OnGridSellChange, но это событие не обрабатывается. Наверное для моей потребности есть какое то другое событие? Это ошибка wxWidget или нужно указывать другое событие?
В сети искал, некоторые спрашивают тоже самое, но ответа не смог найти.
ЗЫ. Если указать событие OnGridCmdSellChange, то курсор в гриде (при запуске приложения) встает как вкопанный и вообще никуда не двигается. Так и должно быть?
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
OnGridSelectCellmidisa wrote:Простите я не понял ваш вопрос. Я хочу считывать содержимое ячеек при перемещении курсора по ячейкам.T-Rex wrote:оно?EVT_GRID_SELECT_CELL(func) The user moved to, and selected a cell. Processes a wxEVT_GRID_SELECT_CELL.
В wxFormBuilder указал событие OnGridSellChange, но это событие не обрабатывается. Наверное для моей потребности есть какое то другое событие? Это ошибка wxWidget или нужно указывать другое событие?
В сети искал, некоторые спрашивают тоже самое, но ответа не смог найти.
ЗЫ. Если указать событие OnGridCmdSellChange, то курсор в гриде (при запуске приложения) встает как вкопанный и вообще никуда не двигается. Так и должно быть?
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Если использовать это событие то постоянно выбрана 1 ячейка. нет возможности переместиться на другую ячейку.Mojo wrote:OnGridSelectCellmidisa wrote:Простите я не понял ваш вопрос. Я хочу считывать содержимое ячеек при перемещении курсора по ячейкам.T-Rex wrote: оно?
В wxFormBuilder указал событие OnGridSellChange, но это событие не обрабатывается. Наверное для моей потребности есть какое то другое событие? Это ошибка wxWidget или нужно указывать другое событие?
В сети искал, некоторые спрашивают тоже самое, но ответа не смог найти.
ЗЫ. Если указать событие OnGridCmdSellChange, то курсор в гриде (при запуске приложения) встает как вкопанный и вообще никуда не двигается. Так и должно быть?
в чем моя ошибка?
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Повидимому, проблема не в этом событии, а в чем то еще, потому, что у меня это событие работает как надо.midisa wrote:Если использовать это событие то постоянно выбрана 1 ячейка. нет возможности переместиться на другую ячейку.Mojo wrote:OnGridSelectCellmidisa wrote: Простите я не понял ваш вопрос. Я хочу считывать содержимое ячеек при перемещении курсора по ячейкам.
В wxFormBuilder указал событие OnGridSellChange, но это событие не обрабатывается. Наверное для моей потребности есть какое то другое событие? Это ошибка wxWidget или нужно указывать другое событие?
В сети искал, некоторые спрашивают тоже самое, но ответа не смог найти.
ЗЫ. Если указать событие OnGridCmdSellChange, то курсор в гриде (при запуске приложения) встает как вкопанный и вообще никуда не двигается. Так и должно быть?
в чем моя ошибка?
Скорее всего где-то ошибка в коде.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Я прикрепил полностью проект. Сами посмотрите. Пробовал добиться результата в различных вариациях, хотя допускаю, что мог что то упустить.
Как я думаю (из моего опыта), нужно использовать событие wxEVT_GRID_CELL_CHANGE т.к. только оно позволяет получать значение ячеек при любом перемещении мышкой или с клавиатуры.
Но это событие не обрабатывается. В функцию даже не заходит. Не могу понять почему.
Как я думаю (из моего опыта), нужно использовать событие wxEVT_GRID_CELL_CHANGE т.к. только оно позволяет получать значение ячеек при любом перемещении мышкой или с клавиатуры.
Но это событие не обрабатывается. В функцию даже не заходит. Не могу понять почему.
- Attachments
-
- pass.tar.gz
- (353.87 KiB) Downloaded 178 times
Last edited by midisa on Mon Jul 26, 2010 1:40 pm, edited 1 time in total.
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Лень смотреть проект, мне проще мой код который работает кинуть сюда.
Скорее всего проблема в том, что в обработчике нужно добавить event.Skip();
Скорее всего проблема в том, что в обработчике нужно добавить event.Skip();
Code: Select all
/*********************************************************************
* Name: main.cpp
* Purpose: Implements simple wxWidgets application with GUI
* created using wxFormBuilder.
* Author:
* Created:
* Copyright:
* License: wxWidgets license (www.wxwidgets.org)
*
* Notes: Note that all GUI creation code is implemented in
* gui.cpp source file which is generated by wxFormBuilder.
*********************************************************************/
#include "main.h"
// initialize the application
IMPLEMENT_APP(MainApp);
////////////////////////////////////////////////////////////////////////////////
// application class implementation
////////////////////////////////////////////////////////////////////////////////
bool MainApp::OnInit()
{
SetTopWindow( new MainFrame( NULL ) );
GetTopWindow()->Show();
// true = enter the main loop
return true;
}
////////////////////////////////////////////////////////////////////////////////
// main application frame implementation
////////////////////////////////////////////////////////////////////////////////
MainFrame::MainFrame(wxWindow *parent) : MainFrameBase( parent )
{
}
MainFrame::~MainFrame()
{
}
void MainFrame::OnCloseFrame(wxCloseEvent& event)
{
Destroy();
}
void MainFrame::OnExitClick(wxCommandEvent& event)
{
Destroy();
}
void MainFrame::OnMyGridCellLeftClick( wxGridEvent& event )
{
row = event.GetRow();
col = event.GetCol();
wxString results = wxString::Format(wxT("Ряд: %i, Колонка: %i"), row, col);
m_statusBar->SetStatusText(results);
event.Skip();
}
void MainFrame::OnMyGridSelectCell( wxGridEvent& event )
{
row = event.GetRow();
col = event.GetCol();
wxString results = wxString::Format(wxT("Ряд: %i, Колонка: %i"), row, col);
m_statusBar->SetStatusText(results);
event.Skip();
}
Code: Select all
/*********************************************************************
* Name: main.h
* Purpose: Declares simple wxWidgets application with GUI
* created using wxFormBuilder.
* Author:
* Created:
* Copyright:
* License: wxWidgets license (www.wxwidgets.org)
*
* Notes: Note that all GUI creation code is declared in
* gui.h source file which is generated by wxFormBuilder.
*********************************************************************/
#ifndef __main__
#define __main__
// main wxWidgets header file
#include <wx/wx.h>
// gui classes generated by wxFormBuilder
#include "gui.h"
////////////////////////////////////////////////////////////////////////////////
// application class declaration
////////////////////////////////////////////////////////////////////////////////
class MainApp : public wxApp
{
public:
virtual bool OnInit();
};
// declare global static function wxGetApp()
DECLARE_APP(MainApp)
////////////////////////////////////////////////////////////////////////////////
// main application frame declaration
////////////////////////////////////////////////////////////////////////////////
class MainFrame : public MainFrameBase
{
public:
MainFrame( wxWindow *parent );
virtual ~MainFrame();
int row;
int col;
protected:
// protected event handlers
virtual void OnCloseFrame( wxCloseEvent& event );
virtual void OnExitClick( wxCommandEvent& event );
virtual void OnMyGridCellLeftClick( wxGridEvent& event );
virtual void OnMyGridSelectCell( wxGridEvent& event ) ;
};
#endif //__main__
Code: Select all
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Dec 21 2009)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __gui__
#define __gui__
#include <wx/intl.h>
#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/grid.h>
#include <wx/sizer.h>
#include <wx/statusbr.h>
#include <wx/frame.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class MainFrameBase
///////////////////////////////////////////////////////////////////////////////
class MainFrameBase : public wxFrame
{
private:
protected:
wxMenuBar* m_menuBar;
wxMenu* m_menuFile;
wxGrid* m_grid1;
wxStatusBar* m_statusBar;
// Virtual event handlers, overide them in your derived class
virtual void OnCloseFrame( wxCloseEvent& event ) { event.Skip(); }
virtual void OnExitClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnMyGridCellLeftClick( wxGridEvent& event ) { event.Skip(); }
virtual void OnMyGridSelectCell( wxGridEvent& event ) { event.Skip(); }
public:
MainFrameBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("wxMiniApp"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,300 ), long style = wxCLOSE_BOX|wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
~MainFrameBase();
};
#endif //__gui__
Code: Select all
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Dec 21 2009)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "gui.h"
///////////////////////////////////////////////////////////////////////////
MainFrameBase::MainFrameBase( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
m_menuBar = new wxMenuBar( 0 );
m_menuFile = new wxMenu();
wxMenuItem* menuFileExit;
menuFileExit = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ) + wxT('\t') + wxT("Alt+X"), wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( menuFileExit );
m_menuBar->Append( m_menuFile, _("&File") );
this->SetMenuBar( m_menuBar );
wxBoxSizer* mainSizer;
mainSizer = new wxBoxSizer( wxVERTICAL );
m_grid1 = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
// Grid
m_grid1->CreateGrid( 5, 5 );
m_grid1->EnableEditing( true );
m_grid1->EnableGridLines( true );
m_grid1->EnableDragGridSize( false );
m_grid1->SetMargins( 0, 0 );
// Columns
m_grid1->EnableDragColMove( false );
m_grid1->EnableDragColSize( true );
m_grid1->SetColLabelSize( 30 );
m_grid1->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Rows
m_grid1->EnableDragRowSize( true );
m_grid1->SetRowLabelSize( 80 );
m_grid1->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Label Appearance
// Cell Defaults
m_grid1->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
mainSizer->Add( m_grid1, 1, wxEXPAND, 5 );
this->SetSizer( mainSizer );
this->Layout();
m_statusBar = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );
this->Centre( wxBOTH );
// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) );
this->Connect( menuFileExit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) );
m_grid1->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( MainFrameBase::OnMyGridCellLeftClick ), NULL, this );
m_grid1->Connect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( MainFrameBase::OnMyGridSelectCell ), NULL, this );
}
MainFrameBase::~MainFrameBase()
{
// Disconnect Events
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) );
m_grid1->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( MainFrameBase::OnMyGridCellLeftClick ), NULL, this );
m_grid1->Disconnect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( MainFrameBase::OnMyGridSelectCell ), NULL, this );
}
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
сори! я протупил! событие wxEVT_GRID_CELL_CHANGE работает нормально! Это событие на изменение данных в ячейке!
Я понял вашу мысль! Все зашибись работает! Вот только еще один вопрос:
- Чем отличается событие OnGridCmdSelectCell от OnGridSelectCell
Зачем добавляют буквы ...Cmd... чего то сообразить не могу.
Я понял вашу мысль! Все зашибись работает! Вот только еще один вопрос:
- Чем отличается событие OnGridCmdSelectCell от OnGridSelectCell
Зачем добавляют буквы ...Cmd... чего то сообразить не могу.
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Ну судя по документам...midisa wrote:сори! я протупил! событие wxEVT_GRID_CELL_CHANGE работает нормально! Это событие на изменение данных в ячейке!
Я понял вашу мысль! Все зашибись работает! Вот только еще один вопрос:
- Чем отличается событие OnGridCmdSelectCell от OnGridSelectCell
Зачем добавляют буквы ...Cmd... чего то сообразить не могу.
http://docs.wxwidgets.org/2.8.11/wx_wxgridevent.html
The ..._CMD_... variants also take a window identifier.
то бишь, обработчик событий помимо функции еще принимает и идентификатор окна....
а в функции соответственно Cmd добавляется для удобства, что бы можно было понять, что в обработчике и идентификатор окна есть....
Вроде так ...
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0