Grid OnGridCellChange Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
midisa
Earned some good credits
Earned some good credits
Posts: 113
Joined: Tue Jun 22, 2010 4:15 pm
Contact:

Grid OnGridCellChange

Post by midisa » Mon Jul 26, 2010 9:28 am

Хочу сделать событие при перемещении курсора по ячейкам, но это событие не обрабатывается.
Другое событие (изменение размера ширины поля) обрабатывается хорошо, а это нет.

В чем моя ошибка?

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Mon Jul 26, 2010 10:48 am

EVT_GRID_SELECT_CELL(func) The user moved to, and selected a cell. Processes a wxEVT_GRID_SELECT_CELL.
оно?

midisa
Earned some good credits
Earned some good credits
Posts: 113
Joined: Tue Jun 22, 2010 4:15 pm
Contact:

Post by midisa » Mon Jul 26, 2010 11:10 am

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, то курсор в гриде (при запуске приложения) встает как вкопанный и вообще никуда не двигается. Так и должно быть?

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Mon Jul 26, 2010 11:20 am

midisa 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, то курсор в гриде (при запуске приложения) встает как вкопанный и вообще никуда не двигается. Так и должно быть?
OnGridSelectCell
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

midisa
Earned some good credits
Earned some good credits
Posts: 113
Joined: Tue Jun 22, 2010 4:15 pm
Contact:

Post by midisa » Mon Jul 26, 2010 12:05 pm

Mojo wrote:
midisa wrote:
T-Rex wrote: оно?
Простите я не понял ваш вопрос. Я хочу считывать содержимое ячеек при перемещении курсора по ячейкам.
В wxFormBuilder указал событие OnGridSellChange, но это событие не обрабатывается. Наверное для моей потребности есть какое то другое событие? Это ошибка wxWidget или нужно указывать другое событие?

В сети искал, некоторые спрашивают тоже самое, но ответа не смог найти.

ЗЫ. Если указать событие OnGridCmdSellChange, то курсор в гриде (при запуске приложения) встает как вкопанный и вообще никуда не двигается. Так и должно быть?
OnGridSelectCell
Если использовать это событие то постоянно выбрана 1 ячейка. нет возможности переместиться на другую ячейку.
в чем моя ошибка?

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Mon Jul 26, 2010 12:47 pm

midisa wrote:
Mojo wrote:
midisa wrote: Простите я не понял ваш вопрос. Я хочу считывать содержимое ячеек при перемещении курсора по ячейкам.
В wxFormBuilder указал событие OnGridSellChange, но это событие не обрабатывается. Наверное для моей потребности есть какое то другое событие? Это ошибка wxWidget или нужно указывать другое событие?

В сети искал, некоторые спрашивают тоже самое, но ответа не смог найти.

ЗЫ. Если указать событие OnGridCmdSellChange, то курсор в гриде (при запуске приложения) встает как вкопанный и вообще никуда не двигается. Так и должно быть?
OnGridSelectCell
Если использовать это событие то постоянно выбрана 1 ячейка. нет возможности переместиться на другую ячейку.
в чем моя ошибка?
Повидимому, проблема не в этом событии, а в чем то еще, потому, что у меня это событие работает как надо.

Скорее всего где-то ошибка в коде.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0

midisa
Earned some good credits
Earned some good credits
Posts: 113
Joined: Tue Jun 22, 2010 4:15 pm
Contact:

Post by midisa » Mon Jul 26, 2010 1:35 pm

Я прикрепил полностью проект. Сами посмотрите. Пробовал добиться результата в различных вариациях, хотя допускаю, что мог что то упустить.

Как я думаю (из моего опыта), нужно использовать событие wxEVT_GRID_CELL_CHANGE т.к. только оно позволяет получать значение ячеек при любом перемещении мышкой или с клавиатуры.

Но это событие не обрабатывается. В функцию даже не заходит. Не могу понять почему.
Attachments
pass.tar.gz
(353.87 KiB) Downloaded 116 times
Last edited by midisa on Mon Jul 26, 2010 1:40 pm, edited 1 time in total.

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Mon Jul 26, 2010 1:36 pm

Лень смотреть проект, мне проще мой код который работает кинуть сюда.

Скорее всего проблема в том, что в обработчике нужно добавить 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

midisa
Earned some good credits
Earned some good credits
Posts: 113
Joined: Tue Jun 22, 2010 4:15 pm
Contact:

Post by midisa » Mon Jul 26, 2010 2:14 pm

сори! я протупил! событие wxEVT_GRID_CELL_CHANGE работает нормально! Это событие на изменение данных в ячейке!

Я понял вашу мысль! Все зашибись работает! Вот только еще один вопрос:

- Чем отличается событие OnGridCmdSelectCell от OnGridSelectCell
Зачем добавляют буквы ...Cmd... чего то сообразить не могу.

Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo » Mon Jul 26, 2010 3:02 pm

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

Post Reply